【机器学习】用QR分解求最小二乘法的最优闭式解

  • 写在前面
  • QR分解
    • 定义
    • QR的求解
  • 线性回归模型
  • 用QR分解求解最优闭式解
    • 矩阵的条件数
  • 实验
    • 运行结果

写在前面

今天刷知乎,看到张皓在面试官如何判断面试者的机器学习水平?的回答里面讲到了关于用矩阵的QR分解求解最小二乘法闭式解的问题,碰巧前几天《矩阵分析》课堂上刚讲到QR分解,觉得挺有意思,值得深究,遂产生写本篇博文的动机。另外本人知识水平理解能力有限,如有错漏请各位大侠批评指正。

QR分解

先来看看维基百科上怎么说:

QR分解法是三种将矩阵分解的方式之一。这种方式,把矩阵分解成一个半正交矩阵与一个上三角矩阵的积。QR分解经常用来解线性最小二乘法问题。QR分解也是特定特征值算法即QR算法的基础。

定义

实数矩阵的QR分解是把矩阵A分解为:

这里的Q是正交矩阵(意味着QTQ = E)而R是上三角矩阵(即矩阵R的对角线下面的元素全为0)。为了便于理解,这里引用一下daniel-D的图:

这个将A分解成这样的矩阵Q和R的过程就是QR分解,QR分解可用于求解矩阵A的特征值、A的逆等问题。具体参考血影雪梦大神的博文。

QR的求解

QR 分解的实际计算有很多方法,例如 Givens 旋转、Householder 变换,以及 Gram-Schmidt 正交化等等。每一种方法都有其优点和不足。对于QR分解的求解这里不再展开论述,在python中可以用numpy库实现:

import numpy as np
Q, R = np.linalg.qr(A)

线性回归模型

给定数据集D={(x1,y1),(x2,y2),...,(xm,ym)}D=\{(\boldsymbol x_1,y_1),(\boldsymbol x_2,y_2),...,(\boldsymbol x_m,y_m)\}D={(x1​,y1​),(x2​,y2​),...,(xm​,ym​)}其中xi=(xi1;xi2;...;xid),yi∈R\boldsymbol x_i=(x_{i1};x_{i2};...;x_{id}),y_i\in\mathbb Rxi​=(xi1​;xi2​;...;xid​),yi​∈R.即样本由ddd个属性描述。“线性回归”(linear regression)试图学得一个线性模型以尽可能准确地预测实值输出标记。
线性回归试图学得的模型为:f(xi)=wTxi+b,使得f(xi)≃yif(\boldsymbol x_i)=\boldsymbol w^T\boldsymbol x_i+b, 使得f(\boldsymbol x_i)\simeq y_if(xi​)=wTxi​+b,使得f(xi​)≃yi​
这称为“多元线性回归”(multivariate linear regression)
可以利用最小二乘法来对参数w和b\boldsymbol w和bw和b进行估计。我们知道均方误差是回归任务中最常用的性能度量,即通常所说的损失函数,这里的损失函数可以表示为:
J(w,b)=12∑i=1m(f(xi)−yi)2=12∑i=1m(yi−wxi−b)2J(\boldsymbol w,b)=\frac{1}{2} \sum_{i=1}^m (f(\boldsymbol x_i)-y_i)^2 = \frac{1}{2} \sum_{i=1}^m(y_i-\boldsymbol wx_i-b)^2 J(w,b)=21​i=1∑m​(f(xi​)−yi​)2=21​i=1∑m​(yi​−wxi​−b)2
因此我们可试图让均方误差最小化,求出最优闭式解,即
(w∗,b∗)=arg⁡min(w,b)J(w,b)(\boldsymbol w^*,b^*) = \arg min_{(\boldsymbol w,b)} J(\boldsymbol w,b) (w∗,b∗)=argmin(w,b)​J(w,b)
在处理大型数据集时,我们一般都把参数和训练数据进行向量化(vectorization),即吸入矩阵中,再对矩阵进行计算,数据的向量化能给计算速度带来非常大的提升。具体做法是:对于训练参数,把 w和b吸收入向量形式w^=(b;w)\boldsymbol w和b吸收入向量形式\hat \boldsymbol w=(b; \boldsymbol w)w和b吸收入向量形式w^=(b;w),即在列向量w\boldsymbol ww的第一个元素前插入偏置项bbb,此时的参数w^\hat \boldsymbol ww^变成(d+1)×1(d+1)\times 1(d+1)×1的列向量;即
w^=[bw1⋮wd]\hat \boldsymbol w= \begin{bmatrix} b \\ w_1 \\ \vdots \\ w_d \end{bmatrix} w^=⎣⎢⎢⎢⎡​bw1​⋮wd​​⎦⎥⎥⎥⎤​
对于训练数据集DDD,我们把DDD吸入一个m×(d+1)m\times(d+1)m×(d+1)大小的矩阵X\boldsymbol XX中,矩阵X\boldsymbol XX的第一列用全为1的元素填充,即
X=[1x11⋯x1d1x21⋯x2d⋮⋮⋱⋮1xm1⋯xmd]=[1x1T1x2T⋮⋮1xmT]\boldsymbol X=\begin{bmatrix} 1 &x_{11} & \cdots & x_{1d} \\ 1 &x_{21} & \cdots & x_{2d} \\ \vdots & \vdots &\ddots & \vdots \\ 1 &x_{m1} & \cdots & x_{md} \end{bmatrix}= \begin{bmatrix} 1 &\boldsymbol x_1^T \\ 1 &\boldsymbol x_2^T \\ \vdots & \vdots \\ 1 &\boldsymbol x_m^T \end{bmatrix} X=⎣⎢⎢⎢⎡​11⋮1​x11​x21​⋮xm1​​⋯⋯⋱⋯​x1d​x2d​⋮xmd​​⎦⎥⎥⎥⎤​=⎣⎢⎢⎢⎡​11⋮1​x1T​x2T​⋮xmT​​⎦⎥⎥⎥⎤​
相应地,我们也把标记(label)写成向量形式:
y=[y1y2⋮ym]\boldsymbol y= \begin{bmatrix} y_1 \\ y_2 \\ \vdots \\ y_m \end{bmatrix} y=⎣⎢⎢⎢⎡​y1​y2​⋮ym​​⎦⎥⎥⎥⎤​
至此,所有数据已经向量化完。经过向量化后,线性回归模型的损失函数可表示为:
J(w,b)=J(w^)=12(Xw^−y)T(Xw^−y)J(\boldsymbol w, b) =J(\hat \boldsymbol w) =\frac{1}{2}(\boldsymbol X \hat \boldsymbol w-\boldsymbol y)^T(\boldsymbol X \hat \boldsymbol w - \boldsymbol y) J(w,b)=J(w^)=21​(Xw^−y)T(Xw^−y)
将J(w^)J(\hat\boldsymbol w)J(w^)对参数w^\hat\boldsymbol ww^进行求导:
∂J(w^)∂w^=XT(Xw^−y)\frac{\partial J(\hat\boldsymbol w)}{\partial \hat\boldsymbol w}=\boldsymbol X^T(\boldsymbol X \hat\boldsymbol w - \boldsymbol y) ∂w^∂J(w^)​=XT(Xw^−y)
令导数为零即可得到最优闭式解
w^∗=(XTX)−1XTy\hat\boldsymbol w^* = (\boldsymbol X^T \boldsymbol X)^{-1} \boldsymbol X^T \boldsymbol y w^∗=(XTX)−1XTy
重点来了,那么我们怎样才能高效求解这个 w^∗\hat\boldsymbol w^*w^∗ 呢?

下面介绍的内容才是本篇文章的核心

用QR分解求解最优闭式解

本文的前面已经介绍过QR分解的定义与求法了,这里我们直接应用。
根据QR分解的定义,我们可以将训练集矩阵X\boldsymbol XX分解为
X=QR\boldsymbol X = QR X=QR
代入上面的最优闭式解的式子得到
w^∗=(XTX)−1XTy⇒XTXw^∗=XTy⇒RTQTQRw^∗=RTQTy⇒RTRw^∗=RTQTy⇒Rw^∗=QTy⇒w^∗=R−1QTy\begin{array}{lcl} \quad \quad \hat\boldsymbol w^* = (\boldsymbol X^T \boldsymbol X)^{-1} \boldsymbol X^T \boldsymbol y\\ \\ \Rightarrow \quad \boldsymbol X^T \boldsymbol X \hat\boldsymbol w^* = \boldsymbol X^T \boldsymbol y\\ \\ \Rightarrow \quad R^T Q^T Q R \hat\boldsymbol w^* = R^T Q^T \boldsymbol y\\ \\ \Rightarrow \quad R^T R \hat \boldsymbol w^*=R^T Q^T \boldsymbol y\\ \\ \Rightarrow \quad R \hat \boldsymbol w^* = Q^T \boldsymbol y \\ \\ \Rightarrow \quad \hat\boldsymbol w^* = R^{-1} Q^T \boldsymbol y \end{array}w^∗=(XTX)−1XTy⇒XTXw^∗=XTy⇒RTQTQRw^∗=RTQTy⇒RTRw^∗=RTQTy⇒Rw^∗=QTy⇒w^∗=R−1QTy​

至此,我们已经用QR分解求得了最优闭式解的表达式。可以看到,仅需知道Q和R就能求出最小二乘法的最优闭式解,so easy!

看到这里可能有的人就要问了,为什么不直接用w^∗=(XTX)−1XTy\hat\boldsymbol w^* = (\boldsymbol X^T \boldsymbol X)^{-1} \boldsymbol X^T \boldsymbol yw^∗=(XTX)−1XTy进行最优闭式解的求解呢?用上面这种解法有什么好处?
解答这个问题,要从矩阵的条件数说起。

矩阵的条件数

先说一下矩阵的奇异值分解
我们知道对于任意 m×nm\times nm×n 的矩阵X\boldsymbol XX,均可以进行奇异值分解: X=UΣVH\boldsymbol X =U \Sigma V^HX=UΣVH,其中UUU是m×mm \times mm×m阶的酉矩阵,Σ\SigmaΣ是 m×nm \times nm×n阶非负实数对角矩阵,而VHV^HVH,即VVV的共轭转置,是n×nn \times nn×n阶的酉矩阵。Σ\SigmaΣ对角线上的元素σi\sigma_iσi​就是矩阵X\boldsymbol XX的奇异值。

对于条件数,维基百科这样说:

“数值分析中,一个问题的条件数是该数量在数值计算中的容易程度的衡量,也就是该问题的适定性。一个低条件数的问题称为良置的,而高条件数的问题称为病态(或者说非良置)的”

上面这句话可能不太好理解,我们只要记住这一点就行:通常情况下,矩阵的条件数越低越好。由于计算机的计算不是精确的,条件数越高,计算精度的误差对解的影响也越大。
矩阵X\boldsymbol XX的条件数定义为:
κ(X)=∥X−1∥⋅∥X∥\boldsymbol \kappa(\boldsymbol X) = \left \| \boldsymbol X^{-1} \right \| \cdot \| \boldsymbol X \|κ(X)=∥∥​X−1∥∥​⋅∥X∥
若∥⋅∥\| \cdot \|∥⋅∥是矩阵2范数,则κ(X)=σmax⁡(X)σmin⁡(X)\boldsymbol \kappa(\boldsymbol X) =\frac{ \boldsymbol \sigma _{\max} (\boldsymbol X)}{\boldsymbol \sigma _{\min} (\boldsymbol X)} κ(X)=σmin​(X)σmax​(X)​
其中σmax⁡(X)\boldsymbol \sigma _{\max} (\boldsymbol X)σmax​(X)和σmin⁡(X)\boldsymbol \sigma _{\min} (\boldsymbol X)σmin​(X)分别是矩阵X\boldsymbol XX的极大极小奇异值。
回到上面最优闭式解的求解的问题,如果我们直接拿w^∗=(XTX)−1XTy\hat\boldsymbol w^* = (\boldsymbol X^T \boldsymbol X)^{-1} \boldsymbol X^T \boldsymbol yw^∗=(XTX)−1XTy进行求解,其条件数:
κ(XTX)=κ(VΣTUTUΣVH)=κ(VΣ2VH)=κ(X)2\boldsymbol \kappa(\boldsymbol X^T \boldsymbol X) = \boldsymbol\kappa (V \Sigma^T U^T U \Sigma V^H) =\boldsymbol \kappa (V \Sigma ^2 V^H) = \boldsymbol \kappa (\boldsymbol X)^2 κ(XTX)=κ(VΣTUTUΣVH)=κ(VΣ2VH)=κ(X)2
也就是说,矩阵XTX\boldsymbol X^T \boldsymbol XXTX的条件数是矩阵X\boldsymbol XX条件数的平方!这和我们想要条件数尽量低的愿望相违背。而使用QR分解将闭式解的求解等价为解Rw^∗=QTyR \hat \boldsymbol w^* = Q^T \boldsymbol yRw^∗=QTy,这就巧妙的绕过了条件数被平方的操作。

实验

我们将这种解法应用到吴恩达的《机器学习》课程上的房价预测的数据集上。这里直接放出代码

import numpy as np
import matplotlib.pyplot as pltif __name__ == '__main__':data = np.loadtxt('ex1data1.txt', delimiter=',')  # load dataX = data[:, 0]y = data[:, 1]  # 注意这里得到的y的shape为(m, ),要把它reshape为(m,1)y = np.reshape(y, (y.shape[0], 1))plt.scatter(X, y, marker='x', c='r')# 在X的第一列之前插入元素全为1的列X = np.column_stack((np.ones((X.shape[0], 1)), np.reshape(X, (X.shape[0], 1))))#QR分解Q, R = np.linalg.qr(X)w = np.linalg.linalg.inv(R).dot(Q.T).dot(y)print(w)plt.plot(X[:, 1], np.dot(X, w), '-')plt.show()
运行结果

w = [-3.895, 1.193]

完。

Refrences:
《机器学习》周志华
https://www.cnblogs.com/daniel-D/p/3208534.html
https://www.zhihu.com/people/hao-zhang-0214/activities
https://blog.csdn.net/u014046022/article/details/78877369?utm_source=blogxgwz3
https://zh.wikipedia.org/wiki/%E6%9D%A1%E4%BB%B6%E6%95%B0
https://zh.wikipedia.org/wiki/%E9%85%89%E7%9F%A9%E9%98%B5
https://zh.wikipedia.org/wiki/QR%E5%88%86%E8%A7%A3

【机器学习】用QR分解求最小二乘法的最优闭式解相关推荐

  1. 双步位移求解特征值matlab,数值分析——带双步位移的QR分解求特征值算法

    C语言实现数值分析中带双步位移的QR分解求特征值算法. 数 值 分 析(B) 大 作 业(二) 1.算法设计: ①矩阵的拟上三角化: 对实矩阵A进行相似变换化为拟上三角矩阵A(n 1),其变换矩阵采用 ...

  2. QR分解求矩阵特征值、特征向量 C语言

    最近在看一个高光谱图像压缩算法,其中涉及到正交变换,计算正交变换时,需要对普通矩阵求其特征向量.想要在网上找一个现成的程序,可能是我百度的能力不强吧,居然真的没找见.好了废话不多说,下面进入正题. 计 ...

  3. 机器学习——最小二乘法,闭式解矩阵推导

    Step1:最小二乘法的初始形式 Step2:目标--最小化欧几里德空间的2-范数的平方 Step3:将式子用矩阵展开 Step4:矩阵的各种形式求导(下一步使用) 第一种:  第二种:   ,  如 ...

  4. 【机器学习】相关概念:闭式解,解析解,数值解

    在看<机器学习>时突然看到了闭式解这个概念,然后百度了一下闭式解. 看到了三个相关的名词:解析解,闭式解,数值解 接下来谈一下自己看完后的理解 解析解:因变量由自变量所表示的函数解析式,它 ...

  5. 【MATLAB】机器学习: 线性回归实验(梯度下降+闭式解)

    实验内容 1.根据梯度下降法完成一元线性回归实验. 2.根据闭式解完成一元线性回归实验. 3.比较两种解下的实验结果. 实验代码 clear;clc; %% 数据导入:划分训练集和测试集 % 数据导入 ...

  6. QR分解求矩阵全部特征值

    QR算法求矩阵全部特征值的基本思想是利用矩阵的QR分解通过迭代格式 将A=A1化成相似的上三角阵,从而求出矩阵A的全部特征值. QR方法的计算步骤如下: 下面就依次进行介绍. 一. 将一般矩阵化为上H ...

  7. (转)QR分解求矩阵的全部特征值

    QR算法求矩阵全部特征值的基本思想是利用矩阵的QR分解通过迭代格式 将A=A1化成相似的上三角阵,从而求出矩阵A的全部特征值. QR方法的计算步骤如下: 下面就依次进行介绍. 一. 将一般矩阵化为上H ...

  8. qr分解求线性方程组_矩阵分解

    矩阵分解 1. 矩阵的三角分解 1.1 高斯消去法解线性方程组 在聊起矩阵分解之前,先看一下我们小学二年级就学过的高斯消去法解线性方程组,其主要思想就是:将方程组写作写作增广矩阵(A|b)的形式,然后 ...

  9. qr分解求线性方程组_梯度下降求解线性方程组算例设计

    凸二次优化问题 Theory. 设 是实对称正定矩阵, ,则求解凸二次优化问题 等价于求解线性方程组 . Proof. 二次型二阶可导,极小值点处梯度为零,现对优化的目标函数求梯度.二次型本质上具有: ...

最新文章

  1. R语言构建logistic回归模型:构建模型公式、拟合logistic回归模型、模型评估,通过混淆矩阵计算precision、enrichment、recall指标
  2. NoDrives-显示与隐藏驱动器【盘符的显示与隐藏】
  3. IntelliJ IDEA导航特性Top20
  4. Web 应用客户端渲染和服务器端渲染的比较
  5. PS教程第三课:PS界面
  6. opengl渲染4k数据提高效率
  7. Java 使用execute方法执行Sql语句
  8. 从Label Smoothing和Knowledge Distillation理解Soft Label
  9. Android两种 旋转Bitmap方法
  10. vue 实现点击图片放大
  11. 用php表单写出梯形的面积,梯形面积
  12. Intent.parseUri()详解
  13. android手机和包支付,中国移动和包支付客户端下载-和包支付appv9.7.16 安卓版-腾牛安卓网...
  14. Ubuntu 14.04 LTS 的安装和配置以及各种问题的解决
  15. The Winter Is Coming
  16. 户外广告 android系统,十目户外广告监测监管系统下载-十目监测(户外广告监测app)v1.0.0 安卓版-腾牛安卓网...
  17. 微信订单尾号夺宝php源码,H5最新尾号夺宝源码黑色版 订单号尾数夺宝程序源代码...
  18. 2017.5.27测试 3. 逃避系统警察
  19. mendeley引用参考文献不显示_文献插入引用(Mendeley)+图示说明+完全上手+免费...
  20. 关于股票投资中的k线

热门文章

  1. 如何分析诊断网站(转载)
  2. python输入两个数字、输出和差积商_C语言程序设计:输入两个整数,计算并输出它们的和、积、差、商和余数各是多少?...
  3. Picard 法求方程根
  4. 详解NRZ(非归零),你最关心的频谱升余弦
  5. 蝶舞无线串口服务器,蝶舞世界自在绽放
  6. 谈谈我是如何阅读源码的
  7. 服务器为什么不可以放在自己的办公室里,为什么租用IDC机房的服务器呢?
  8. Mendix推动数据驱动 (二): Mendix如何助推数据驱动
  9. kolin协程讲解不错的几篇博客
  10. android7.1 蓝牙作为sink模式