zoukankan      html  css  js  c++  java
  • 机器学习笔记(二)线性回归模型实现

    一、向量化

    对于大量的求和运算,向量化思想往往能提高计算效率(利用线性代数运算库),无论我们在使用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. 在本次用波士顿房价数据进行实验的过程中,正规方程法的拟合效果优于梯度下降法。

     

  • 相关阅读:
    公用表表达式(CTE)的递归调用
    c# 如何让tooltip显示文字换行
    实战 SQL Server 2008 数据库误删除数据的恢复
    SQL SERVER数据库中 是否可以对视图进行修改删除
    asp.net中实现文件批量上传
    sql server 2008学习2 文件和文件组
    sql server 2008学习3 表组织和索引组织
    sql server 2008学习4 设计索引的建议
    sql server 2008学习10 存储过程
    .net 调用 sql server 自定义函数,并输出返回值
  • 原文地址:https://www.cnblogs.com/veraLin/p/9946259.html
Copyright © 2011-2022 走看看