单变量线性回归——梯度下降MATLAB实现

参考吴恩达机器学习视频,此为其线性回归作业。
ex1_1
假设回归函数为:
hypothesis
选择参数:θ0,θ1。
选择的参数决定了得到的直线相对于训练集的准确程度,模型所预测的值与训练集中实际值之间的差距就是建模误差(modeling error)。
目标便是选择出可以使得建模误差的平方和能够最小的模型参数。 即使得代价函数最小。
代价函数为:
cost function
求代价函数的最小值:
minimize
对代价函数的参数求偏导,解出代价函数最小值。
此处引入梯度下降算法:
梯度下降是一个用来求函数最小值的算法,其背后的思想是:开始时随机选择一个参数的组合(θ0,θ1, . . . . . . , θn),计算代
价函数,然后寻找下一个能让代价函数值下降最多的参数组合。持续这么做直到一个局部最小值(local minimum),因为并没有尝试完所有的参数组合,所以不能确定得到的局部最小值是否便是全局最小值(global minimum),选择不同的初始参数组合,可能会找到不同的局部最小值。
算法公式为:
gradient descent
其中α是学习率(learning rate),它决定了沿着能让代价函数下降程度最大的方向向下迈出的步子有多大,在批量梯度下降中,每一次都同时让所有的参数减去学习速率乘以代价函数的导数。

同步更新:
simultaneous update
以下是作业1用MATLAB实现:
导出数据集,并画图显示。

clear
clc
data = load('ex1data1.txt');  %读取训练集
x = data(:, 1); 
y = data(:, 2);
m = length(y);  %训练集数量
figure(1)
plot(x, y, 'rx', 'MarkerSize', 10);  %画图
ylabel('Profit in $10,000s');  %设置y轴标签
xlabel('Population of City in 10,000s');  %设置x轴标签
hold on;

训练集
梯度下降MATLAB实现代码:

x0 = [ones(m, 1), data(:,1)]; % Add a column of ones to x
theta = zeros(2, 1); % initialize fitting parameters

iterations = 2000; %迭代最大次数
alpha = 0.01; %学习率  %改变学习率,结果不一样
s = zeros(iterations, 1);  %代价函数中的累加值
J = zeros(iterations, 1);  %代价函数值

for k = 1:1:iterations 
    p = zeros(2, 1);  %迭代一次,累计清零
    for i = 1:1:m
        s(k) = s(k)+(theta(1)+theta(2)*x(i)-y(i))^2; %求J函数的累加
        %求偏导
        p(1) = p(1)+(theta(1)+theta(2)*x(i)-y(i)); %对theta1求偏导的累加
        p(2) = p(2)+((theta(1)+theta(2)*x(i)-y(i))*x(i)); %对theta2求偏导的累加       
    end         
    J(k) = s(k)/(2*m);  %代价函数       
    theta = theta-(alpha/m)*p;
    if k>1  %为了下面k-1有索引
        if J(k-1)-J(k)<1e-5   %若误差小于0.00001,则停止迭代         
             break;
        end
    end
end
theta  %输出显示theta的值
y = theta(1)+theta(2)*x; %得到拟合直线
plot(x,y)  %在图1中画出拟合结果
grid on

结果:

theta =

-3.7220
1.1756

拟合直线

再显示代价函数J(θ)的曲线:

figure(2)  %2
plot(J)  %画出代价函数
ylabel('J(θ)'); % Set the y axis label
xlabel('iterations'); % Set the x axis label
grid on

代价函数
可以看出大约在800次迭代后,代价函数就趋于平缓。根据设定的0.00001误差要求,在1735次后停止迭代。

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值