zoukankan      html  css  js  c++  java
  • 线性回归(linear regression)

     基本形式

    最小二乘法估计拟合参数

    最小二乘法:基于均方误差最小化来进行模型求解的方法称为“最小二乘法”(least square method)

          即(左边代表 $mathbf{omega }$ 和 b 的解)

    为了计算的方便,可以把常数 b 看出一个特殊的值为 1 的 x 。

     将 $mathbf{omega }$ 和 b 吸收入向量形式,如下所示:

    $X = egin{pmatrix}
    x_{11} &x_{12} &... &x_{1d} &1\
    x_{21} &x_{2} &... &x_{2d} &1\
    vdots &vdots &ddots &vdots &vdots \
    x_{m1} &x_{m2} &... &x_{md} &1
    end{pmatrix} = egin{pmatrix}
    mathbf{x_{1}^{T}}& 1\
    mathbf{x_{2}^{T}}&1 \
    vdots & vdots \
    mathbf{x_{m}^{T}}& 1
    end{pmatrix}$

    把标记也写成向量形式$mathbf{y}=(y_{1};y_{2};...;y_{m})$,则参数的求解为:

    $ hat{mathbf{omega} }^{*}=_{hat{mathbf{omega} }}^{arg min}  extrm{}(mathbf{y}-mathbf{X}hat{mathbf{omega} })^{T}(mathbf{y}-mathbf{Xhat{mathbf{omega} }})$

    令$E_{hat{mathbf{omega} }}=(mathbf{y}-mathbf{X}hat{mathbf{omega} })^{T}(mathbf{y}-mathbf{Xhat{mathbf{omega} }})$,对$hat{mathbf{omega} }$求导得到:

    $frac{partial E_{hat{mathbf{omega} }}}{partialhat{mathbf{omega} }} = 2mathbf{X}^{T}(mathbf{Xhat{mathbf{omega} }-mathbf{y}})$

     

    要得到这个求导结果,需要知道一些矩阵求导的常见性质:

    $f(x)=Ax,则frac{partial f(x)}{partial x^{T}}=frac{partial (Ax)}{partial x^{T}}=A$ 

    $f(x)=x^{T}Ax,则frac{partial f(x)}{partial x}=frac{partial (x^{T}Ax)}{partial x}=Ax+A^{T}x$

    $f(x)=a^{T}x,则frac{partial f(x)}{partial x}=frac{partial (a^{T}x)}{partial x}=frac{partial x^{T}a}{partial x}=a$

     

    令上式为0即可得参数的最优解,由于涉及到矩阵逆计算,所有只有当$mathbf{X}^{T}mathbf{X})^{-1}$为满秩矩阵或正定矩阵才可以得到如下结果:

    $hat{mathbf{omega} }^{*}=(mathbf{X}^{T}mathbf{X})^{-1}mathbf{X}^{T}mathbf{y}$

     

    简单例子

    该例子来自《机器学习实战》。

    数据如下:

    这里第一列均为1,目的就是将式子中的b转化为1。

    首先可以绘制图形大致观察一下:

    只要明白上面的,计算参数其实很简单,代码如下:

     1 import numpy as np
     2 
     3 
     4 def load_data_set(filename):    # 数据导入
     5     fr = open(filename)
     6     num_feat = len(open(filename).readline().split('	'))-1
     7 
     8     data_mat = []
     9     label_mat = []
    10 
    11     for line in fr.readlines():
    12         line_arr = []
    13         cur_line = line.strip().split('	')
    14         for i in range(num_feat):
    15             line_arr.append(float(cur_line[i]))
    16 
    17         data_mat.append(line_arr)
    18         label_mat.append(float(cur_line[-1]))
    19     return data_mat, label_mat
    20 
    21 
    22 def stand_regress(x_arr, y_arr):  # 计算拟合参数
    23     x_mat = np.mat(x_arr)
    24     y_mat = np.mat(y_arr).T
    25     xtx = x_mat.T * x_mat
    26     if np.linalg.det(xtx) == 0:
    27         print("This matrix is singular, cannot do inverse")
    28         return
    29     ws = xtx.I * x_mat.T * y_mat  
    30     return ws    # 返回最后得到的参数值

    第一个函数打开用tab分隔的文本文件,提取出其中的数据。

    第二个函数计算最佳拟合直线,代码中numpy的linalg.det()可以计算行列式的值。计算的公式直接套用上面所讲的最终公式即可。

    最后得到的参数值为:

  • 相关阅读:
    【Netty之旅四】你一定看得懂的Netty客户端启动源码分析!
    Netty之旅三:Netty服务端启动源码分析,一梭子带走!
    【原创】经验分享:一个Content-Length引发的血案(almost....)
    Netty之旅二:口口相传的高性能Netty到底是什么?
    Java解压和压缩带密码的zip文件过程详解
    SQLServer安装教程(史上最详细版本)
    26.Vue技术栈开发实战-项目部署
    25.Vue技术栈开发实战-多Tab页开发
    6-6 创建产品卡片组件(1)
    6-5 创建垂直网格组件
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/10463229.html
Copyright © 2011-2022 走看看