Coursera-MachineLearning-LinearRegression

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

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章