? ? ? ? 寫完ex5的作業(yè)之后驀然回首發(fā)現(xiàn)我原來完成作業(yè)的進(jìn)度還是挺慢的喉脖,人家吳教授寫的建議是3h完成的作業(yè)亚隙,我可能用上兩天:我就是糾結(jié)那幾行英文的理解箫攀,糾結(jié)幾個(gè)小細(xì)節(jié)肠牲,充分吃透,才能往下一步走靴跛。
? ? ? ? 這一期的練習(xí)缀雳,就是有兩個(gè)地方需要著重說明一下:
1.learningCurve:學(xué)習(xí)曲線。Learning Curve是計(jì)算隨著樣本數(shù)量m的變化梢睛,訓(xùn)練集和驗(yàn)證集的誤差肥印,所以每一個(gè)單元的訓(xùn)練集誤差(error_train(i)),應(yīng)該以i為m計(jì)算出先訓(xùn)練出theta值,然后再計(jì)算error_train值绝葡,而error_validation應(yīng)當(dāng)以你在訓(xùn)練集有限的m訓(xùn)練出來的theta深碱,在我所有訓(xùn)練集驗(yàn)證產(chǎn)生的error。
它的總體思想就是:若干不同數(shù)量的訓(xùn)練集得出的theta藏畅,在validation集的誤差到底有多大敷硅。
for i = 1:m
? Xi = X(1:i, :);
? yi = y(1:i);
? [theta] = trainLinearReg(Xi, yi, lambda);
? error_train(i) = linearRegCostFunction(Xi, yi, theta, 0);
? error_val(i) = linearRegCostFunction(Xval, yval, theta, 0);//原先這里用的Xval是跟上面的Xi一樣截取同樣數(shù)量的長度的,其實(shí)是不用截取的愉阎。
endfor
2.lambda = 0
? ? 在最后一項(xiàng)練習(xí)validationCurve中要計(jì)算隨著不同的lambda绞蹦,訓(xùn)練集和驗(yàn)證集的誤差到底有多大。計(jì)算步驟有三:1.先按照給定的X, y榜旦,lambda訓(xùn)練出theta坦辟,2拿這個(gè)theta值計(jì)算驗(yàn)證集的代價(jià)。注意哦章办,第一步計(jì)算出theta的時(shí)候lambda要放指定的值锉走,但是計(jì)算第二步代價(jià)函數(shù)的時(shí)候lambda要設(shè)為0.為什么呢滨彻?依我理解,lambda值拿來訓(xùn)練處theta的挪蹭,lambda越高亭饵,懲罰越大,計(jì)算出來的theta是不同的梁厉,對(duì)不辜羊?但之后,theta已經(jīng)計(jì)算出來了词顾,如果再套上lambda計(jì)算代價(jià)八秃,就會(huì)顯得重復(fù)多余。lambda的職責(zé)主要是用來訓(xùn)練肉盹,而不是計(jì)算誤差昔驱。(其實(shí)在ex5的最前面已經(jīng)提醒過了哦)
% ====================== YOUR CODE HERE ======================
for i = 1:length(lambda_vec)
? lambda = lambda_vec(i);
? [theta] = trainLinearReg(X, y, lambda);
? error_train(i) = linearRegCostFunction(X, y, theta, 0);//原來這里放的是lambda,結(jié)果跟答案出入太大上忍,后來改為0
? error_val(i) = linearRegCostFunction(Xval, yval, theta, 0);
end
% =========================================================================
end