包括单特征的样本的最小二乘法计算, 单特征样本的梯度下降法--代数版本 多特征样本的梯度下降--矩阵运算表示。 在矩阵表示的梯度下降法中运用标准差归一化(可选择注释)。 有比较详细的注释
clear;
clc;
X=[0,1,2,3,4,5,6];
Y=[0,1.1,2.2,2.7,4.1,4.9,5.6];
%最小二乘法
XY_ = mean(X.*Y);
X_Y_ = mean(X)*mean(Y);
X2_ = mean(X.*X);
X_2 = mean(X)*mean(X);
a=(XY_-X_Y_)/(X2_-X_2);
Y_ = mean(Y);
X_ = mean(X);
b=Y_-a*X_;
%显示,画图
% figure;
% scatter(X,Y);
% hold on;
% x=0:0.1:6;
% y=a*x+b;
%梯度下降法
a1 = 0;
b1 = 0;
s = 0.01;
delt = 0.01;
as = -XY_+a1*X2_+b*X_;
bs = -Y_+a1*X_+b1;
while abs(as)>delt || abs(bs)>delt
a1 = a1-s*as;
b1 = b1-s*bs;
as = -XY_+a1*X2_+b*X_;
bs = -Y_+a1*X_+b1;
end;
%显示,画图
% x1=0:0.1:6;
% y1=a1*x1+b1;
% plot(x,y,'r',x1,y1,'y');
%多维特征样本的矩阵梯度下降法
%y代表样本结果,它是一个m行,1列的矩阵,m代表样本数目
y=[0;1.1;2.2;2.7;4.1;4.9;5.6];
%x_ 代表样本训练输入数据,它是一个m行,n列的矩阵,m代表样本数目,n代表特征数目
%此时为单特征矩阵
x_=[0;1;2;3;4;5;6];
[m,n]=size(x_);
%在这一部分程序是对每个特征的数据进行标准差归一化,有助于设置步长,阈值等参数
%这样可以统一样本特征数据范围,使迭代次数加快
%那么对于使用最后的模型时,别忘记对输入值进行改变
% mean_x=mean(x_,1);%得到每个特征的均值
% std_x=std(x_,1);%得到每个特征的标准差
% mean_xx=repmat(mean_x,m,1);%扩展成矩阵
% std_xx=repmat(std_x,m,1);%扩展成矩阵
% x_=(x_-mean_xx)./std_xx;%标准差归一化
%训练数据增加一列特征,为了方便处理 截距参数
c=ones(m,1);
x=[x_ c];
%k 为参数向量,它是一个n+1列的矩阵,n是参数数目
k=zeros(n+1,1);
%线性假设函数为 Y=x*k
%那么损失函数为 f=0.5*(x*k-y)'*(x*k-y) ,'是转置
%对损失函数对k求偏导得 partial_Derivative = x'*(x*k-y)
partial_Derivative = x'*(x*k-y);
%设置步长step,随便设,但是过大会引起振荡,过小收敛速度太慢
step=0.001;
%设置收敛阈值 threshold
threshold = 0.01;
%获取偏微分绝对值
partial_Derivative_abs = abs(partial_Derivative);
%梯度下降距离
while max(max(partial_Derivative_abs))>threshold
k = k-partial_Derivative*step;
partial_Derivative = x'*(x*k-y);
partial_Derivative_abs = abs(partial_Derivative);
end;
%输出计算参数,用的都是单特征的样本数据
[a b]%最小二乘法直接计算
[a1 b1]%单特征梯度下降法代数法
[k']%多特征梯度下降法矩阵表示