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);