机器学习笔记(二)线性回归实现

一、向量化

对于大量的求和运算,向量化思想往往能提高计算效率(利用线性代数运算库),无论我们在使用MATLAB、Java等任何高级语言来编写代码。

运算思想及代码对比

 

的同步更新过程向量化

 

向量化后的式子表示成为:

其中是一个向量,是一个实数,是一个向量,所以在这里是做一个向量的减法。在将计算向量化的同时,这种运算方式使我们很好地实现了的同步更新,我自行推导了一下,体会运算过程中的同步更新是如何实现。

 

 

二、 简单一元线性回归实现

数据:是房子的大小(平方英尺)和房价(美元)之间的对应关系。

练习:Matlab实现

%简单一元线性回归练习
theta_0 = 0;
theta_1 = 0;
alpha = 0.000001;
x = [150; 200; 250; 300; 350; 400; 600];
y = [6450; 7450; 8450; 9450; 11450; 15450; 18450];
%画出点
plot(x, y, 'r*', 'MarkerSize', 8); % 5控制*的大小
hold on;

counter = 50;
[theta_0, theta_1] = gradientDescent_LOW(x, y, theta_0, theta_1, alpha, counter);
b = theta_0 + theta_1 * x;
%画出拟合直线
plot(x, b, 'b-', 'Linewidth',2); % 5控制*的大小
hold on;
xlabel('面积/平方英尺');
ylabel('房价/美元');
title('一元线性回归');
function [theta_0, theta_1] = gradientDescent_LOW(x, y, theta_0, theta_1, alpha, counter)
%此处x为向量
m = length(y); %样本数量

for iter = 1:counter
    H = theta_0 + theta_1 * x; %线性假设函数
    
    %计算代价函数输出
    res = 0;
    for i = 1:m
        res = res + (H(i)-y(i))^2;
    end
    Jtheta = res/(2*m)
    
    %更新theta_0
    sum = [0;0]; %记录两个偏导部分(求和过程)
    for i = 1:m
        sum(1,1) = sum(1,1) + (H(i)-y(i));
    end
    theta_0 = theta_0 - alpha * sum(1,1)/m;
    %更新theta_1
    for i = 1:m
        sum(2,1) = sum(2,1) + (H(i)-y(i)) * x(i);
    end
    theta_1 = theta_1 - alpha* sum(2,1)/ m ;
    
 end

得到拟合图像:

提出问题:

1. 使alpha、counter取值规范

加入特征缩放后,alpha取0.03,counter = 1500。能够达到较好的拟合效果。

%特征缩放
for i = 1:length(y)
    x(i) = (x(i)-min(x))/(max(x)-min(x))
    y(i) = (y(i)-min(y))/(max(y)-min(y))
end

 

拟合图像

2.  梯度下降迭代结束标志

    a)  定义一个合理的阈值,当两次迭代之间的差值小于该阈值时,迭代结束。

    b) 设置一个大概的迭代步数,比如1000或500。

 三、多元线性回归实现

1. 梯度下降法

数据:波士顿房价数据集(经个别剔除)共419条数据

(理论推导见上一篇笔记,直接上代码)

%test2.m
[Data] = xlsread('Boston house prise.xlsx',1,'A1:M419');
[y] = xlsread('Boston house prise.xlsx',1,'N1:N419');
[m,n] = size(Data); % m样本数量 n特征数
Data = featureScaling(Data);
y = featureScaling(y);
x0 = ones(m,1);

X = ([x0,Data])';

Theta = zeros(n+1,1);
alpha = 0.009;
counter = 1500;
Theta = gradientDescent(X, y, Theta, alpha, counter);
plot(1:m, y, 'r-', 'Linewidth',1); % 5控制*的大小
hold on;
plot(1:m, Theta'*X, 'b-', 'Linewidth',1); % 5控制*的大小
hold on;
xlabel('样例序号');
ylabel('房价');
title('梯度下降-波士顿房价预测');
legend('真实值','预测值');
%梯度下降(矢量化)
function [Theta] = gradientDescent(X, y, Theta, alpha, counter) % X Theta 均为矩阵 [m,n] = size(X); % m样本数量 n特征数 J_history = zeros(counter, 1); for iter = 1:counter H = Theta' * X; %线性假设函数 Delta = 1/m * X *(H'-y); Theta = Theta - alpha * Delta; % 保存下所有J,可以查看收敛情况 res = 0; for i = 1:m res = res + (H(i)-y(i))^2; end J_history(iter) = res/(2*m); end J_history end
%特征放缩
function [X] = featureScaling(X)
%X 为矩阵,每一列为一组特征值
[m,n] = size(X);
for j = 1:n
    for i = 1:m
        X(i,j) = (X(i,j)-min(X(:,j)))*1/(max(X(:,j))-min(X(:,j)));
    end
end

2. 正规方程法

 (理论部分见上一篇笔记)

[X] = xlsread('Boston house prise.xlsx',1,'A1:M419');
[y] = xlsread('Boston house prise.xlsx',1,'N1:N419');
theta = pinv(X'* X)* X'*y
[m,n] = size(X);    % m样本数量 n特征数
plot(1:m, y, 'r-', 'Linewidth',1);   
plot(1:m, theta'*X', 'b-', 'Linewidth',1);  

输出结果:

                                梯度下降法                                          正规方程法                                                                            

总结:

1. 在运算中多用矢量化的思想。

2. 在多元线性回归的实现中,随着参数的增多,愈加体现出在梯度下降法当中,参数和初始值选择对结果是有很大影响的。

3. 在本次用波士顿房价数据进行实验的过程中,正规方程法的拟合效果优于梯度下降法。

 

猜你喜欢

转载自www.cnblogs.com/veraLin/p/9946259.html