線性回歸(Linear Regression)
簡(jiǎn)單的Octave/MATLAB函數(shù)(Simple Octave/MATLAB function)
將warmUpExercise.m文件中的warmUpExercise()補(bǔ)充完整,使其能夠返回一個(gè)5*5的單位矩陣奄妨。在函數(shù)相應(yīng)位置鍵入如下代碼即可:
A = eye(5);
然后,我們?cè)贠ctave中的CLI中鍵入如下命令測(cè)試warmUpExercise()是否正確:
% 先用cd命令“前往”warmUpExercise.m所在的文件目錄
octave:2> warmUpExercise()
其輸出結(jié)果為:
ans =
Diagonal Matrix
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
單變量線性回歸(Linear regression with one variable)
假設(shè)你是一家連鎖餐廳的CEO世吨,且該連鎖餐廳在各個(gè)城市開(kāi)設(shè)了連鎖店,因此你可以獲得收益和城市人口相關(guān)的數(shù)據(jù)∈姘叮現(xiàn)在希望你借助這些數(shù)據(jù)來(lái)預(yù)測(cè)在不同地方開(kāi)設(shè)連鎖店的收益蕊退。
ex1data1.txt文件為本問(wèn)題的訓(xùn)練集,第一列表示城市人口操刀,第二列為連鎖店的利潤(rùn),其中負(fù)值代表連鎖店的虧損婴洼。在ex1.m文件中已經(jīng)編寫(xiě)了相關(guān)代碼將數(shù)據(jù)導(dǎo)入其中骨坑。
data = load('ex1data1.txt');
X = data(:, 1);
y = data(:, 2);
m = length(y); % number of training examples
任務(wù)一 可視化數(shù)據(jù)(Plotting the Data)
因此,我們需在plotData.m文件中將plotData()補(bǔ)充完整柬采。
plot(x, y, 'rx', 'MarkerSize', 10);
xlabel('Population');
ylabel('Revenue');
將上述代碼鍵入函數(shù)相應(yīng)的地方欢唾,然后在Octave中測(cè)試一下。
octave:10> plotData(X, y);
其運(yùn)行結(jié)果為:
在進(jìn)行后兩個(gè)任務(wù)之前粉捻,我們先把要用到的公式全部列一下:
- 假設(shè)函數(shù)hθ(x):hθ(x) = θ0 + θ1x
- 代價(jià)函數(shù)J:
- 梯度下降算法:
注:梯度下降算法是同時(shí)更新θj礁遣。
任務(wù)二 計(jì)算代價(jià)函數(shù)J(θ)(Computing the cost J(θ))
根據(jù)代價(jià)函數(shù)J(θ)的公式,我們不難寫(xiě)出如下代碼:
J = sum((X*theta - y).^2) / (2*m);
好了肩刃,我們?cè)贠ctave中鍵入如下代碼來(lái)測(cè)試一下吧:
octave:7> X = [ones(m, 1), data(:, 1)];
octave:8> theta = zeros(2, 1);
octave:9> iterations = 1500;
octave:10> alpha = 0.01;
octave:11> J = computeCost(X, y, theta);
其輸出結(jié)果為:
octave:12> J
J = 32.073
任務(wù)三 梯度下降算法(Gradient Descent)
我們可以設(shè)置一個(gè)臨時(shí)變量theta_s祟霍,將變量theta的值賦值給這個(gè)臨時(shí)變量theta_s,以保證計(jì)算完畢后θj同時(shí)更新盈包。
在for循環(huán)之前沸呐,我們先將theta的值賦值給theta_s:
theta_s = theta;
然后再在for循環(huán)中添加計(jì)算θj的代碼:
theta(1) = theta(1) - alpha / m * sum(X * theta_s - y);
theta(2) = theta(2) - alpha / m * sum((X * theta_s - y) .* X(:,2));
theta_s = theta;
注:我們?cè)谑褂锰荻认陆邓惴〞r(shí)在矩陣X中新增了一列1(使其成為了第一列)。
X = [ones(m, 1), data(:,1)]; % Add a column of ones to x
之所以增加這一列是因?yàn)榇鷥r(jià)函數(shù)J中的θ0的系數(shù)為1呢燥,為了方便矩陣的運(yùn)算崭添,故添加此列。
我們?cè)贠ctave中鍵入如下代碼測(cè)試一下:
octave:7> X = [ones(m, 1), data(:, 1)];
octave:8> theta = zeros(2, 1);
octave:9> iterations = 1500;
octave:10> alpha = 0.01;
octave:11> J = computeCost(X, y, theta);
octave:12> J
J = 32.073
octave:13> theta = gradientDescent(X, y, theta, alpha, iterations);
其輸出結(jié)果為:
octave:14> theta
theta =
-3.6303
1.1664
任務(wù)四 驗(yàn)證梯度下降算法(Debugging)
ex1.m文件中已將代碼寫(xiě)好叛氨,我們將其鍵入Octave中觀察輸出結(jié)果:
octave:15> hold on;
octave:16> plot(X(:, 2), X*theta, '-');`
其輸出結(jié)果為:
任務(wù)五 可視化代價(jià)函數(shù)J(θ)(Visualizing J(?))
該部分代碼也在ex1.m文件中寫(xiě)好滥朱,我們將其鍵入Octave中觀察輸出結(jié)果:
octave:18> theta0_vals = linspace(-10, 10, 100);
octave:19> theta1_vals = linspace(-1, 4, 100);
octave:20> J_vals = zeros(length(theta0_vals), length(theta1_vals));
octave:22> for i = 1:length(theta0_vals)
> for j = 1:length(theta1_vals)
> t = [theta0_vals(i); theta1_vals(j)];
> J_vals(i, j) = computeCost(X, y, t);
> end
> end
octave:23> J_vals = J_vals';
octave:24> figure;
octave:25> surf(theta0_vals, theta1_vals, J_vals);
octave:26> xlabel('\theta_0');
octave:27> ylabel('\theta_1');
octave:28> figure;
octave:29> contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 3, 20));
octave:30> xlabel('\theta_0');
octave:31> ylabel('\theta_1');
octave:32> hold on;
octave:33> plot(theta(1), theta(2), 'rx', 'MarkerSize', 10, 'LineWidth', 2);
其輸出結(jié)果為:
選做題
多元線性回歸(Linear regression with multiple variables)
假設(shè)你想要出售你的房子,你想知道現(xiàn)在你的房子在房屋交易中可以賣(mài)到什么價(jià)位力试。對(duì)此,你可以采取收集最近的房屋交易數(shù)據(jù)排嫌,進(jìn)而構(gòu)建房屋價(jià)格模型的方法畸裳。
ex1data2.txt文件中包含了房屋價(jià)格模型的訓(xùn)練集,第一列是房屋的大小淳地,第二列是房間的數(shù)量怖糊,第三列是房屋的交易價(jià)格帅容。
任務(wù)一 特征歸一化(Feature Normalization)
在這個(gè)案例中,由于兩個(gè)特征變量取值范圍差異較大(在實(shí)際操作過(guò)程中伍伤,我們?yōu)榱朔奖憔仃囘\(yùn)算會(huì)添加一個(gè)值為1的特征變量)并徘。如若直接使用梯度下降算法,其迭代次數(shù)較多扰魂。因此麦乞,我們先將特征歸一化,即特征縮放劝评,來(lái)讓特征變量的取值范圍縮小姐直,使得在使用梯度下降算法時(shí)能夠更快地收斂。
我們先把特征縮放的公式列一下:
其中μn表示某一特征的平均值蒋畜,sn表示某一特征的標(biāo)準(zhǔn)差(或最大值與最小值間的差声畏,即max-min)。
因此姻成,我們?cè)趂eatureNormalize.m文件中可以照著公式添加如下代碼:
mu = mean(X); % 求均值插龄,返回值為1*2的矩陣
sigma = std(X); % 求標(biāo)準(zhǔn)差
X_norm = (X - mu) ./ sigma;
任務(wù)二 梯度下降(Gradient Descent)
與之前一樣,我們先在X矩陣中添加一列1:
X = [ones(m, 1), X];
在此情況下科展,代價(jià)函數(shù)可以寫(xiě)成如下向量形式:
因此均牢,我們可以在computeCostMulti.m文件中使用computeCost.m的代碼(因?yàn)閏omputeCost.m中的代碼已經(jīng)考慮到了多變量的情況),在gradientDescentMulti.m文件中添加如下代碼:
theta = theta - alpha / m * X' * (X * theta - y);
任務(wù)三 正規(guī)方程(Normal Equations)
正規(guī)方程的公式為:
因此辛润,我們?cè)趎ormalEqn.m文件中不難寫(xiě)出如下代碼:
theta = pinv( X' * X ) * X' * y;
到了這里大家可以submit了膨处,但還有一個(gè)附加作業(yè)——選擇學(xué)習(xí)率α并預(yù)測(cè)1650 平方英尺 3 個(gè)臥室的房子的價(jià)格,我們還沒(méi)有寫(xiě)砂竖。因此真椿,我們現(xiàn)在來(lái)完成它。
我們?cè)趀x1_multi.m文件中修改學(xué)習(xí)率α的值來(lái)找到一個(gè)合適的學(xué)習(xí)率α乎澄。
fprintf('Running gradient descent ...\n');
% Choose some alpha value
alpha = 0.1;
num_iters = 400;
% Init Theta and Run Gradient Descent
theta = zeros(3, 1);
[theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters);
% Plot the convergence graph
%figure;
%plot(1:numel(J_history), J_history, '-b', 'LineWidth', 2);
plot(1:numel(J_history), J_history, 'r');
xlabel('Number of iterations');
ylabel('Cost J');
% Display gradient descent's result
fprintf('Theta computed from gradient descent: \n');
fprintf(' %f \n', theta);
fprintf('\n');
fprintf('Running gradient descent ...\n');
% Choose some alpha value
alpha = 0.03;
num_iters = 400;
% Init Theta and Run Gradient Descent
theta = zeros(3, 1);
[theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters);
% Plot the convergence graph
%figure;
%plot(1:numel(J_history), J_history, '-b', 'LineWidth', 2);
hold on;
plot(1:numel(J_history), J_history, 'g');
% Display gradient descent's result
fprintf('Theta computed from gradient descent: \n');
fprintf(' %f \n', theta);
fprintf('\n');
fprintf('Running gradient descent ...\n');
% Choose some alpha value
alpha = 0.01;
num_iters = 400;
% Init Theta and Run Gradient Descent
theta = zeros(3, 1);
[theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters);
% Plot the convergence graph
%figure;
%plot(1:numel(J_history), J_history, '-b', 'LineWidth', 2);
hold on;
plot(1:numel(J_history), J_history, 'y');
legend('alpha = 0.1', 'alpha = 0.03', 'alpha = 0.01');
% Display gradient descent's result
fprintf('Theta computed from gradient descent: \n');
fprintf(' %f \n', theta);
fprintf('\n');
其輸出結(jié)果為:
根據(jù)此圖突硝,我們大概可以認(rèn)為alpha = 0.1時(shí),其學(xué)習(xí)率α較為合適置济。
最后我們通過(guò)梯度下降算法(alpha = 0.1)和正規(guī)方程法來(lái)預(yù)測(cè)一下房?jī)r(jià)解恰,其中我們?cè)O(shè)置price=2000,即每平方英尺的售價(jià)為2000美元浙于,其結(jié)果如下:
Predicted price of a 1650 sq-ft, 3 br house (using gradient descent):
$182861695.021679
Predicted price of a 1650 sq-ft, 3 br house (using normal equations):
$293081.464335
我們發(fā)現(xiàn)兩種算法預(yù)測(cè)出的房?jī)r(jià)相差甚遠(yuǎn)护盈,考慮到此處n=2,所以我們優(yōu)先考慮正規(guī)方程法羞酗。