Coursera機器學習-吳恩達
Octave 代碼
% 1.用圖表展示數據:
data = load('ex1data1.txt'); % 讀取訓練集數據
X = data(:, 1); % 第一列是城市人口
y = data(:, 2); % 第二列是收入
m = length(y); % 訓練集數目
plot(X, y, 'rx', 'MarkerSize', 10);
ylabel('Profit in $10,000s');
xlabel('Population of city in 10,000s');
% 2.計算代價函數
X = [ones(m, 1), data(:,1)]; % 在數據前面加一列全爲1
theta = zeros(2, 1); % 初始化 擬合參數
m = length(y);
J = 0; % 計算代價函數computeCost(),公式如下圖
h = X * theta %假設函數hypothesis
J = 1/(2*m) * sum((h-y).^2);
% further testing of the cost function
J = 0; % 計算代價函數,公式如下圖
h = X * [-1,2]
J = 1/(2*m) * sum((h-y).^2);
3.使用梯度下降算法更新theta的值:
% 梯度下降的參數設置
iterations = 1500; % 迭代次數
alpha = 0.01; % 學習速率
m = length(y); % number of training examples
J_history = zeros(num_iters, 1);
for iter = 1 : iterations
% 計算更新後的theta,公式如下圖
theta = theta - alpha/m * X' * (X * theta - y)
% 每一趟均計算並保存代價函數J
J_history(iter) = computeCost(X, y, theta);
end
% 4.繪製結果(收入)與用最優theta算出的假設函數h的圖:
hold on; % keep previous plot visible
plot(X(:,2), X*theta, '-')
legend('Training data', 'Linear regression')
% 5.使用得到的假設函數h預測一波,當人口爲35000和70000人時,收入爲多少
predict1 = [1, 3.5] * theta; %測試集特徵(人口)前還得加上一列1
predict2 = [1, 7] * theta;
fprintf('For population = 35,000, we predict a profit of %f\n',...
predict1*10000);
fprintf('For population = 70,000, we predict a profit of %f\n',...
predict2*10000);
% 6.可視化代價函數J(theta) ,看是否有最小值:
% 自動生成theta,-10到10-100個,-1到4-100個
theta0_vals = linspace(-10, 10, 100);
theta1_vals = linspace(-1, 4, 100);
J_vals = zeros(length(theta0_vals), length(theta1_vals));
%初始化對應的代價函數值,維數爲100*100
for i = 1:length(theta0_vals) %計算代價函數值
for j = 1:length(theta1_vals)
t = [theta0_vals(i); theta1_vals(j)]; %隨機生成的一條theta記錄
J_vals(i,j) = computeCost(X, y, t);
end
end
J_vals = J_vals'; %surface函數的特性,必須進行轉置。其實就是因爲θ0和θ1要和行列座標x,y對齊。
figure; %繪製表面圖
surf(theta0_vals, theta1_vals, J_vals)
xlabel('\theta_0'); ylabel('\theta_1');
% 7.使用等高線圖查看全局最小值
figure; %這裏的J_vals在前面進行了轉置,所以此處不用轉置!
contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 3, 20))
xlabel('\theta_0'); ylabel('\theta_1'); %用到了轉義字符'\theta_0'和'\theta_1'.
hold on;
plot(theta(1), theta(2), 'rx', 'MarkerSize', 10, 'LineWidth', 2);