[{"data":1,"prerenderedAt":2286},["ShallowReactive",2],{"lang-switch-post-\u002Fplaylists\u002Fpattern-recognition\u002Fnormal-equation":3,"post-pt-pattern-recognition-normal-equation":4},"\u002Fen\u002Fplaylists\u002Fpattern-recognition\u002Fnormal-equation",{"id":5,"title":6,"body":7,"cover":2272,"date":2273,"description":2274,"extension":2275,"meta":2276,"navigation":1676,"order":1237,"path":2277,"playlist":2278,"seo":2279,"status":2280,"stem":2281,"tags":2282,"__hash__":2285},"posts\u002Fpt\u002Fplaylists\u002Fpattern-recognition\u002Fnormal-equation.md","Equação Normal: Resolvendo Regressão numa Conta Só",{"type":8,"value":9,"toc":2261},"minimark",[10,19,24,27,35,601,608,866,873,877,1212,1219,1241,1264,1268,1279,1356,1372,1379,1638,1695,1772,1776,1783,1822,1835,1841,1845,1852,1956,1959,1997,2002,2006,2207,2211,2223,2242,2250,2257],[11,12,13,18],"p",{},[14,15,17],"a",{"href":16},"\u002Fplaylists\u002Fpattern-recognition\u002Flinear-regression-estimator","No post anterior"," eu deixei um gancho: dá pra resolver regressão linear numa conta só, sem ficar iterando gradiente. É exatamente isso que as aulas 2b e 2c mostram, e de quebra o professor compara o resultado contra mais cinco tipos de regressor diferentes.",[20,21,23],"h2",{"id":22},"zerando-a-derivada-em-vez-de-andar-até-ela","Zerando a derivada em vez de andar até ela",[11,25,26],{},"O gradiente descendente funciona porque, a cada passo, ele anda um pouquinho na direção que reduz o erro. Mas pra regressão linear, a função de erro (a soma dos quadrados que eu já vinha usando) tem uma propriedade especial: ela é uma parábola em relação aos pesos, uma tigela lisa sem vales falsos. E uma tigela lisa tem um único ponto onde a derivada é exatamente zero, o fundo dela. Em vez de caminhar até lá passo a passo, dá pra calcular esse ponto direto.",[11,28,29,30,34],{},"O Bishop escreve o modelo linear numa forma mais geral que a minha, com uma matriz Φ (a ",[31,32,33],"strong",{},"matriz de design",", cada linha é um paciente, cada coluna uma variável de entrada, mais uma coluna de 1's pro termo de bias). A função de erro é",[11,36,37],{},[38,39,42,158],"span",{"className":40},[41],"katex",[38,43,46],{"className":44},[45],"katex-mathml",[47,48,50],"math",{"xmlns":49},"http:\u002F\u002Fwww.w3.org\u002F1998\u002FMath\u002FMathML",[51,52,53,153],"semantics",{},[54,55,56,66,71,75,78,81,91,109,112,119,122,131,135,137,144,146],"mrow",{},[57,58,59,63],"msub",{},[60,61,62],"mi",{},"E",[60,64,65],{},"D",[67,68,70],"mo",{"stretchy":69},"false","(",[60,72,74],{"mathvariant":73},"bold","w",[67,76,77],{"stretchy":69},")",[67,79,80],{},"=",[82,83,84,88],"mfrac",{},[85,86,87],"mn",{},"1",[85,89,90],{},"2",[92,93,94,97,106],"msubsup",{},[67,95,96],{},"∑",[54,98,99,102,104],{},[60,100,101],{},"n",[67,103,80],{},[85,105,87],{},[60,107,108],{},"N",[67,110,111],{"stretchy":69},"{",[57,113,114,117],{},[60,115,116],{},"t",[60,118,101],{},[67,120,121],{},"−",[123,124,125,127],"msup",{},[60,126,74],{"mathvariant":73},[60,128,130],{"mathvariant":129},"sans-serif","T",[60,132,134],{"mathvariant":133},"bold-italic","ϕ",[67,136,70],{"stretchy":69},[57,138,139,142],{},[60,140,141],{"mathvariant":73},"x",[60,143,101],{},[67,145,77],{"stretchy":69},[123,147,148,151],{},[67,149,150],{"stretchy":69},"}",[85,152,90],{},[154,155,157],"annotation",{"encoding":156},"application\u002Fx-tex","E_D(\\mathbf{w}) = \\frac{1}{2}\\sum_{n=1}^{N}\\{t_n - \\mathbf{w}^{\\mathsf{T}}\\boldsymbol{\\phi}(\\mathbf{x}_n)\\}^2",[38,159,163,257,473],{"className":160,"ariaHidden":162},[161],"katex-html","true",[38,164,167,172,232,236,241,245,250,254],{"className":165},[166],"base",[38,168],{"className":169,"style":171},[170],"strut","height:1em;vertical-align:-0.25em;",[38,173,176,181],{"className":174},[175],"mord",[38,177,62],{"className":178,"style":180},[175,179],"mathnormal","margin-right:0.0576em;",[38,182,185],{"className":183},[184],"msupsub",[38,186,190,223],{"className":187},[188,189],"vlist-t","vlist-t2",[38,191,194,218],{"className":192},[193],"vlist-r",[38,195,199],{"className":196,"style":198},[197],"vlist","height:0.3283em;",[38,200,202,207],{"style":201},"top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;",[38,203],{"className":204,"style":206},[205],"pstrut","height:2.7em;",[38,208,214],{"className":209},[210,211,212,213],"sizing","reset-size6","size3","mtight",[38,215,65],{"className":216,"style":217},[175,179,213],"margin-right:0.0278em;",[38,219,222],{"className":220},[221],"vlist-s","​",[38,224,226],{"className":225},[193],[38,227,230],{"className":228,"style":229},[197],"height:0.15em;",[38,231],{},[38,233,70],{"className":234},[235],"mopen",[38,237,74],{"className":238,"style":240},[175,239],"mathbf","margin-right:0.016em;",[38,242,77],{"className":243},[244],"mclose",[38,246],{"className":247,"style":249},[248],"mspace","margin-right:0.2778em;",[38,251,80],{"className":252},[253],"mrel",[38,255],{"className":256,"style":249},[248],[38,258,260,264,341,345,417,420,462,466,470],{"className":259},[166],[38,261],{"className":262,"style":263},[170],"height:1.3262em;vertical-align:-0.345em;",[38,265,267,271,338],{"className":266},[175],[38,268],{"className":269},[235,270],"nulldelimiter",[38,272,274],{"className":273},[82],[38,275,277,329],{"className":276},[188,189],[38,278,280,326],{"className":279},[193],[38,281,284,300,311],{"className":282,"style":283},[197],"height:0.8451em;",[38,285,287,291],{"style":286},"top:-2.655em;",[38,288],{"className":289,"style":290},[205],"height:3em;",[38,292,294],{"className":293},[210,211,212,213],[38,295,297],{"className":296},[175,213],[38,298,90],{"className":299},[175,213],[38,301,303,306],{"style":302},"top:-3.23em;",[38,304],{"className":305,"style":290},[205],[38,307],{"className":308,"style":310},[309],"frac-line","border-bottom-width:0.04em;",[38,312,314,317],{"style":313},"top:-3.394em;",[38,315],{"className":316,"style":290},[205],[38,318,320],{"className":319},[210,211,212,213],[38,321,323],{"className":322},[175,213],[38,324,87],{"className":325},[175,213],[38,327,222],{"className":328},[221],[38,330,332],{"className":331},[193],[38,333,336],{"className":334,"style":335},[197],"height:0.345em;",[38,337],{},[38,339],{"className":340},[244,270],[38,342],{"className":343,"style":344},[248],"margin-right:0.1667em;",[38,346,349,355],{"className":347},[348],"mop",[38,350,96],{"className":351,"style":354},[348,352,353],"op-symbol","small-op","position:relative;top:0em;",[38,356,358],{"className":357},[184],[38,359,361,408],{"className":360},[188,189],[38,362,364,405],{"className":363},[193],[38,365,368,389],{"className":366,"style":367},[197],"height:0.9812em;",[38,369,371,374],{"style":370},"top:-2.4003em;margin-left:0em;margin-right:0.05em;",[38,372],{"className":373,"style":206},[205],[38,375,377],{"className":376},[210,211,212,213],[38,378,380,383,386],{"className":379},[175,213],[38,381,101],{"className":382},[175,179,213],[38,384,80],{"className":385},[253,213],[38,387,87],{"className":388},[175,213],[38,390,392,395],{"style":391},"top:-3.2029em;margin-right:0.05em;",[38,393],{"className":394,"style":206},[205],[38,396,398],{"className":397},[210,211,212,213],[38,399,401],{"className":400},[175,213],[38,402,108],{"className":403,"style":404},[175,179,213],"margin-right:0.109em;",[38,406,222],{"className":407},[221],[38,409,411],{"className":410},[193],[38,412,415],{"className":413,"style":414},[197],"height:0.2997em;",[38,416],{},[38,418,111],{"className":419},[235],[38,421,423,426],{"className":422},[175],[38,424,116],{"className":425},[175,179],[38,427,429],{"className":428},[184],[38,430,432,454],{"className":431},[188,189],[38,433,435,451],{"className":434},[193],[38,436,439],{"className":437,"style":438},[197],"height:0.1514em;",[38,440,442,445],{"style":441},"top:-2.55em;margin-left:0em;margin-right:0.05em;",[38,443],{"className":444,"style":206},[205],[38,446,448],{"className":447},[210,211,212,213],[38,449,101],{"className":450},[175,179,213],[38,452,222],{"className":453},[221],[38,455,457],{"className":456},[193],[38,458,460],{"className":459,"style":229},[197],[38,461],{},[38,463],{"className":464,"style":465},[248],"margin-right:0.2222em;",[38,467,121],{"className":468},[469],"mbin",[38,471],{"className":472,"style":465},[248],[38,474,476,480,515,525,528,568,571],{"className":475},[166],[38,477],{"className":478,"style":479},[170],"height:1.0991em;vertical-align:-0.25em;",[38,481,483,486],{"className":482},[175],[38,484,74],{"className":485,"style":240},[175,239],[38,487,489],{"className":488},[184],[38,490,492],{"className":491},[188],[38,493,495],{"className":494},[193],[38,496,499],{"className":497,"style":498},[197],"height:0.8491em;",[38,500,502,505],{"style":501},"top:-3.063em;margin-right:0.05em;",[38,503],{"className":504,"style":206},[205],[38,506,508],{"className":507},[210,211,212,213],[38,509,511],{"className":510},[175,213],[38,512,130],{"className":513},[175,514,213],"mathsf",[38,516,518],{"className":517},[175],[38,519,521],{"className":520},[175],[38,522,134],{"className":523},[175,524],"boldsymbol",[38,526,70],{"className":527},[235],[38,529,531,534],{"className":530},[175],[38,532,141],{"className":533},[175,239],[38,535,537],{"className":536},[184],[38,538,540,560],{"className":539},[188,189],[38,541,543,557],{"className":542},[193],[38,544,546],{"className":545,"style":438},[197],[38,547,548,551],{"style":441},[38,549],{"className":550,"style":206},[205],[38,552,554],{"className":553},[210,211,212,213],[38,555,101],{"className":556},[175,179,213],[38,558,222],{"className":559},[221],[38,561,563],{"className":562},[193],[38,564,566],{"className":565,"style":229},[197],[38,567],{},[38,569,77],{"className":570},[244],[38,572,574,577],{"className":573},[244],[38,575,150],{"className":576},[244],[38,578,580],{"className":579},[184],[38,581,583],{"className":582},[188],[38,584,586],{"className":585},[193],[38,587,590],{"className":588,"style":589},[197],"height:0.8141em;",[38,591,592,595],{"style":501},[38,593],{"className":594,"style":206},[205],[38,596,598],{"className":597},[210,211,212,213],[38,599,90],{"className":600},[175,213],[11,602,603,604,607],{},"Igualando o gradiente dessa conta a zero e isolando ",[605,606,74],"code",{},", sobra",[11,609,610],{},[38,611,613,664],{"className":612},[41],[38,614,616],{"className":615},[45],[47,617,618],{"xmlns":49},[51,619,620,661],{},[54,621,622,630,632,634,641,643,653,659],{},[57,623,624,626],{},[60,625,74],{"mathvariant":73},[627,628,629],"mtext",{},"ML",[67,631,80],{},[67,633,70],{"stretchy":69},[123,635,636,639],{},[60,637,638],{"mathvariant":73},"Φ",[60,640,130],{"mathvariant":129},[60,642,638],{"mathvariant":73},[123,644,645,647],{},[67,646,77],{"stretchy":69},[54,648,649,651],{},[67,650,121],{},[85,652,87],{},[123,654,655,657],{},[60,656,638],{"mathvariant":73},[60,658,130],{"mathvariant":129},[60,660,116],{"mathvariant":73},[154,662,663],{"encoding":156},"\\mathbf{w}_{\\text{ML}} = (\\boldsymbol{\\Phi}^{\\mathsf{T}}\\boldsymbol{\\Phi})^{-1}\\boldsymbol{\\Phi}^{\\mathsf{T}}\\mathbf{t}",[38,665,667,731],{"className":666,"ariaHidden":162},[161],[38,668,670,674,722,725,728],{"className":669},[166],[38,671],{"className":672,"style":673},[170],"height:0.5944em;vertical-align:-0.15em;",[38,675,677,680],{"className":676},[175],[38,678,74],{"className":679,"style":240},[175,239],[38,681,683],{"className":682},[184],[38,684,686,714],{"className":685},[188,189],[38,687,689,711],{"className":688},[193],[38,690,692],{"className":691,"style":198},[197],[38,693,695,698],{"style":694},"top:-2.55em;margin-left:-0.016em;margin-right:0.05em;",[38,696],{"className":697,"style":206},[205],[38,699,701],{"className":700},[210,211,212,213],[38,702,704],{"className":703},[175,213],[38,705,708],{"className":706},[175,707,213],"text",[38,709,629],{"className":710},[175,213],[38,712,222],{"className":713},[221],[38,715,717],{"className":716},[193],[38,718,720],{"className":719,"style":229},[197],[38,721],{},[38,723],{"className":724,"style":249},[248],[38,726,80],{"className":727},[253],[38,729],{"className":730,"style":249},[248],[38,732,734,738,741,781,790,825,863],{"className":733},[166],[38,735],{"className":736,"style":737},[170],"height:1.1751em;vertical-align:-0.25em;",[38,739,70],{"className":740},[235],[38,742,744,753],{"className":743},[175],[38,745,747],{"className":746},[175],[38,748,750],{"className":749},[175],[38,751,638],{"className":752},[175,239],[38,754,756],{"className":755},[184],[38,757,759],{"className":758},[188],[38,760,762],{"className":761},[193],[38,763,766],{"className":764,"style":765},[197],"height:0.9251em;",[38,767,769,772],{"style":768},"top:-3.139em;margin-right:0.05em;",[38,770],{"className":771,"style":206},[205],[38,773,775],{"className":774},[210,211,212,213],[38,776,778],{"className":777},[175,213],[38,779,130],{"className":780},[175,514,213],[38,782,784],{"className":783},[175],[38,785,787],{"className":786},[175],[38,788,638],{"className":789},[175,239],[38,791,793,796],{"className":792},[244],[38,794,77],{"className":795},[244],[38,797,799],{"className":798},[184],[38,800,802],{"className":801},[188],[38,803,805],{"className":804},[193],[38,806,808],{"className":807,"style":589},[197],[38,809,810,813],{"style":501},[38,811],{"className":812,"style":206},[205],[38,814,816],{"className":815},[210,211,212,213],[38,817,819,822],{"className":818},[175,213],[38,820,121],{"className":821},[175,213],[38,823,87],{"className":824},[175,213],[38,826,828,837],{"className":827},[175],[38,829,831],{"className":830},[175],[38,832,834],{"className":833},[175],[38,835,638],{"className":836},[175,239],[38,838,840],{"className":839},[184],[38,841,843],{"className":842},[188],[38,844,846],{"className":845},[193],[38,847,849],{"className":848,"style":765},[197],[38,850,851,854],{"style":768},[38,852],{"className":853,"style":206},[205],[38,855,857],{"className":856},[210,211,212,213],[38,858,860],{"className":859},[175,213],[38,861,130],{"className":862},[175,514,213],[38,864,116],{"className":865},[175,239],[11,867,868,869,872],{},"Essa é a ",[31,870,871],{},"equação normal",". Uma matriz, duas multiplicações e uma inversão, e pronto, o ajuste ótimo sai direto, sem taxa de aprendizado, sem escolher quantas iterações, sem nenhum dos cuidados que o gradiente descendente exige.",[20,874,876],{"id":875},"o-truque-de-embutir-o-bias","O truque de embutir o bias",[11,878,879,880,883,884,886,887,962,963,1071,1072,1141,1142,1211],{},"Repara que a fórmula acima não tem um ",[605,881,882],{},"+ b"," separado, o bias tá dentro do próprio ",[605,885,74],{}," (o Bishop chama de ",[38,888,890,909],{"className":889},[41],[38,891,893],{"className":892},[45],[47,894,895],{"xmlns":49},[51,896,897,906],{},[54,898,899],{},[57,900,901,903],{},[60,902,74],{},[85,904,905],{},"0",[154,907,908],{"encoding":156},"w_0",[38,910,912],{"className":911,"ariaHidden":162},[161],[38,913,915,919],{"className":914},[166],[38,916],{"className":917,"style":918},[170],"height:0.5806em;vertical-align:-0.15em;",[38,920,922,926],{"className":921},[175],[38,923,74],{"className":924,"style":925},[175,179],"margin-right:0.0269em;",[38,927,929],{"className":928},[184],[38,930,932,954],{"className":931},[188,189],[38,933,935,951],{"className":934},[193],[38,936,939],{"className":937,"style":938},[197],"height:0.3011em;",[38,940,942,945],{"style":941},"top:-2.55em;margin-left:-0.0269em;margin-right:0.05em;",[38,943],{"className":944,"style":206},[205],[38,946,948],{"className":947},[210,211,212,213],[38,949,905],{"className":950},[175,213],[38,952,222],{"className":953},[221],[38,955,957],{"className":956},[193],[38,958,960],{"className":959,"style":229},[197],[38,961],{},"). Isso só funciona porque ele define uma \"função de base\" falsa, ",[38,964,966,994],{"className":965},[41],[38,967,969],{"className":968},[45],[47,970,971],{"xmlns":49},[51,972,973,991],{},[54,974,975,981,983,985,987,989],{},[57,976,977,979],{},[60,978,134],{},[85,980,905],{},[67,982,70],{"stretchy":69},[60,984,141],{"mathvariant":73},[67,986,77],{"stretchy":69},[67,988,80],{},[85,990,87],{},[154,992,993],{"encoding":156},"\\phi_0(\\mathbf{x}) = 1",[38,995,997,1061],{"className":996,"ariaHidden":162},[161],[38,998,1000,1003,1043,1046,1049,1052,1055,1058],{"className":999},[166],[38,1001],{"className":1002,"style":171},[170],[38,1004,1006,1009],{"className":1005},[175],[38,1007,134],{"className":1008},[175,179],[38,1010,1012],{"className":1011},[184],[38,1013,1015,1035],{"className":1014},[188,189],[38,1016,1018,1032],{"className":1017},[193],[38,1019,1021],{"className":1020,"style":938},[197],[38,1022,1023,1026],{"style":441},[38,1024],{"className":1025,"style":206},[205],[38,1027,1029],{"className":1028},[210,211,212,213],[38,1030,905],{"className":1031},[175,213],[38,1033,222],{"className":1034},[221],[38,1036,1038],{"className":1037},[193],[38,1039,1041],{"className":1040,"style":229},[197],[38,1042],{},[38,1044,70],{"className":1045},[235],[38,1047,141],{"className":1048},[175,239],[38,1050,77],{"className":1051},[244],[38,1053],{"className":1054,"style":249},[248],[38,1056,80],{"className":1057},[253],[38,1059],{"className":1060,"style":249},[248],[38,1062,1064,1068],{"className":1063},[166],[38,1065],{"className":1066,"style":1067},[170],"height:0.6444em;",[38,1069,87],{"className":1070},[175],", uma coluna inteira de 1's, então multiplicar por ",[38,1073,1075,1092],{"className":1074},[41],[38,1076,1078],{"className":1077},[45],[47,1079,1080],{"xmlns":49},[51,1081,1082,1090],{},[54,1083,1084],{},[57,1085,1086,1088],{},[60,1087,74],{},[85,1089,905],{},[154,1091,908],{"encoding":156},[38,1093,1095],{"className":1094,"ariaHidden":162},[161],[38,1096,1098,1101],{"className":1097},[166],[38,1099],{"className":1100,"style":918},[170],[38,1102,1104,1107],{"className":1103},[175],[38,1105,74],{"className":1106,"style":925},[175,179],[38,1108,1110],{"className":1109},[184],[38,1111,1113,1133],{"className":1112},[188,189],[38,1114,1116,1130],{"className":1115},[193],[38,1117,1119],{"className":1118,"style":938},[197],[38,1120,1121,1124],{"style":941},[38,1122],{"className":1123,"style":206},[205],[38,1125,1127],{"className":1126},[210,211,212,213],[38,1128,905],{"className":1129},[175,213],[38,1131,222],{"className":1132},[221],[38,1134,1136],{"className":1135},[193],[38,1137,1139],{"className":1138,"style":229},[197],[38,1140],{}," dá exatamente ",[38,1143,1145,1162],{"className":1144},[41],[38,1146,1148],{"className":1147},[45],[47,1149,1150],{"xmlns":49},[51,1151,1152,1160],{},[54,1153,1154],{},[57,1155,1156,1158],{},[60,1157,74],{},[85,1159,905],{},[154,1161,908],{"encoding":156},[38,1163,1165],{"className":1164,"ariaHidden":162},[161],[38,1166,1168,1171],{"className":1167},[166],[38,1169],{"className":1170,"style":918},[170],[38,1172,1174,1177],{"className":1173},[175],[38,1175,74],{"className":1176,"style":925},[175,179],[38,1178,1180],{"className":1179},[184],[38,1181,1183,1203],{"className":1182},[188,189],[38,1184,1186,1200],{"className":1185},[193],[38,1187,1189],{"className":1188,"style":938},[197],[38,1190,1191,1194],{"style":941},[38,1192],{"className":1193,"style":206},[205],[38,1195,1197],{"className":1196},[210,211,212,213],[38,1198,905],{"className":1199},[175,213],[38,1201,222],{"className":1202},[221],[38,1204,1206],{"className":1205},[193],[38,1207,1209],{"className":1208,"style":229},[197],[38,1210],{}," pra todo paciente, o mesmo efeito de somar um bias fixo.",[11,1213,1214,1215,1218],{},"O código faz isso na unha, colando uma coluna de 1's na frente de ",[605,1216,1217],{},"X",":",[1220,1221,1226],"pre",{"className":1222,"code":1223,"language":1224,"meta":1225,"style":1225},"language-python shiki shiki-themes github-light github-dark","def include_bias(X):\n    return np.hstack((np.ones((X.shape[0], 1)), X))\n","python","",[605,1227,1228,1235],{"__ignoreMap":1225},[38,1229,1232],{"class":1230,"line":1231},"line",1,[38,1233,1234],{},"def include_bias(X):\n",[38,1236,1238],{"class":1230,"line":1237},2,[38,1239,1240],{},"    return np.hstack((np.ones((X.shape[0], 1)), X))\n",[11,1242,1243,1244,1247,1248,1251,1252,1255,1256,1259,1260,1263],{},"Isso muda a arquitetura da classe: em vez de guardar ",[605,1245,1246],{},"coefs_"," e ",[605,1249,1250],{},"intercept_"," como duas coisas separadas (",[14,1253,1254],{"href":16},"como no post anterior","), agora existe um único vetor ",[605,1257,1258],{},"w_",", onde ",[605,1261,1262],{},"w_[0]"," é o bias e o resto são os coeficientes de cada variável.",[20,1265,1267],{"id":1266},"três-versões-uma-comparação-real","Três versões, uma comparação real",[11,1269,1270,1271,1274,1275,1278],{},"O notebook roda três variações da mesma classe ",[605,1272,1273],{},"LinearRegressor",", todas no mesmo dataset de diabetes (agora usando o ",[605,1276,1277],{},"train_test_split"," de verdade do scikit-learn, então os números não batem exatamente com os do post anterior, que usava minha própria implementação na unha):",[1280,1281,1282,1300],"table",{},[1283,1284,1285],"thead",{},[1286,1287,1288,1293,1296],"tr",{},[1289,1290,1292],"th",{"align":1291},"left","Versão",[1289,1294,1295],{"align":1291},"Como resolve",[1289,1297,1299],{"align":1298},"right","MSE (treino)",[1301,1302,1303,1321,1338],"tbody",{},[1286,1304,1305,1309,1318],{},[1306,1307,1308],"td",{"align":1291},"Gradiente, bias separado",[1306,1310,1311,1314,1315,1317],{"align":1291},[605,1312,1313],{},"coefs_ += X.T@erro*0.001",", ",[605,1316,1250],{}," à parte",[1306,1319,1320],{"align":1298},"3142.25",[1286,1322,1323,1326,1335],{},[1306,1324,1325],{"align":1291},"Gradiente, bias embutido",[1306,1327,1328,1329,1247,1332],{"align":1291},"mesma ideia, mas com ",[605,1330,1331],{},"include_bias",[605,1333,1334],{},"learning_rate=0.005",[1306,1336,1337],{"align":1298},"2898.90",[1286,1339,1340,1345,1351],{},[1306,1341,1342],{"align":1291},[31,1343,1344],{},"Equação normal",[1306,1346,1347,1350],{"align":1291},[605,1348,1349],{},"w_ = np.linalg.pinv(X) @ y",", sem iterar",[1306,1352,1353],{"align":1298},[31,1354,1355],{},"2868.55",[11,1357,1358,1359,1362,1363,1366,1367,1371],{},"A equação normal ganha das duas, sem eu precisar escolher ",[605,1360,1361],{},"learning_rate"," nem ",[605,1364,1365],{},"max_iter",". Não é coincidência: gradiente descendente é uma forma de ",[1368,1369,1370],"em",{},"aproximar"," essa mesma resposta iterando, e com iterações e taxa de aprendizado suficientes ele converge pro mesmo lugar. A equação normal só pula direto pro final.",[20,1373,1375,1376],{"id":1374},"a-pseudo-inversa-é-o-pinv","A pseudo-inversa é o ",[605,1377,1378],{},"pinv",[11,1380,1381,1537,1538,1541,1542,1602,1603,1633,1634,1637],{},[38,1382,1384,1423],{"className":1383},[41],[38,1385,1387],{"className":1386},[45],[47,1388,1389],{"xmlns":49},[51,1390,1391,1420],{},[54,1392,1393,1395,1402,1404,1414],{},[67,1394,70],{"stretchy":69},[123,1396,1397,1400],{},[60,1398,638],{"mathvariant":1399},"normal",[60,1401,130],{"mathvariant":129},[60,1403,638],{"mathvariant":1399},[123,1405,1406,1408],{},[67,1407,77],{"stretchy":69},[54,1409,1410,1412],{},[67,1411,121],{},[85,1413,87],{},[123,1415,1416,1418],{},[60,1417,638],{"mathvariant":1399},[60,1419,130],{"mathvariant":129},[154,1421,1422],{"encoding":156},"(\\Phi^{\\mathsf{T}}\\Phi)^{-1}\\Phi^{\\mathsf{T}}",[38,1424,1426],{"className":1425,"ariaHidden":162},[161],[38,1427,1429,1432,1435,1467,1470,1505],{"className":1428},[166],[38,1430],{"className":1431,"style":479},[170],[38,1433,70],{"className":1434},[235],[38,1436,1438,1441],{"className":1437},[175],[38,1439,638],{"className":1440},[175],[38,1442,1444],{"className":1443},[184],[38,1445,1447],{"className":1446},[188],[38,1448,1450],{"className":1449},[193],[38,1451,1453],{"className":1452,"style":498},[197],[38,1454,1455,1458],{"style":501},[38,1456],{"className":1457,"style":206},[205],[38,1459,1461],{"className":1460},[210,211,212,213],[38,1462,1464],{"className":1463},[175,213],[38,1465,130],{"className":1466},[175,514,213],[38,1468,638],{"className":1469},[175],[38,1471,1473,1476],{"className":1472},[244],[38,1474,77],{"className":1475},[244],[38,1477,1479],{"className":1478},[184],[38,1480,1482],{"className":1481},[188],[38,1483,1485],{"className":1484},[193],[38,1486,1488],{"className":1487,"style":589},[197],[38,1489,1490,1493],{"style":501},[38,1491],{"className":1492,"style":206},[205],[38,1494,1496],{"className":1495},[210,211,212,213],[38,1497,1499,1502],{"className":1498},[175,213],[38,1500,121],{"className":1501},[175,213],[38,1503,87],{"className":1504},[175,213],[38,1506,1508,1511],{"className":1507},[175],[38,1509,638],{"className":1510},[175],[38,1512,1514],{"className":1513},[184],[38,1515,1517],{"className":1516},[188],[38,1518,1520],{"className":1519},[193],[38,1521,1523],{"className":1522,"style":498},[197],[38,1524,1525,1528],{"style":501},[38,1526],{"className":1527,"style":206},[205],[38,1529,1531],{"className":1530},[210,211,212,213],[38,1532,1534],{"className":1533},[175,213],[38,1535,130],{"className":1536},[175,514,213]," tem nome próprio: ",[31,1539,1540],{},"pseudo-inversa de Moore-Penrose",", denotada ",[38,1543,1545,1564],{"className":1544},[41],[38,1546,1548],{"className":1547},[45],[47,1549,1550],{"xmlns":49},[51,1551,1552,1561],{},[54,1553,1554],{},[123,1555,1556,1558],{},[60,1557,638],{"mathvariant":1399},[67,1559,1560],{},"†",[154,1562,1563],{"encoding":156},"\\Phi^\\dagger",[38,1565,1567],{"className":1566,"ariaHidden":162},[161],[38,1568,1570,1573],{"className":1569},[166],[38,1571],{"className":1572,"style":498},[170],[38,1574,1576,1579],{"className":1575},[175],[38,1577,638],{"className":1578},[175],[38,1580,1582],{"className":1581},[184],[38,1583,1585],{"className":1584},[188],[38,1586,1588],{"className":1587},[193],[38,1589,1591],{"className":1590,"style":498},[197],[38,1592,1593,1596],{"style":501},[38,1594],{"className":1595,"style":206},[205],[38,1597,1599],{"className":1598},[210,211,212,213],[38,1600,1560],{"className":1601},[469,213],". É uma generalização de \"matriz inversa\" pra matrizes que não são quadradas (o que é sempre o caso aqui: ",[38,1604,1606,1620],{"className":1605},[41],[38,1607,1609],{"className":1608},[45],[47,1610,1611],{"xmlns":49},[51,1612,1613,1617],{},[54,1614,1615],{},[60,1616,638],{"mathvariant":1399},[154,1618,1619],{"encoding":156},"\\Phi",[38,1621,1623],{"className":1622,"ariaHidden":162},[161],[38,1624,1626,1630],{"className":1625},[166],[38,1627],{"className":1628,"style":1629},[170],"height:0.6833em;",[38,1631,638],{"className":1632},[175]," tem uma linha por paciente e uma coluna por variável, quase nunca são iguais). ",[605,1635,1636],{},"np.linalg.pinv(X)"," calcula exatamente essa conta, então a linha toda vira",[1220,1639,1641],{"className":1222,"code":1640,"language":1224,"meta":1225,"style":1225},"class LinearRegressor(BaseEstimator, RegressorMixin):\n    def fit(self, X, y):\n        X = include_bias(X)\n        self.w_ = np.linalg.pinv(X) @ y\n        return self\n\n    def predict(self, X):\n        X = include_bias(X)\n        return (X @ self.w_).reshape(X.shape[0],)\n",[605,1642,1643,1648,1653,1659,1665,1671,1678,1684,1689],{"__ignoreMap":1225},[38,1644,1645],{"class":1230,"line":1231},[38,1646,1647],{},"class LinearRegressor(BaseEstimator, RegressorMixin):\n",[38,1649,1650],{"class":1230,"line":1237},[38,1651,1652],{},"    def fit(self, X, y):\n",[38,1654,1656],{"class":1230,"line":1655},3,[38,1657,1658],{},"        X = include_bias(X)\n",[38,1660,1662],{"class":1230,"line":1661},4,[38,1663,1664],{},"        self.w_ = np.linalg.pinv(X) @ y\n",[38,1666,1668],{"class":1230,"line":1667},5,[38,1669,1670],{},"        return self\n",[38,1672,1674],{"class":1230,"line":1673},6,[38,1675,1677],{"emptyLinePlaceholder":1676},true,"\n",[38,1679,1681],{"class":1230,"line":1680},7,[38,1682,1683],{},"    def predict(self, X):\n",[38,1685,1687],{"class":1230,"line":1686},8,[38,1688,1658],{},[38,1690,1692],{"class":1230,"line":1691},9,[38,1693,1694],{},"        return (X @ self.w_).reshape(X.shape[0],)\n",[11,1696,1697,1698,1703,1704,1771],{},"Uma classe inteira de regressão linear, resolvida numa linha. E o Bishop já avisa o risco: se duas colunas de entrada forem muito parecidas entre si (",[1699,1700,1702],"glossary-term",{"definition":1701},"quando duas ou mais variáveis de entrada carregam quase a mesma informação, o que deixa a matriz Φ quase singular e a solução da equação normal instável","colinearidade","), ",[38,1705,1707,1727],{"className":1706},[41],[38,1708,1710],{"className":1709},[45],[47,1711,1712],{"xmlns":49},[51,1713,1714,1724],{},[54,1715,1716,1722],{},[123,1717,1718,1720],{},[60,1719,638],{"mathvariant":1399},[60,1721,130],{"mathvariant":129},[60,1723,638],{"mathvariant":1399},[154,1725,1726],{"encoding":156},"\\Phi^{\\mathsf{T}}\\Phi",[38,1728,1730],{"className":1729,"ariaHidden":162},[161],[38,1731,1733,1736,1768],{"className":1732},[166],[38,1734],{"className":1735,"style":498},[170],[38,1737,1739,1742],{"className":1738},[175],[38,1740,638],{"className":1741},[175],[38,1743,1745],{"className":1744},[184],[38,1746,1748],{"className":1747},[188],[38,1749,1751],{"className":1750},[193],[38,1752,1754],{"className":1753,"style":498},[197],[38,1755,1756,1759],{"style":501},[38,1757],{"className":1758,"style":206},[205],[38,1760,1762],{"className":1761},[210,211,212,213],[38,1763,1765],{"className":1764},[175,213],[38,1766,130],{"className":1767},[175,514,213],[38,1769,638],{"className":1770},[175]," fica perto de singular e a conta fica numericamente instável. Isso vai voltar quando a matéria chegar em seleção de características.",[20,1773,1775],{"id":1774},"bate-com-o-scikit-learn-na-casa-decimal","Bate com o scikit-learn, na casa decimal",[11,1777,1778,1779,1782],{},"A prova de que a conta tá certa: rodei a mesma pseudo-inversa e o ",[605,1780,1781],{},"LinearRegression()"," pronto do scikit-learn, lado a lado.",[1220,1784,1786],{"className":1222,"code":1785,"language":1224,"meta":1225,"style":1225},"regressor = LinearRegressor()  # a classe com pinv, acima\nregressor.fit(X_train, y_train)\nprint(mean_squared_error(y_train, regressor.predict(X_train)))\n\nfrom sklearn.linear_model import LinearRegression\nsk_regressor = LinearRegression().fit(X_train, y_train)\nprint(mean_squared_error(y_train, sk_regressor.predict(X_train)))\n",[605,1787,1788,1793,1798,1803,1807,1812,1817],{"__ignoreMap":1225},[38,1789,1790],{"class":1230,"line":1231},[38,1791,1792],{},"regressor = LinearRegressor()  # a classe com pinv, acima\n",[38,1794,1795],{"class":1230,"line":1237},[38,1796,1797],{},"regressor.fit(X_train, y_train)\n",[38,1799,1800],{"class":1230,"line":1655},[38,1801,1802],{},"print(mean_squared_error(y_train, regressor.predict(X_train)))\n",[38,1804,1805],{"class":1230,"line":1661},[38,1806,1677],{"emptyLinePlaceholder":1676},[38,1808,1809],{"class":1230,"line":1667},[38,1810,1811],{},"from sklearn.linear_model import LinearRegression\n",[38,1813,1814],{"class":1230,"line":1673},[38,1815,1816],{},"sk_regressor = LinearRegression().fit(X_train, y_train)\n",[38,1818,1819],{"class":1230,"line":1680},[38,1820,1821],{},"print(mean_squared_error(y_train, sk_regressor.predict(X_train)))\n",[1823,1824,1825],"blockquote",{},[11,1826,1827,1830,1831,1834],{},[31,1828,1829],{},"Saída:"," minha versão: MSE treino 2868.5497028355776. ",[605,1832,1833],{},"LinearRegression"," do scikit-learn: MSE treino 2868.549702835577.",[11,1836,1837,1838,1840],{},"A diferença aparece só na última casa decimal, ruído de ponto flutuante, não de método. ",[605,1839,1781],{}," faz exatamente essa conta por baixo do capô.",[20,1842,1844],{"id":1843},"o-zoológico-de-regressores","O zoológico de regressores",[11,1846,1847,1848,1851],{},"A aula 2c pega esse mesmo regressor da equação normal e mede o MSE também no conjunto de ",[31,1849,1850],{},"teste"," (os 20% que ficaram de fora do treino), e depois compara contra mais cinco tipos de modelo bem diferentes entre si, todos com os parâmetros padrão do scikit-learn:",[1280,1853,1854,1867],{},[1283,1855,1856],{},[1286,1857,1858,1861,1864],{},[1289,1859,1860],{"align":1291},"Modelo",[1289,1862,1863],{"align":1298},"MSE treino",[1289,1865,1866],{"align":1298},"MSE teste",[1301,1868,1869,1885,1900,1917,1929,1943],{},[1286,1870,1871,1877,1882],{},[1306,1872,1873,1874,77],{"align":1291},"Árvore de decisão (",[605,1875,1876],{},"DecisionTreeRegressor",[1306,1878,1879],{"align":1298},[31,1880,1881],{},"0.00",[1306,1883,1884],{"align":1298},"4872.20",[1286,1886,1887,1894,1897],{},[1306,1888,1889,1890,1893],{"align":1291},"KNN (",[605,1891,1892],{},"KNeighborsRegressor",", k=5)",[1306,1895,1896],{"align":1298},"2528.59",[1306,1898,1899],{"align":1298},"3019.08",[1286,1901,1902,1909,1912],{},[1306,1903,1904,1905,1908],{"align":1291},"Floresta aleatória (",[605,1906,1907],{},"RandomForestRegressor",", profundidade 3)",[1306,1910,1911],{"align":1298},"2530.82",[1306,1913,1914],{"align":1298},[31,1915,1916],{},"2785.98",[1286,1918,1919,1924,1926],{},[1306,1920,1921,1922],{"align":1291},"Equação normal \u002F ",[605,1923,1833],{},[1306,1925,1355],{"align":1298},[1306,1927,1928],{"align":1298},"2900.19",[1286,1930,1931,1937,1940],{},[1306,1932,1933,1936],{"align":1291},[605,1934,1935],{},"SGDRegressor"," (10000 iterações)",[1306,1938,1939],{"align":1298},"2950.64",[1306,1941,1942],{"align":1298},"2863.35",[1286,1944,1945,1950,1953],{},[1306,1946,1947],{"align":1291},[605,1948,1949],{},"LinearSVR",[1306,1951,1952],{"align":1298},"8224.56",[1306,1954,1955],{"align":1298},"6775.88",[11,1957,1958],{},"Eu ainda não vou explicar como cada um desses modelos funciona por dentro (KNN, árvore de decisão e floresta aleatória têm aula própria mais na frente da matéria, e é lá que eu volto neles com calma). Mas dá pra tirar três lições só olhando a tabela:",[1960,1961,1962,1974,1980],"ol",{},[1963,1964,1965,1968,1969,1973],"li",{},[31,1966,1967],{},"MSE de treino baixo não significa nada sozinho."," A árvore de decisão zerou o erro de treino (ela literalmente decorou cada paciente) e foi a pior de todas no teste. Isso é ",[1699,1970,1972],{"definition":1971},"quando o modelo memoriza os dados de treino em vez de aprender o padrão geral, e por isso erra mais em dado novo","overfitting"," em estado puro, o mesmo fenômeno que o Bishop mostrou lá no capítulo 1 com o polinômio de grau 9.",[1963,1975,1976,1979],{},[31,1977,1978],{},"O vencedor no teste não foi o modelo mais \"exato\" no treino."," A floresta aleatória acerta o treino quase tão bem quanto a árvore cheia (2530.82, bem perto do zero absurdo da árvore), mas sem exagerar, e por isso generaliza melhor: 2785.98 no teste, o menor MSE de teste da tabela inteira. Uma floresta é várias árvores treinadas em pedaços diferentes dos dados, com a previsão final sendo a média de todas, e essa média cancela boa parte do exagero que cada árvore individual comete.",[1963,1981,1982,1988,1989,1993,1994,1996],{},[31,1983,1984,1985,1987],{},"O ",[605,1986,1935],{}," bateu a equação normal exata no teste"," (2863.35 contra 2900.19), mesmo com um MSE de treino um pouco pior. Não é coincidência: como eu já vi ",[14,1990,1992],{"href":1991},"\u002Fplaylists\u002Fmachine-learning-specialization\u002Fw2-lab05-scikit-learn","na playlist da especialização",", o ",[605,1995,1935],{}," do scikit-learn vem com regularização L2 ligada por padrão. Aqui essa regularização, sem eu pedir, acabou ajudando a generalizar melhor.",[11,1998,1984,1999,2001],{},[605,2000,1949],{}," ficou visivelmente pior que todo o resto, treino e teste, mas isso é mais sobre os hiperparâmetros padrão dele não servirem bem pra esse dataset do que sobre o método em si, história pra outro dia.",[20,2003,2005],{"id":2004},"fechando","Fechando",[1280,2007,2008,2018],{},[1283,2009,2010],{},[1286,2011,2012,2015],{},[1289,2013,2014],{"align":1291},"O que eu já sabia",[1289,2016,2017],{"align":1291},"O que essas duas aulas assentaram",[1301,2019,2020,2028,2199],{},[1286,2021,2022,2025],{},[1306,2023,2024],{"align":1291},"Gradiente descendente encontra o ajuste ótimo iterando",[1306,2026,2027],{"align":1291},"Regressão linear tem solução fechada: a equação normal chega lá numa única conta",[1286,2029,2030,2035],{},[1306,2031,2032,2034],{"align":1291},[605,2033,1781],{}," do scikit-learn \"só funciona\"",[1306,2036,2037,2038,2198],{"align":1291},"Por baixo, ela calcula exatamente ",[38,2039,2041,2081],{"className":2040},[41],[38,2042,2044],{"className":2043},[45],[47,2045,2046],{"xmlns":49},[51,2047,2048,2078],{},[54,2049,2050,2052,2058,2060,2070,2076],{},[67,2051,70],{"stretchy":69},[123,2053,2054,2056],{},[60,2055,638],{"mathvariant":1399},[60,2057,130],{"mathvariant":129},[60,2059,638],{"mathvariant":1399},[123,2061,2062,2064],{},[67,2063,77],{"stretchy":69},[54,2065,2066,2068],{},[67,2067,121],{},[85,2069,87],{},[123,2071,2072,2074],{},[60,2073,638],{"mathvariant":1399},[60,2075,130],{"mathvariant":129},[60,2077,116],{"mathvariant":73},[154,2079,2080],{"encoding":156},"(\\Phi^{\\mathsf{T}}\\Phi)^{-1}\\Phi^{\\mathsf{T}}\\mathbf{t}",[38,2082,2084],{"className":2083,"ariaHidden":162},[161],[38,2085,2087,2090,2093,2125,2128,2163,2195],{"className":2086},[166],[38,2088],{"className":2089,"style":479},[170],[38,2091,70],{"className":2092},[235],[38,2094,2096,2099],{"className":2095},[175],[38,2097,638],{"className":2098},[175],[38,2100,2102],{"className":2101},[184],[38,2103,2105],{"className":2104},[188],[38,2106,2108],{"className":2107},[193],[38,2109,2111],{"className":2110,"style":498},[197],[38,2112,2113,2116],{"style":501},[38,2114],{"className":2115,"style":206},[205],[38,2117,2119],{"className":2118},[210,211,212,213],[38,2120,2122],{"className":2121},[175,213],[38,2123,130],{"className":2124},[175,514,213],[38,2126,638],{"className":2127},[175],[38,2129,2131,2134],{"className":2130},[244],[38,2132,77],{"className":2133},[244],[38,2135,2137],{"className":2136},[184],[38,2138,2140],{"className":2139},[188],[38,2141,2143],{"className":2142},[193],[38,2144,2146],{"className":2145,"style":589},[197],[38,2147,2148,2151],{"style":501},[38,2149],{"className":2150,"style":206},[205],[38,2152,2154],{"className":2153},[210,211,212,213],[38,2155,2157,2160],{"className":2156},[175,213],[38,2158,121],{"className":2159},[175,213],[38,2161,87],{"className":2162},[175,213],[38,2164,2166,2169],{"className":2165},[175],[38,2167,638],{"className":2168},[175],[38,2170,2172],{"className":2171},[184],[38,2173,2175],{"className":2174},[188],[38,2176,2178],{"className":2177},[193],[38,2179,2181],{"className":2180,"style":498},[197],[38,2182,2183,2186],{"style":501},[38,2184],{"className":2185,"style":206},[205],[38,2187,2189],{"className":2188},[210,211,212,213],[38,2190,2192],{"className":2191},[175,213],[38,2193,130],{"className":2194},[175,514,213],[38,2196,116],{"className":2197},[175,239]," via pseudo-inversa",[1286,2200,2201,2204],{},[1306,2202,2203],{"align":1291},"MSE de treino baixo é bom sinal",[1306,2205,2206],{"align":1291},"Só quando o MSE de teste concorda. Treino baixo com teste alto é a assinatura de overfitting",[20,2208,2210],{"id":2209},"aplicação-prática","Aplicação Prática",[11,2212,2213,2214,2216,2217,2219,2220,2222],{},"Uso o modelo da equação normal (o mesmo ",[605,2215,1273],{}," com ",[605,2218,1378],{}," de mais acima) e olho pro conjunto de ",[31,2221,1850],{},", os 89 pacientes que o modelo nunca viu durante o ajuste, pra visualizar o que aquele MSE de 2900.19 realmente significa caso a caso.",[1220,2224,2226],{"className":1222,"code":2225,"language":1224,"meta":1225,"style":1225},"regressor = LinearRegressor()\nregressor.fit(X_train, y_train)\ny_pred_test = regressor.predict(X_test)\n",[605,2227,2228,2233,2237],{"__ignoreMap":1225},[38,2229,2230],{"class":1230,"line":1231},[38,2231,2232],{},"regressor = LinearRegressor()\n",[38,2234,2235],{"class":1230,"line":1237},[38,2236,1797],{},[38,2238,2239],{"class":1230,"line":1655},[38,2240,2241],{},"y_pred_test = regressor.predict(X_test)\n",[2243,2244],"predicted-vs-actual-scatter",{":actual":2245,":predicted":2246,"point-label":2247,"x-label":2248,"y-label":2249},"[37, 42, 48, 48, 52, 52, 60, 61, 63, 63, 64, 67, 68, 69, 70, 72, 72, 72, 77, 84, 84, 87, 89, 90, 90, 90, 91, 94, 94, 95, 96, 96, 98, 99, 101, 102, 107, 108, 110, 111, 113, 118, 122, 128, 129, 135, 136, 140, 140, 151, 153, 156, 158, 164, 168, 168, 170, 171, 172, 180, 181, 184, 186, 187, 190, 200, 202, 202, 214, 219, 220, 222, 230, 232, 233, 233, 237, 242, 248, 252, 258, 263, 264, 272, 275, 281, 295, 297, 310]","[81.6, 124.4, 71.6, 48.0, 206.5, 61.5, 77.6, 146.0, 59.1, 54.4, 88.5, 130.7, 107.5, 103.5, 179.5, 109.2, 94.4, 55.9, 180.4, 119.7, 92.2, 115.0, 79.9, 51.6, 133.0, 171.0, 157.4, 94.1, 90.2, 154.6, 54.8, 108.6, 79.0, 53.5, 182.0, 105.6, 109.0, 107.7, 164.9, 123.8, 86.4, 159.4, 187.9, 70.4, 154.9, 100.1, 152.5, 174.8, 124.7, 210.7, 115.0, 165.5, 63.0, 184.5, 120.3, 155.0, 196.4, 175.6, 148.0, 173.8, 171.1, 166.3, 192.7, 140.6, 140.9, 71.7, 134.0, 144.8, 130.7, 139.5, 208.9, 199.4, 291.4, 189.0, 190.4, 206.0, 158.6, 258.2, 202.2, 168.4, 167.6, 188.3, 250.8, 181.3, 218.6, 234.2, 219.5, 206.6, 207.4]","Paciente","progressão real (teste)","progressão prevista (teste)",[11,2251,2252,2253,2256],{},"Repara que a nuvem é bem parecida com ",[14,2254,2255],{"href":16},"a do post anterior"," (que era em cima do treino), sem ficar visivelmente pior no teste. Isso confirma numericamente o que a tabela já mostrou: MSE treino 2868.55 contra MSE teste 2900.19, uma diferença pequena. O modelo não decorou o treino, ele generalizou de verdade, só que sendo um modelo linear simples, ainda erra bastante caso a caso, o mesmo teto que eu já via no post anterior.",[2258,2259,2260],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":1225,"searchDepth":1237,"depth":1237,"links":2262},[2263,2264,2265,2266,2268,2269,2270,2271],{"id":22,"depth":1237,"text":23},{"id":875,"depth":1237,"text":876},{"id":1266,"depth":1237,"text":1267},{"id":1374,"depth":1237,"text":2267},"A pseudo-inversa é o pinv",{"id":1774,"depth":1237,"text":1775},{"id":1843,"depth":1237,"text":1844},{"id":2004,"depth":1237,"text":2005},{"id":2209,"depth":1237,"text":2210},null,"2026-08-19","Aula 2b e 2c: em vez de iterar com gradiente descendente, o professor resolve a regressão linear numa única conta fechada com a pseudo-inversa, bate exatamente com o LinearRegression do scikit-learn, e compara contra mais cinco regressores diferentes. Eu explico o porquê de cada conta.","md",{},"\u002Fpt\u002Fplaylists\u002Fpattern-recognition\u002Fnormal-equation","pattern-recognition",{"title":6,"description":2274},"published","pt\u002Fplaylists\u002Fpattern-recognition\u002Fnormal-equation",[2283,2284,1972],"equacao-normal","minimos-quadrados","0p6GHHgymidBOg6X__49FRr1_v2iPUMpgRvYAF4XdQI",1787338983083]