【MATLAB】机器学习: 线性回归实验(梯度下降+闭式解)

实验内容

1.根据梯度下降法完成一元线性回归实验。
2.根据闭式解完成一元线性回归实验。
3.比较两种解下的实验结果。

实验代码

clear;clc;
%% 数据导入;划分训练集和测试集
% 数据导入
data=load("ex1data1.txt");
X=data(:,1);
Y=data(:,2);
% 划分训练集和测试集
ind=[];Train_ind=[];Test_ind=[];    % 随机数索引;训练集索引;测试集索引
ind=randperm(length(X));
Train_ind=ind(1:round(length(ind)*(2/3)));  % 训练集样本索引
Test_ind=ind(round(length(ind)*(2/3))+1:end);   % 测试集样本索引
Xtrain=X(Train_ind,:);     % X中的训练样本
Xtest=X(Test_ind,:);       % X中的测试样本
Ytrain=Y(Train_ind,:);     % Y中的训练样本
Ytest=Y(Test_ind,:);       % Y中的测试样本
%% 梯度下降求解一元线性回归
m=length(Xtrain);
X_train1=[ones(m,1),Xtrain];
theta=zeros(2,1);
iterations=1500;    % 设置迭代次数为1500
alpha=0.01;         % 设置梯度下降步长为0.01
[theta_1, J_history] = gradientDescent(X_train1, Ytrain, theta, alpha, iterations);
%% 闭式解求解一元线性回归
[w,b] = closed_formSolution(Xtrain,Ytrain);
theta_2=[b;w];
%% 绘制两种方法的图像
scatter(Xtrain,Ytrain); % 绘制真实数据的散点图
hold on;
x=0:1:25;
y1=theta_1(2,1).*x+theta_1(1,1);    % 梯度下降求解的y1函数
y2=theta_2(2,1).*x+theta_2(1,1);    % 闭式解求解的y2函数
plot(x,y1,'-xb',x,y2,':.r');    % 绘制y1和y2的图像
xlabel('x');
ylabel('y');
legend('真实数据点:(x,y)','梯度下降求解:y=1.1816x-3.5597','闭式解求解:y=1.2114x-3.8586','best');
%% 使用均方误差衡量两种方法的优劣
Ytest_predict1=theta_1(2,1).*Xtest+theta_1(1,1);    % 使用梯度下降求解得到的测试集的预测值
Ytest_predict2=theta_2(2,1).*Xtest+theta_2(1,1);    % 使用闭式解求解得到的测试集的预测值
mse=zeros(2,1);
mse(1,1)=sum((Ytest_predict1-Ytest).^2,1);  % 梯度下降的均方误差
mse(2,1)=sum((Ytest_predict2-Ytest).^2,1);  % 闭式解的均方误差



%% **********************函数一(梯度下降)*********************
%定义一个实现梯度下降的函数
function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
m = length(y);%取数据的长度
J_history = zeros(num_iters, 1);%定义J_history为num_iters行1列的向量
%其中,num_iters是在调用该梯度下降函数时的参数
for iter = 1:num_iters
    S = (1 / m) * (X' * (X * theta - y));%相当于求导
    theta = theta - alpha .* S;%theta的更新
    J_history(iter) = computeCost(X, y, theta);%在这里调用computeCost(X, y, theta)
 %相当于在慢慢的减小代价函数
end
end

function J = computeCost(X, y, theta)
% 函数功能:求代价函数
m = length(y); % y的数据量
J = 0;
%h(x)
h = X*theta;
loss = (h-y).^2;
J = 1/(2*m)*(X*theta-y)'*(X*theta-y);
end

%% **********************函数二(闭式解)*********************
function [w,b] = closed_formSolution(X,Y)
% 函数功能:闭式解求出一元线性回归函数Y=ωX+b中的ω和b
% 输入参数:X表示自变量;Y表示因变量
% 函数返回值:w表示自变量X的系数;b表示常量

m=length(X);    % 取X的长度,

X_mean=mean(X,1);
tmp=repmat(X_mean,m,1);
w_top=sum(Y.*(X-tmp),1);
w_bottom=sum(X.*X,1)-(sum(X,1))^2/m;
w=w_top/w_bottom;

b=sum(Y-w*X,1)/m;
end

实验结果

实验心得

通过本次“线性回归实验”,加深了我对梯度下降和闭式解两种方法的理解,并且能够熟练使用。在回归任务的度量中,可以使用均方误差。绘制散点图时,可以使用scatter函数。

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Orange_Jet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值