系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI
点击star加星不要吝啬,星越多笔者越努力。

5.1 正规方程解法

英文名是 Normal Equations。

对于线性回归问题,除了前面提到的最小二乘法可以解决一元线性回归的问题外,也可以解决多元线性回归问题。

对于多元线性回归,可以用正规方程来解决,也就是得到一个数学上的解析解。它可以解决下面这个公式描述的问题:

\[y=a_0+a_1x_1+a_2x_2+\dots+a_kx_k \tag{1}\]

5.1.1 简单的推导方法

在做函数拟合(回归)时,我们假设函数H为:

\[h(w,b) = b + x_1 w_1+x_2 w_2+...+x_n w_n \tag{2}\]

令\(b=w_0\),则:

\[h(w) = w_0 + x_1 \cdot w_1 + x_2 \cdot w_2+...+ x_n \cdot w_n\tag{3}\]

公式3中的x是一个样本的n个特征值,如果我们把m个样本一起计算,将会得到下面这个矩阵:

\[H(w) = X \cdot W \tag{4}\]

公式5中的X和W的矩阵形状如下:

\[
X =
\begin{pmatrix}
1 & x_{1,1} & x_{1,2} & \dots & x_{1,n} \\
1 & x_{2,1} & x_{2,2} & \dots & x_{2,n} \\
\dots \\
1 & x_{m,1} & x_{m,2} & \dots & x_{m,n}
\end{pmatrix} \tag{5}
\]

\[
W= \begin{pmatrix}
w_0 \\
w_1 \\
\dots \\
w_n
\end{pmatrix} \tag{6}
\]

然后我们期望假设函数的输出与真实值一致,则有:

\[H(w) = X \cdot W = Y \tag{7}\]

其中,Y的形状如下:

\[
Y= \begin{pmatrix}
y_1 \\
y_2 \\
\dots \\
y_m
\end{pmatrix} \tag{8}
\]

直观上看,W = Y/X,但是这里三个值都是矩阵,而矩阵没有除法,所以需要得到X的逆矩阵,用Y乘以X的逆矩阵即可。但是又会遇到一个问题,只有方阵才有逆矩阵,而X不一定是方阵,所以要先把左侧变成方阵,就可能会有逆矩阵存在了。所以,先把等式两边同时乘以X的转置矩阵,以便得到X的方阵:

\[X^T X W = X^T Y \tag{9}\]

其中,\(X^T\)是X的转置矩阵,\(X^T X\)一定是个方阵,并且假设其存在逆矩阵,把它移到等式右侧来:

\[W = (X^T X)^{-1}{X^T Y} \tag{10}\]

至此可以求出W的正规方程。

5.1.2 复杂的推导方法

我们仍然使用均方差损失函数:

\[J(w,b) = \sum (z_i - y_i)^2 \tag{11}\]

把b看作是一个恒等于1的feature,并把z=XW计算公式带入,并变成矩阵形式:

\[J(w) = \sum (x_i w_i -y_i)^2=(XW - Y)^T \cdot (XW - Y) \tag{12}\]

对w求导,令导数为0,就是W的最小值解:

\[
\begin{aligned}
{\partial J(w) \over \partial w} &= {\partial \over \partial w}[(XW - Y)^T \cdot (XW - Y)] \\
&={\partial \over \partial w}[(X^TW^T - Y^T) \cdot (XW - Y)] \\
&={\partial \over \partial w}[(X^TXW^TW -X^TW^TY - Y^TXW + Y^TY)]
\end{aligned}
\tag{13}
\]

求导后:

第一项的结果是:\(2X^TXW\)

第二项和第三项的结果都是:\(X^TY\)

第四项的结果是:0

再令导数为0:

\[
J'(w)=2X^TXW - 2X^TY=0 \tag{14}
\]
\[
X^TXW = X^TY \tag{15}
\]
\[
W=(X^TX)^{-1}X^TY \tag{16}
\]

结论和公式10一样。

以上推导的基本公式可以参考第0章的公式60-69。

逆矩阵\((X^TX)^{-1}\)可能不存在的原因是:

  1. 特征值冗余,比如\(x_2=x^2_1\),即正方形的边长与面积的关系,不能做为两个特征同时存在
  2. 特征数量过多,比如特征数n比样本数m还要大

以上两点在我们这个具体的例子中都不存在。

5.1.3 代码实现

我们把表5-1的样本数据带入方程内。根据公式(5),我们应该建立如下的X,Y矩阵:

\[
X = \begin{pmatrix}
1 & 10.06 & 60 \\
1 & 15.47 & 74 \\
1 & 18.66 & 46 \\
1 & 5.20 & 77 \\
\dots \\
\end{pmatrix} \tag{17}
\]

\[
Y= \begin{pmatrix}
302.86 \\
393.04 \\
270.67 \\
450.59 \\
\dots \\
\end{pmatrix} \tag{18}
\]

根据公式(10):

\[W = (X^T X)^{-1}{X^T Y} \tag{10}\]

  1. X是1000x3的矩阵,X的转置是3x1000,\(X^TX\)生成(3x3)的矩阵
  2. \((X^TX)^{-1}\)也是3x3
  3. 再乘以\(X^T\),即(3x3)x(3x1000)的矩阵,变成3x1000
  4. 再乘以Y,Y是1000x1,所以(3x1000)x(1000x1)变成3x1,就是W的解,其中包括一个偏移值b和两个权重值w,3个值在一个向量里
if __name__ == '__main__':
    reader = SimpleDataReader()
    reader.ReadData()
    X,Y = reader.GetWholeTrainSamples()
    num_example = X.shape[0]
    one = np.ones((num_example,1))
    x = np.column_stack((one, (X[0:num_example,:])))
    a = np.dot(x.T, x)
    # need to convert to matrix, because np.linalg.inv only works on matrix instead of array
    b = np.asmatrix(a)
    c = np.linalg.inv(b)
    d = np.dot(c, x.T)
    e = np.dot(d, Y)
    #print(e)
    b=e[0,0]
    w1=e[1,0]
    w2=e[2,0]
    print("w1=", w1)
    print("w2=", w2)
    print("b=", b)
    # inference
    z = w1 * 15 + w2 * 93 + b
    print("z=",z)

5.1.4 运行结果

w1= -2.0184092853092226
w2= 5.055333475112755
b= 46.235258613837644
z= 486.1051325196855

我们得到了两个权重值和一个偏移值,然后得到房价预测值z=486万元。

至此,我们得到了解析解。我们可以用这个做为标准答案,去验证我们的神经网络的训练结果。

代码位置

ch05, Level1

[ch05-01] 正规方程法解决多变量线性回归问题的更多相关文章

  1. [ch05-02] 用神经网络解决多变量线性回归问题

    系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力 5.2 神经网络解法 与单特征值的线性回归问题类似,多变量 ...

  2. Python基于回溯法解决01背包问题实例

    Python基于回溯法解决01背包问题实例 这篇文章主要介绍了Python基于回溯法解决01背包问题,结合实例形式分析了Python回溯法采用深度优先策略搜索解决01背包问题的相关操作技巧,需要的朋友 ...

  3. [Machine Learning] 多变量线性回归(Linear Regression with Multiple Variable)-特征缩放-正规方程

    我们从上一篇博客中知道了关于单变量线性回归的相关问题,例如:什么是回归,什么是代价函数,什么是梯度下降法. 本节我们讲一下多变量线性回归.依然拿房价来举例,现在我们对房价模型增加更多的特征,例如房间数 ...

  4. 斯坦福第四课:多变量线性回归(Linear Regression with Multiple Variables)

    4.1  多维特征 4.2  多变量梯度下降 4.3  梯度下降法实践 1-特征缩放 4.4  梯度下降法实践 2-学习率 4.5  特征和多项式回归 4.6  正规方程 4.7  正规方程及不可逆性 ...

  5. Ng第四课:多变量线性回归(Linear Regression with Multiple Variables)

    4.1  多维特征 4.2  多变量梯度下降 4.3  梯度下降法实践 1-特征缩放 4.4  梯度下降法实践 2-学习率 4.5  特征和多项式回归 4.6  正规方程 4.7  正规方程及不可逆性 ...

  6. 机器学习第4课:多变量线性回归(Linear Regression with Multiple Variables)

    4.1  多维特征 目前为止,我们探讨了单变量/特征的回归模型,现在我们对房价模型增加更多的特征, 例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为(x1,x2,...,xn).

  7. 机器学习 (二) 多变量线性回归 Linear Regression with Multiple Variables

    文章内容均来自斯坦福大学的Andrew Ng教授讲解的Machine Learning课程,本文是针对该课程的个人学习笔记,如有疏漏,请以原课程所讲述内容为准.感谢博主Rachel Zhang 的个人 ...

  8. Stanford机器学习---第二讲. 多变量线性回归 Linear Regression with multiple variable

    原文:http://blog.csdn.net/abcjennifer/article/details/7700772 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...

  9. python实现多变量线性回归(Linear Regression with Multiple Variables)

    本文介绍如何使用python实现多变量线性回归,文章参考NG的视频和黄海广博士的笔记 现在对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为( x1,x2,..., ...

随机推荐

  1. 【原创】python倒排索引之查找包含某主题或单词的文件

    什么是倒排索引? 倒排索引(英语:Inverted index),也常被称为反向索引.置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射.它是文 ...

  2. 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。

    描述 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 0 到 n-1. ...

  3. Geometry 判断几何是否被另一个几何/线段分割成多段

    如下图,如何判断几何多边形A被多边形B,切割为多段几何? 几何A被几何B切割 1. 获取几何A与几何B的交集C var intersectGeometry = new CombinedGeometry ...

  4. [剑指offer]第1题,二维数组中的查找

    ①题目 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  5. mysql 不需要使用密码就可以登录

    最近发现一个问题, 就是我等了mysql客户端可以不输入密码. 直接输入mysql -u root 回车 或者 输入一个错的密码,都可进入到下面的界面. 在Navicat不用输入密码, 或者数据错的密 ...

  6. 一分钟带你了解下MyBatis的动态SQL!

    MyBatis的强大特性之一便是它的动态SQL,以前拼接的时候需要注意的空格.列表最后的逗号等,现在都可以不用手动处理了,MyBatis采用功能强大的基于OGNL的表达式来实现,下面主要介绍下. 一. ...

  7. hdu 4337 King Arthur's Knights (Hamilton)

    King Arthur's KnightsTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  8. 在CentOS安装消息中间件RabbitMQ

    一.在安装前,请确认CentOS是否可以联网 1.可以用SecureCRT工具连接centos,这方面请自行百度. 2.CRT连接成功后可以通过ping www.baidu.com 查看是否成功,确认 ...

  9. Kotlin Coroutines不复杂, 我来帮你理一理

    Coroutines 协程 最近在总结Kotlin的一些东西, 发现协程这块确实不容易说清楚. 之前的那篇就写得不好, 所以决定重写. 反复研究了官网文档和各种教程博客, 本篇内容是最基础也最主要的内 ...

  10. Itellij idea2019.2 激活码,有效期2020.5

    Itellij idea2019.2 激活码,有效期2020.5 MNQ043JMTU-eyJsaWNlbnNlSWQiOiJNTlEwNDNKTVRVIiwibGljZW5zZWVOYW1lIjoi ...