https://www.bilibili.com/video/BV164411b7dx?p=18
视频课来自b站吴恩达机器学习,第二章单变量的梯度下降代码尝试。
假设函数设为:
原始数据(自己编的):x = [1,2,3,4];y = [1,2,3,4];
matlab代码如下:
function [theta_1,theta_2] = homework_1(x,y)
alpha = 0.1;
plot(x,y,'b+')
hold on
ka = 0.0001;% 设定的代价值
J = 10;% 初始代价值,多少无所谓
[m,n] = size(x);
theta_1 = 0;
theta_2 = 0;% 初始模型参数theta的值,一般为0,反正最后要算,多少无所谓
while J > ka
h = theta_1 + theta_2 .* x;% 假设函数
% 求偏导
df_1 = zeros(1,n);
df_2 = zeros(1,n);
for ii = 1:n
df_1(ii) = (theta_1 + theta_2.*x(ii) - y(ii));
end
for ii = 1:n
df_2(ii) = (theta_1 + theta_2.*x(ii) - y(ii)) * x(ii);
end
J_1 = sum1(df_1)/(4);
J_2 = sum1(df_2)/(4);% 计算偏导
% 更新参数,必须一起更新
theta_1 = theta_1 - alpha * J_1;
theta_2 = theta_2 - alpha * J_2;% 更新参数
% 计算代价函数
J0 = zeros(1,4);
for i = 1:n
J0(i) = (h(i) - y(i))^2;
end
J= sum1(J0)/(2*n);% J为代价,越小代表拟合越接近
end
plot(x,h,'g')
end
其结果如图:
刚开始学,一些语法能够优化也没有优化,大家随便看看就好。