线性代数的视角理解LSR(least square regression)的参数评估算法本质
https://medium.com/@andrew.chamberlain/the-linear-algebra-view-of-least-squares-regression-f67044b7f39b
线性回归是初学者学习的最重要的统计模型工具。然而,传统的教学方式使得我们很难理解到这个regression的本质。大多数课程聚焦在"计算"视图上,在这个计算视图中,regression关注于每个观察值和预测值之间差的平方和所形成的表达式,随后我们对这个表达式应用求导取0,最终算得各个系数的值。
大多数教科书诱导学生们关注在这个痛苦的计算过程上,随后依赖于类似R或者Stata的统计软件包上,这导致学生严重依赖于这些软件,而不会深入理解到底是怎么工作的,其本质是什么。。这往往是不真正理解数学的老师去教regression的常见方式。
在本文中,我将更优雅简单地演示LSR的本质,我把他称为"线性代数"视图。
问题导入
regression的终极目标是找到一个合适的model来拟合一系列观测值的集合。本例中,我搜集了一些工厂每天机器故障的次数,比如我已经获取了三个数据点(day, number of failure): (1,1),(2,2),(3,2)。
我们的目标是寻找到一个线性方程来拟合这三个点。我们相信存在一个数学映射,将"days"唯一映射为"failures",或者说:
以 的形式来映射
这里b就是每天的机器故障数, x是day, C,D是线性变换的系数,这也是我们要寻找的未知数。
我们将已知的三个数据点代入线性方程,得到:
对于前两个点,model fit的非常好,但是第三个点却开始出现问题,也就是说我们已经意识到:这三个点并不在一条直线上,我们的model只能最大限度的近似它。
我们来看看如何以$Ax = b$的方式来表达我们的线性模型:
从这个矩阵中,我们可以说我们希望向量$\vec{b}$存在于矩阵$A$的列空间$C(A)$中.也就是说,我们希望通过矩阵A的列向量做线性组合能够得到我们的观测值$b$列向量。
然而,不幸的是,我们已经知道$b$本身并不能完全由A的列向量线性表示。这意味着向量$b$并不在$A$的列空间中.所以我们并不能通过解线性方程组的方式来求解到$x(C,D)$.
我们来继续通过画图来了解发生着什么。
在下面的手绘中,矩阵A的列向量空间被记为$C(A)$。它为三维空间中的一个平面。如果我们将矩阵$A$的两个列向量记录为$a_1,a_2$,则列空间就是两个列向量所有线性组合构成的平面。
同时你可以看到观测值构成的列向量$b$并不存在于该平面中,而是和该平面有所交集,被标志为$b$。
平面$C(A)$是我们理想的数学模型,而向量$b$则是我们实际的观测值向量,并不能完美地落在线性空间$C(A)$中,那么我们需要怎么去做呢?
线性回归模型的方法是:我们应该放弃寻找一个model能够完美拟合到$b$,相反的是我们应该找到一个另外一个足够接近目标$b$向量的向量,而该向量能够在$A$的列空间中。也就是说我们需要在列空间中找到一个向量$p$,使得$p$和$a$越靠近越好。
下面的图片演示了这个过程。我们可以想象一下,如果从$C(A)$平面的正上方向下打一个光线,这将在$C(A)$上形成一个线段的影子。这实际上就是向量$b$在矩阵$A$的列空间平面上的投影projection.这个投影在图中我们以$p$标签来标识。
被标注为$e$的向量实际上是真值向量$b$和我们计划使用的投影向量$p(\hat{b})$之间的。现在我们可以将我们的目标使用另外一种方式来描述:寻找一个合适的向量$p$使得$e$越小越好。也就是说,我们希望最小化$p,b$之间的误差。
在上面的图中,$e$就是观察值向量$b$减去投影向量$p$或者记为$b-p$.而投影向量$p$本身就是$A$的列向量线性组合----这也是为什么$p$能够在$A$的列空间中的原因----所以$p$应该等于$A$去乘以一个向量,我们记为$\hat{x}$
为了最小化这个$e$,我们希望选择一个垂直于$e$但和$b$同向的向量$p$,在图中,$e$和$p$的夹角我们标注为90度的角。
求解Regression系数
既然e和A的列空间平面垂直,那么意味着$A$的列向量和$e$的点乘都为0(因为列空间的所有向量都和$e$垂直,而$A$的列向量必然在列空间里,故而),$A\cdot e = 0,A^T\times e = 0$, 同时既然$e=b-p, p = A \times \hat{x}$,我们就可以得到:
$$A^{T}(b-A\hat{x})=0$$
从上面方程中解出$\hat{x}$,我们就得到:
$\hat{x}$的每个元素就是计算出来的系数$C,D$,这正是我们要寻找的。做线性回归本质上就是在解方程:$Ax = b$,但是如果任何b中的观测值背离线性模型,那么A将不是可逆矩阵。因此我们通过在左右分别乘上矩阵$A$的转置矩阵$A^{T}$使得其为可逆矩阵。$A^{T}A$总是一个对称的方阵,所以是可逆的,然后我们就用它来求解$\hat{x}$
使用这种代数视图还有其他的一些好处,其中之一:非常方便理解相关系数$r$.如果我們正規化x,y数据点,也就是说分别减去其均值,那么r就是$b,C(A)$的夹角的余弦值。
$cos()$函数值的范围是-1到1,就和r的值域一样。如果regression完全拟合,r=1,这意味着$b$在平面上。如果b在平面上,那么夹角是0,而$cos(0)=1$,相反,如果regression非常糟糕,r=0,而b和平面是垂直的,这时$cos(pi/2)=0$
线性代数的视角理解LSR(least square regression)的参数评估算法本质的更多相关文章
- 从Java视角理解CPU上下文切换(Context Switch)
从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态 在高性能编程时,经常接触到多线程. 起初我们的理解是, 多个线程并行地执行总比单个线程要快, 就像多个人一起干活总比一个人干要快 ...
- 线性代数的本质与几何意义 03. 矩阵与线性变换 (3blue1brown 咪博士 图文注解版)
首先,恭喜你读到了咪博士的这篇文章.本文可以说是该系列最重要.最核心的文章.你对线性代数的一切困惑,根源就在于没有真正理解矩阵到底是什么.读完咪博士的这篇文章,你一定会有一种醍醐灌顶.豁然开朗的感觉! ...
- 线性代数的本质与几何意义 01. 向量是什么?(3blue1brown 咪博士 图文注解版)
向量是线性代数最基础.最基本的概念之一,要深入理解线性代数的本质,首先就要搞清楚向量到底是什么? 向量之所以让人迷糊,是因为我们在物理.数学,以及计算机等许多地方都见过它,但又没有彻底弄懂,以至于似是 ...
- 线性代数的28法则:作为程序员掌握这些API就够用了……
目录 1. 向量 & 矩阵 1.1. 问: np.ndarray 与 np.matrix 的区别 1.2. 向量空间 2. 算术运算 2.1. 为什么线性代数定义的乘积运算不按照加法的规则(按 ...
- 从Java视角理解CPU缓存(CPU Cache)
从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态众所周知, CPU是计算机的大脑, 它负责执行程序的指令; 内存负责存数据, 包括程序自身数据. 同样大家都知道, 内存比CPU慢很多 ...
- 线性代数的本质与几何意义 02. 线性组合、张成的空间、基(3blue1brown 咪博士 图文注解版)
1. 线性组合 接下来我们要换一个角度来看向量.以二维平面直角坐标系为例,i, j 分别是沿 2 个坐标轴方向的单位向量.那么坐标平面上的其他向量,例如 [ 3 -2 ] [3−与 i, j 是什么 ...
- 用三维的视角理解二维世界:完美解释meshgrid函数,三维曲面,等高线,看完你就懂了。...
完美解释meshgrid函数,三维曲面,等高线 #用三维的视角理解二维世界 #完美解释meshgrid函数,三维曲面,等高线 import numpy as np import matplotlib. ...
- [转载]三十分钟理解:线性插值,双线性插值Bilinear Interpolation算法
[转载]三十分钟理解:线性插值,双线性插值Bilinear Interpolation算法 来源:https://blog.csdn.net/xbinworld/article/details/656 ...
- 《深入理解 Java 虚拟机》学习 -- 垃圾回收算法
<深入理解 Java 虚拟机>学习 -- 垃圾回收算法 1. 说明 程序计数器,虚拟机栈,本地方法栈三个区域随线程而生,随线程而灭,这几个区域的内存分配和回收都具备确定性 Java 堆和方 ...
随机推荐
- UBUNTU 安装中文语言包命令
本次在UBUNTU安装国外程序,需要中文包 才会是中文. apt-get install language-pack-zh-hans 解决.
- Android 开发工具类 05_Logcat 统一管理类
Logcat 统一管理类: 1.默 认tag 的函数: 2.自定义 tag 的函数. import android.util.Log; // Logcat 统一管理类 public class L { ...
- web前端之css快速入门
css简介 css概述 CSS 指层叠样式表 (Cascading Style Sheets)样式定义如何显示 HTML 元素样式通常存储在样式表中把样式添加到 HTML 4.0 中,是为了解决内容与 ...
- Innosetup新增Wizard Page
Innosetup 新增一个向导页面,让用户选择安装方式 转载于:http://www.docin.com/p-612536939.html 在Innosetup的向导页面中,新增一个页面,提供两种安 ...
- 代码查看php是否已开启rewrite功能模块
通过php代码来查询,是否把rewrite模块打开了 <?php $result = apache_get_modules(); if(in_array('mod_rewrite', $resu ...
- Vue前端框架面试问题
1.active-class是哪个组件的属性?嵌套路由怎么定义? 答:vue-router模块的router-link组件. 2.怎么定义vue-router的动态路由?怎么获取传过来的动态参数? 答 ...
- elasticdump
elasticdump备份elasticsearch里面的某个索引数据 1. 安装环境 需要node.npm.yarn # 去官方下载最新版本的nodejs #wget https://nod ...
- C# 在同一个项目里启动不同的类文件
比如有两个类文件分别为 Person.cs 和 Enum.cs : using System; using person; namespace HelloWorld { class HelloWorl ...
- Linux多线程 - 基本操作
0. 线程 vs 进程 何为线程?线程即轻量级进程,如何理解轻量级这个概念? 我们知道,Linux的资源分为用户空间资源和内核空间资源: 用户空间资源:用来存放用户自定义的一些数据,用户可直接控制: ...
- 使用Python学习RabbitMQ消息队列
rabbitmq基本管理命令: 一步启动Erlang node和Rabbit应用:sudo rabbitmq-server 在后台启动Rabbit node:sudo rabbitmq-server ...