目录


  • 疑问
  • 使用梯度下降法来解决问题
  • 进行特征缩放归一化
  • 0均值归一化
  • 线性归一化
  • 0均值归一化若不对非奇异特征进行放缩
  • 线性归一化若不对非奇异特征进行放缩
  • 带有0均值归一化和线性归一化的梯度下降法代码整理
  • 正规方程


又是好久没更博了。这次带着老早就知道的多元线性回归以及利用梯度下降法和正规方程法来解决一个简单问题的实验,并由此引申至更复杂的实验推广。


首先名词解释
多元线性回归
梯度下降法

疑问

1.x1与 x2,x3有一定关联要如何处理?

2.对

多元线性回归画什么图 多元线性回归方程图_多元线性回归画什么图


,矩阵每一行都点乘一个1X3的向量,用循环来实现 和 将向量变成同维矩阵相点乘来实现,哪样速度更快?

3.特征放缩的时候要对非奇异特征进行放缩吗?
答:不用


使用梯度下降法来解决问题

通过matlab代码来完成。
由于问题特征变量较多,所以先将问题简化,从而简化代码。通过运行代码以及绘图情况将代码调整到较佳状态。

现假设样本点(0,1)(2,2)(4,3),经过一条直线

clear
x=zeros(2,3);x(1,:)=1;  %现在假设有 1个特征+一个非奇异特征=2,3个样本
die=100;                   %迭代10次
th=zeros(die,2);          %对应2个thita;3个样本

%引入样本数据
x(2,:)=[0 2 4];
y=[1 2 3];

a=0.03;                %暂令学习率alpah=0.03
for k=1:die-1
    h=th*x;             %矩阵第一行为各个样本假设函数的值
    for i=1:2
        th(k+1,i)=th(k,i)-a*sum((h(k,:)-y).*x(i,:));
    end
end
th

绘制代价函数J的图:
clear
x=-4:0.03:5;
y=-4:0.03:5;
[x,y] = meshgrid(x,y);

z=0.5.*((x-1).^2+(x+2*y-2).^2+(x+4*y-3).^2);

subplot(2,2,1);
mesh(x,y,z)
subplot(2,1,2);
contourf(x,y,z)
subplot(2,2,2);
surfc(x,y,z)
shading interp


等高线的图是一个很扁的椭圆。所以梯度下降的路径可能会很曲折,导致梯度下降的速度很慢,需要很长时间才能找到全局最小值。经过计算也确实验证了寻找值很慢的事实。

进行特征缩放(归一化)

1. 0均值归一化

clear
n=3;%样本个数
xa=zeros(2,n);xa(1,:)=1;  %现在假设有 1个特征+一个非奇异特征=2,n个样本

%引入样本数据
xa(2,:)=[0 2 4];
ya=[1 2 3];

%数据归一化
u=sum(xa,2)/n;%计算样本集的均值
for i=1:2
    e(i,1)=sqrt(sum((xa(i,:)-u(i)).^2)/n);%计算样本集的标准差
end
for i=1:2
    xa(i,:)=(xa(i,:)-u(i))/(e(i)+eps);%0均值归一化
end

x=-4:0.03:5;
y=-4:0.03:5;
[x,y] = meshgrid(x,y);

j=zeros(301,301,n);%建立一个三维矩阵,每一层来保存每个样本的代价函数值矩阵
for i=1:n
    j(:,:,i)=0.5*(xa(1,i)*x+xa(2,i)*y-ya(i)).^2;
end
z=sum(j,3);        %代价函数值

subplot(2,2,1);
mesh(x,y,z)
subplot(2,1,2);
contourf(x,y,z)
subplot(2,2,2);
surfc(x,y,z)
shading interp


我也不知道发生了什么。。。这图够奇怪了。。。

2. 线性归一化

clear
n=3;%样本个数
xa=zeros(2,n);xa(1,:)=1;  %现在假设有 1个特征+一个非奇异特征=2,n个样本

%引入样本数据
xa(2,:)=[0 2 4];
ya=[1 2 3];

%数据归一化
xax=max(xa,[],2);
xai=min(xa,[],2);
for i=1:2
    xa(i,:)=(xa(i,:)-xai(i))/(xax(i)-xai(i)+eps);%线性归一化
end

x=-4:0.03:5;
y=-4:0.03:5;
[x,y] = meshgrid(x,y);

j=zeros(301,301,n);%建立一个三维矩阵,每一层来保存每个样本的代价函数值矩阵
for i=1:n
    j(:,:,i)=0.5*(xa(1,i)*x+xa(2,i)*y-ya(i)).^2;
end
z=sum(j,3);        %代价函数值

subplot(2,2,1);
mesh(x,y,z)
subplot(2,1,2);
contourf(x,y,z)
subplot(2,2,2);
surfc(x,y,z)
shading interp


我真的不知道发生了什么。。。==

于是神奇的事情发生了。。

1.0均值归一化(若不对非奇异特征进行放缩)

可视效果超级棒的样子!!

线性归一化(若不对非奇异特征进行放缩)

效果还不错:


想想也是。。。要是对非奇异特征进行归一化不就相当于令x0为零向量嘛。。。所以以后记住啦!!且在自己假设的这道题中0均值归一化效果更好。

带有0均值归一化和线性归一化的梯度下降法代码整理

clear
n=3;                    %样本个数
f=2;                    %特征个数
a=0.03;                 %暂令学习率alpah=0.03
x=zeros(f,n);x(1,:)=1;  %现在假设有 1个特征+一个非奇异特征=2,n个样本
die=1000;               %迭代次数上线1000次

%引入样本数据
x(2,:)=[0 2 4];
y=[1 2 3];

% %数据0均值归一化
% u=sum(x,2)/n;%计算样本集的均值
% for i=1:f
% e(i,1)=sqrt(sum((x(i,:)-u(i)).^2)/n);%计算样本集的标准差
% end
% for i=2:f%从非奇异特征之后进行归一化
% x(i,:)=(x(i,:)-u(i))/(e(i)+eps);%0均值归一化
% end

% %数据线性归一化
% xax=max(x,[],2);
% xai=min(x,[],2);
% for i=2:f%从非奇异特征之后进行归一化
%     x(i,:)=(x(i,:)-xai(i))/(xax(i)-xai(i)+eps);%线性归一化
% end

th(1,:)=zeros(1,f);     %初始化参数为零向量
for k=1:die-1           %k代表真实迭代次数
    h=th*x;             %矩阵第一行为各个样本假设函数的值
    for i=1:2
        th(k+1,i)=th(k,i)-a*sum((h(k,:)-y).*x(i,:));
    end
    if abs(th(k+1,:)-th(k,:))<0.5e-6
        break
    end
end
th,k

根据迭代次数k,会发现0均值归一化在这道题中确实好用。但是看到结果又会发现一个问题,就是归一化和不归一化迭代到最后收敛的参数值答案是不一样的。开始我没有想通这个问题,后来发现当你归一化特征变量的值x之后,其实也相当于更改了我们要寻找的参数值。所以不要惊慌于怎么计算出来的结果和不进行归一化计算出来的结果有所不同。整个多元线性回归的过程仍然还是一样的。

正规方程

天。。。用正规方程解才知道有多简单,难怪有人说当特征的个数n<10000时都采用正规方程来解题。以后记住啦
代码:

clear
x=[1 2;
   1 4];
y=[2 3]';
th=inv(x'*x)*x'*y

结果:

h =
    1.0000
    0.5000