系列博客,原文在笔者所维护的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. vue+element UI + axios封装文件上传及进度条组件

    1.前言 之前在做项目的时候,需要实现一个文件上传组件并且需要有文件上传进度条,现将之前的实现过程简单记录一下,希望可以帮助到有需要的人. 项目用的是Vue框架,UI库使用的是element UI,前 ...

  2. 百度艾尼(ERNIE)常见问题汇总及解答

    一.ERNIE安装配置类问题 Q1:最适合ERNIE2.0的PaddlePaddle版本是?A1:PaddlePaddle版本建议升级到1.5.0及以上版本. Q2:ERNIE可以在哪些系统上使用?A ...

  3. 中文企业云操作系统 CecOS

    CecOS介绍 CecOS(原中文企业云操作系统.第一个版本基于oVirt 3.0,后续在此基础上不断升级迭代拓展至今,已形成基于基础底层和应用功能拓展集成在内的10款产品和四大平台),旨在通过先进的 ...

  4. Java ------ 工厂模式、单例模式

    工厂模式 简单工厂模式: 1.创建Car接口 public interface Car { public void drive(); } 2.创建两个实体类,分别实现Car接口 public clas ...

  5. 【集合系列】- 初探java集合框架图

    一.集合类简介 Java集合就像一种容器,可以把多个对象(实际上是对象的引用,但习惯上都称对象)"丢进"该容器中.从Java 5 增加了泛型以后,Java集合可以记住容器中对象的数 ...

  6. tomcat 部署springboot 项目

    Springboot项目默认jar包,且内置Tomcat.现需要将项目打成war包,并部署到服务器tomcat中. 1.修改pom.xml文件.将jar修改为war. <packaging> ...

  7. java编程思想第四版第五章总结

    1. 构造器 构造器的一个重要的作用: 保证对象被使用之前初始化了. 构造器是一种特殊类型的方法, 因为他没有返回值.这与返回值为空(void)明显不同.对于空返回值,尽管方法本身不会自动返回什么, ...

  8. nyoj 349 (poj 1094) (拓扑排序)

    Sorting It All Out 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 An ascending sorted sequence of distinct ...

  9. django_2:模板

    使用模板变量: 在html文件中,{{title}}即为模板变量, 在view.py文件中,render函数,增加第三个参数,以字典形式给值. def index(req): return rende ...

  10. python2中的SSL:CERTIFICATE_VERIFY_FAILED错误的解决办法

    在使用urllib2访问一个自签名的https链接时,对于python2.6以下版本,TLS握手期间是不会检查服务器X509的证书签名是否是CA的可信任根证书.不过python2.7以后改变了这种情况 ...