使用课程推荐的Octave
进行编程实现,可以将Octave
理解为开源版本的MATLAB
-
读入数据
data = load('ex1data1.txt'); % 导入的数据文件为用逗号隔开的两列,第一列为x,第二列为y X = data(:, 1); y = data(:, 2); % 可以尝试绘图 % figure;plot(x,y); m = length(y);
数据分布图如下:
-
梯度下降前的数据预处理与设置
X = [ones(m,1),data(:,1)]; % 添加x0列,都设为1 theta = zeros(2,1); % 初始化θ值 % 梯度下降的一些设置信息 iterations = 1500; % 迭代次数 alpha = 0.01; % 学习率α
-
计算损失函数
线性回归的损失函数为:
% 定义一个函数computeCost来计算损失函数 function J = computeCost(X, y, theta) m = length(y); predictions = X*theta; % 计算预测值hθ sqerrors = (predictions - y).^2; % 计算平方误,矩阵的点乘运算得到的是一个向量 J = 1/(2*m)* sum(sqerrors); end
-
执行梯度下降
% 定义一个函数gradientDescent来执行梯度下降,为了后面观察梯度下降过程中损失函数的变化,记录每一步迭代后的损失函数值 function [theta, J_history] = gradientDescent(X, y, theta, alpha, iterations) m = length(y); J_history = zeros(num_iters, 1); % 以迭代次数为唯一迭代终止条件 for iter = 1:num_iters % 计算梯度 predictions = X*theta; updates = X'*(predictions - y); theta = theta - alpha*(1/m)*updates; J_history(iter) = computeCost(X, y, theta); end end
-
绘制拟合直线
hold on; % 保留之前的绘图窗口,在这个绘图窗口继续画出拟合直线 plot(X(:,2), X*theta, '-'); legend('Training data', 'Linear regression');
网友评论