- 加载数据
% 单变量
data = load('ex1data1.txt');
X = data(:, 1); % m*1矩阵
y = data(:, 2); % m*1矩阵
m = length(y); % number of training examples
% 多变量
data = load('ex1data2.txt');
X = data(:, 1:2); % m*2矩阵
y = data(:, 3); % m*1矩阵
m = length(y);
- 代价函数 (两者公式一样,多变量为例)计算不同theta下的代价
X = [ones(m, 1) X];
theta = zeros(3, 1);
h_theta = X*theta; % 假设函数,X是m*n矩阵,theta是n*1列向量,m样本数,n特征数
J = (1/(2*m))*(h_theta-y)'*(h_theta-y);
- 梯度下降 更新theta值
alpha = 0.01;
num_iters = 400;
for iter = 1:num_iters % 更新num_iters次
h_theta = X*theta; % 假设函数
theta = theta-(alpha/m)*((h_theta-y)'*X)';
% ((h_theta-y)'*X)得到1*n向量,n是特征数,theta是n*1向量
end
- 特征归一化(梯度下降提高收敛速度,正规方程不用)
mu = mean(X); % 对每一列求均值
sigma = std(X); % 对每一列求标准差
for i=1:size(X,1) % 对每一行进行归一化
X_norm(i,:) = (X(i,:)-mu)./sigma;
end
- 正规方程
theta = pinv(X'*X)*X'*y;
- 绘图
- 收敛曲线
figure;
plot(1:numel(J_history), J_history, '-b', 'LineWidth', 2); % numel返回J_history个数
xlabel('Number of iterations');
ylabel('Cost J');
- 绘制样本点和拟合曲线
% 绘制样本点
plot(x,y,'rx','MarkerSize',10);
ylabel('Profit in $10,000s');
xlabel('Population of City in 10,000s');
% 绘制假设函数曲线/拟合曲线
hold on; % keep previous plot visible
plot(X(:,2), X*theta, '-')
legend('Training data', 'Linear regression')
hold off
- 绘制不同theta下代价函数
theta0_vals = linspace(-10, 10, 100);
theta1_vals = linspace(-1, 4, 100);
J_vals = zeros(length(theta0_vals), length(theta1_vals));
% Fill out J_vals
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
J_vals = J_vals'; % surf和contour命令需要转置
figure;
surf(theta0_vals, theta1_vals, J_vals)
xlabel('\theta_0'); ylabel('\theta_1');
- 绘制不同theta下代价函数 等高线图
figure;
contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 3, 20))
xlabel('\theta_0'); ylabel('\theta_1');
hold on;
plot(theta(1), theta(2), 'rx', 'MarkerSize', 10, 'LineWidth', 2);
- 梯度下降(公式一样) 用于更新theta值
-
alpha = 0.01; num_iters = 400; for iter = 1:num_iters h_theta = X*theta; theta = theta-(alpha/m)*((h_theta-y)'*X)'; end