本文使用 Zhihu On VSCode 创作并发布

由于上一章的内容主要围绕编程实战展开(现在还在整合原稿第一章和附录,敬请期待),也就是说,这一章才是魔鬼数学的开始。

为什么把“线性回归”作为整个专栏的第一篇呢?因为“线性”(Linear)是我们从小学开始就不停接触的性质之一,到了大学仍然是重中之重,甚至绝大多数理工科都有一门名为“线性代数”(Linear Algebra)的必修课,其魔鬼版本“高等代数”更是和数学分析共同作为整个专业课的基石之一。

同时,线性函数(Linear Function)是最简单的一种函数,同时具有十分优异的性质,比如涉及参数极少、既是凹函数又是凸函数等。因此线性函数对入门者来说,是一个非常好的切入角度。

为了大家能对线性函数的本质有更深刻的理解,十分有必要在进入正题前,谈谈什么是线性性质。

注:什么是回归我就不多讲了吧,实在不知道的话请温习本专栏的置顶文章“数学与交叉学科简介”。


预备篇:线性函数

线性函数——直线、平面与超平面

我们不妨回忆一下,从小到大学了多少和线性函数有关的知识:

  • 小学:正比例和反比例,指出若

    始终是
    的倍数,则
    是正比例关系。
  • 初中:七年级引入函数后,指出线性函数的解析式为

    ,在平面直角坐标系下是一条直线。
  • 高中:在立体几何中,指出

    代表空间内的平面。

凭借这些定义,我们可以合理外推:在平面直角坐标系下,给定一组

,便可唯一确定一条直线
;三维空间中,给定一组
,并可唯一确定一个平面
。换言之,若在
维向量空间
中,给定一组
,可以唯一确定一个超平面

时,这个超平面恰好经过原点。这就是线性函数的精髓所在:

在表达式中,只有对分量

的数乘运算
,以及整合各分量的加法运算

。换言之,线性函数就是只有加法和数乘的函数,线性性质就是围绕加法和数乘展开的性质

上述公式反映了线性函数最本质的特征,代表了一类具有线性性质的所有函数。显然,这个公式囊括了二维、三维以及更高维数的情况,因此在之后提到线性函数时,不必特指空间的维数。

线性组合——基与线性相关性

我们再把目光聚焦在线性函数的图像上。在二维平面上,定义

,得到的图像是一维的直线;在三维空间上,定义
,得到的图像是二维的平面。那三维空间里的一维直线长啥样呢?空间解析几何告诉我们,选定初始点
和方向
,空间中的直线可用如下参数方程表示:

或者用一种更帅气的写法:

观察上面给出的几个实例,相信大家都能发现规律:当所有分量都能用某些变量表示时,变量的个数直接决定了得到图像的维数。比如空间直线只有一个变量

,就是一维的;空间平面有两个变量
,就是二维的。由于这种表示方式都只涉及变量的加法和数乘,因此我们将其称为

线性表示

继续考虑二维平面上的线性组合:

之前说了,这条直线上的每一点都肯定符合此方程。如果要让平面上的所有点都符合此方程,又该如何是好呢?首先

一定要是
,因为原点得符合此方程;其次
也得是
,因为
得符合此方程;同理可得到
。也就是说,如果要让平面上的所有点符合
,必须得有

我们继续把这个结论合理外推到有限维向量空间

,这里就直接代入原点,把
去掉:

如果要让空间内所有点都满足这个方程,首先代入

,得到
;代入
,得到
;代入
,得到
。这样就得到了最终结论:
维空间中的所有点均满足上述方程当且仅当

反映到几何直观上,如果高维空间上的一个点集能和低维的超平面

不全为零)建立联系,比如二维平面中所有点都在同一直线上,三维空间中所有点都在同一平面上,那么它们之间就存在线性的关系,即在该点集上

线性相关;反之,若

当且仅当
,那么这个点集上
就不存在线性关系,即它们

线性无关。这时候,各分量大致是这样的:

不存在线性关系时的各分量

我们用的

是什么呢?
时,它们就是
轴和
轴上的单位向量;
时,它们分别是
轴、
轴和
轴上的单位向量。我们可以把任意一个
维向量表示为
,那么很自然地有:

当且仅当

。按照上面的定义,可以类似地称向量

线性无关。这时候,称

维空间上的一组基,因为以它们为基础,能任意地表示
上的任何向量:

实际上,在

空间上远不止
这一组基。比方说,在平面上,随便把平面直角坐标系转一下,照样能用它表示所有点。学到深处你们就知道,两组基之间其实就差了一个可逆的方阵,而且任何一组基都可以通过Shimidt正交化,转化为一组相互垂直(正交)的基。但再深入下去能拓展开一整本《高等代数》,作为线性回归的铺垫,明白
这一组自然正交基和线性相关的定义已经完全足够,故在此不继续展开了。

线性映射

维空间上的
维超平面

确立了一个从

空间到实数域
的线性映射。若用向量形式改写之:

则这个线性映射有相当简单的形式

。那如何建立
之间的线性映射呢? 如果把列向量
的每一个分量
分别用线性映射
表示,那么

此时等式左边是

维向量
,等式右边则是一个
矩阵和列向量
的乘积。因此这个映射又可以写作

是不是感觉整个世界都清爽了?也就是说,线性映射就可以和矩阵对等起来,这在高等代数(2)里有更深入的阐述。如果面对更复杂的情况,比如需要拟合的回归变量不止一个,那就可以用上

。一般情况下,我们只拟合一个因变量,所以建模时只用线性函数
就足够了~

线性回归模型的建立

注:通常用向量下标

表示第
个样本,标量下标
表示第
个特征分量,它们同时出现时,
代表第
个样本的第
个特征分量。如果手机端无法正常显示加粗,请转战电脑端。

随便来一个数据集,特征为

,因变量为
,它们绝大部分时候不存在绝对的线性关系。这也没办法,毕竟线性关系实在太理想化了。那么我们就想到:

能不能在误差尽可能小的情况下,给它们强加一个线性关系呢?

我们先前讲到,一个线性函数就是形如

的函数,希望控制
的取值,使得线性函数的输出与真实值尽可能接近。如何刻画它们的距离呢?假设第
个样本的真实值为
,预测结果为
,有一种很常用的方法就是最小二乘法,即把所有的平方距离相加:

这种误差标准下,我们的目标就是选取

使得
最小。用最通用的优化问题写法,我们得到

优化问题的求解

多元函数求导:梯度与雅可比矩阵

想必大家都对一元函数求导

不陌生。而我们知道,多元函数
对每一个分量
都有一个偏导数
。将它们组合为列向量,我们可以得到

其中

代表
,下同。这么表示不仅仅是简单地将偏导数堆积,借助梯度我们可以求任意方向上的方向导数: 将方向用单位列向量
表示,则函数在该方向上的方向导数为

由向量内积的柯西-施瓦茨不等式,

,当且仅当
方向一致时相等。因此可以得到一条重要结论:

梯度方向是函数增加最快的方向,这也是后续梯度下降等迭代优化算法的理论基础。

如果将求偏导的操作再抽象一下,即引入Nabla算子

则梯度又可以用

表示。这么表示在场论里有莫大的好处,比如散度就可以直接写成
,旋度可以直接写成
。但这里只用到梯度,再往下展开就扯偏了,所以到此为止吧。

现在我们已经把多元函数的导数摸清了,且求多元函数的导数,就等同于求

的梯度向量。我们将其合理外推到更一般的情况,即
的映射。显然对于输出
,每一个分量都可以用
元函数
表示。还记得我们之前怎么把线性函数外推到线性映射的么?我们接下来要做的是:
超级拼装!

将每一个分量的梯度向量按行拼装为矩阵,则我们可以得到这样一个矩阵,称为雅可比矩阵(Jacobian):

之后让我们用

表示雅可比矩阵。和多元函数类似,雅可比矩阵就可以代表一个映射的导数了。因此,

后文中的“求导”均代指求梯度向量/雅可比矩阵

对线性函数求导

考虑关于

的线性函数
。直接用梯度向量的定义可知,
,即
的导数就是

对线性映射求导

考虑关于

的线性映射
,其中
维向量。将线性映射关于
拆分:

一眼就可以看出,雅可比矩阵的第

行第
列元素就是
。换言之,对线性映射
求导的结果就是矩阵

对二次型求导

考虑关于

的二次型
,此时
为实对称矩阵。在二次型中,
的系数为
的系数为
。 因此第
个梯度分量

这正好是

的第
个行向量和
的矩阵乘积。因此将所有分量拼装为梯度向量后,我们有

至此,我们已经有了充足的矩阵微积分知识储备,接下来就是干掉线性回归问题的时候了!

利用矩阵微积分求解线性回归

假设数据集给出

个样本,每个样本含有
个特征。为表述方便,将样本信息统一转化为矩阵形式

则优化目标又可表示为

其中利用了向量范数的等价形式

为唯一主元,将
展开整理:

其中

相对
而言是常数,
为线性函数,
为二次型。对上式求导:

令导数为

,得到参数
的最小二乘估计:

注:整个求解过程都看不懂也无大碍!只要记住本公式,并记下矩阵

的形式,照样可以接着往下展开。直接对
作无约束优化,推导过程比这间便多了,但结果不好看,详见文末理论习题3。

如何进一步改善性能

到目前为止,我们仅仅是按照最理想的形式构造线性关系。但是数据集中存在太多不确定因素,真实的数据集很有可能长得奇形怪状,比如存在一个离群值:

离群值:跟我比,在座的各位都是弟弟

这一个离群值直接把整个拟合结果带跑偏了。因为平方距离受离群值的干扰很大(就比如

可以毫无压力地干掉
),所以拟合出的直线必须迁就于这个离群值,这就导致线性回归的拟合结果很差。

此外,最小二乘估计式中,涉及到大规模矩阵乘法,更要命的是还有矩阵逆运算。一旦矩阵规模变得非常大,或者

接近于一个奇异矩阵,
的估计值很有可能会失控。至此,我们把影响拟合结果的两大诱因总结如下:
太大,离群值让结果炸;
太大,矩阵乘法装不下

为了应对上述现象,一种可行的方法就是引入正则化方法(Regularization),通过向损失函数

中加入模型参数
的范数实现,通常能大大提升线性回归算法的精确度。常用的有以下两种:

(1)岭回归(Ridge Regression): 将参数的

范数引入目标函数:

可解得

其中

是自定义参数,我一般会取0.1或0.2。参数
越大,得到的参数越接近0,需要根据拟合效果调参。新的估计值能抑制参数的大小,以防止过拟合。

(2)Lasso回归:将参数的

范数引入目标函数:

其中

。该方法无解析解,需要用数值逼近近似求解。LASSO的好处是,参数解比岭回归更稀疏。

大家可以思考一下,往目标函数里塞入参数向量

的长度,为什么就能解决上述问题?提示:针对导致算法性能下降的两大因素分析。

实战操练

在本章的实践环节中,我们一起编写一个岭回归模型。当内置参数

时,岭回归模型恰好退化为普通线性回归,故不赘述线性回归模型的写法。

岭回归的算法接口为:

def Regression(X, Y, c=0)

其中矩阵

的定义与推导过程一致,
即岭回归参数

数据预处理与算法设计

当接受输入的pandas.DataFrame对象时,首先将其转化为需要的算法输入X。

  • 构建一个全1向量,附加到数据表data的最后一列,属性名为"One"。
L = len(data)
One = np.ones(L)
data['One'] = One  # 构造一个全为1的向量并附加到最后一列

  • 分离输入中的

    。从输入数据中,提取需要的属性组成矩阵
    (不要漏了One这一列),将预测目标提取为向量
    X = data[['属性1', ..., '属性n', 'One']].values  # 所需的矩阵XY = data['预测目标'].values  # 预测对象Yreturn X, Y

  • 使用

    作为输入,得到算法输出。直接套用公式即可。
def Regression(X, Y, c=0):  # 此处的c就是岭回归中的惩罚参数,默认为0m, n = X.shape     # X的行数和列数Xt = np.transpose(X)XtX = np.linalg.inv(np.dot(Xt, X) + c * np.identity(n))  # 计算(XtX+cI)^-1XtX = np.dot(XtX, Xt)omega = np.dot(XtX, Y)  # 完全按照公式计算出线性回归参数,并返回return omega

  • 使用得到的参数

    预测。若输入为
    ,则先在后面加一列“1",再返回
def Predict(x, omega):  # 使用得到的参数omega,为新的数据点x预测y的值x = np.concatenate([x, np.array([1])])  # 为新的数据点后面加一列"1"return np.dot(x, omega)

数据分析实战

这章给出的数据集是某世界一流大学7102届数学院大一学生的百分制成绩,含:数学分析,高等代数,代数与几何基础,学术英语,体育。预测目标为每位同学的平均学分绩。

P.S. 由于7102届的学生绩点使用五分制等级,实际上每门课的成绩都有一个不可观测的隐变量,即按照阈值划分的成绩等级,完整数据生成流程可参见“成绩单(完整版).csv”。

  • 首先提取数据中的有效成分

def XY_Split(data):  # 将数据中的X,Y分离为矩阵/向量并返回X = data[['数学分析', '高等代数', '学术英语', '体育', '代数与几何基础', 'One']].values  # 所需的矩阵XY = data['均绩'].values  # 预测对象Y,即均绩return X, Y

  • 之后直接调用先前编写的接口:
    omega = Regression(X, Y, c = 0.2)

  • 使用模型预测新样本点。此处我造了一份成绩:(98,96,84,77,92)。
    x = np.array([98, 96, 84, 77, 92])print(Predict(x, omega))

预测结果为4.945。而通过隐变量计算,得到的真实绩点应为4.82,差距不小。是选用算法不行么?还是需要再调调参?给大家留下一个思考题:如何修正算法或调整数据集,改善这个模型的算法效果。感兴趣的同学们可以编写代码,以验证你的猜想。

课后习题

理论习题

  1. 我之前故意没给出线性映射的正式定义,因为一正经起来就不直观,也不好理解了。现在给定线性映射的定义:若映射

    保持加法和数乘运算:

则称

为线性映射。试验证之前给出的
都是线性映射。
  1. 维向量空间中,
    是一组线性无关的向量,试证明任意一个
    维向量
    都能用
    线性表示。这个结论告诉我们,

    线性空间的维数是由线性无关向量的最多个数(极大线性无关组)决定的。

  2. 我采用矩阵写法和矩阵形式求导纯粹是因为最终结果超级好看。对初学者来说,求解这个优化问题远没我写的那么复杂。尝试以

    为变元,对
    作无约束优化,将线性回归的求解用自己的语言描述。
  3. 尝试自己使用矩阵微积分或无约束优化的知识,求解岭回归问题:

上机操练


  1. 使用“世一大历年录取分数线”数据集,根据2018年所有省份的一本线、录取难度、同专业全国招生人数、本专业录取人数这四个特征,设计线性回归模型,以预测2019年浙江省各专业录取分数,并和实际分数线比较,以对算法作出评价。任务说明如下:

(1)录取难度:由于录取难度与招生总人数成反比,与最低录取分数线成正比,但不能用纯分数线刻画(如江苏和海南的高考总分不是750),应该用分数线和总分的比值来衡量。因此,设录取难度为

,该省招生总人数为
,最低录取分数线的线差(减去本省一本线)与总分之比为
,则定义

其中系数

是使得总分落入区间
的标准化向量。具体实现方法是先将所有省份的
计算出来,再减去最小值,之后除以最大值。录取难度越接近
,表示该省越难考进世一大。

(2)题意:既然给定了这四个特征,那么我们的目的就是将录取分数表示为它们的线性组合。任务中每一个省份的每一个专业都构成一条样本,同一省份的各个专业共享参数“一本线、录取难度”,同一专业的各个省份共享参数“同专业全国招生人数”。明确了这点,整理数据集就有头绪了。

(3)预测目标是19年浙江省的录取分数线。在19年数据未知的情形下,如何估计同专业全国招生人数、录取难度和本专业录取人数是一个值得仔细思考的问题。


  1. 使用“FIFA球员现实信息”数据集,利用能力、潜力、身价、周薪、国际声誉、逆足能力、花式技巧这些特征,建立线性回归模型,预测每一位球员的关注度。任务说明如下:

(1)建议的训练模式:七三开,用随机抽取的

数据训练,用另外
数据作测试,以评估算法。

(2)数据标准化:周薪、身价、国际声誉这些特征的数据尺度完全不一样,需要将它们调整一下,使得数据尺度接近,这样算法效果会更好哦~

c++2个三维向量求角度差_交叉学科入门指南(2)——线性回归相关推荐

  1. 三维向量求夹角(0-360)

    规定Z轴的正方向是(0,0,1) 从a->b做法向量: a和b的法向量与Z轴正向的积,积大于0,同向,夹角为正: 积小于0,反向,夹角为负,这里要求0-360,所以夹角为2*pi-theta: ...

  2. unity三维向量变化为角度_对于向量和矩阵的理解

    学数值计算还有复变函数了喔,矩阵忘干净了.又看了一遍 蓝棕 的相关的讲解,总结一下. 1.向量是什么? 从初到末的箭头(物理角度,表示一种运动过程) 有序的数字列表(计算机/数学角度)[1,2] 加和 ...

  3. unity三维向量变化为角度_三维旋转

    chopper:目录​zhuanlan.zhihu.com 本篇文章主要介绍三维空间下旋转的三种表示形式:四元数.矩阵和欧拉角,阐述了三种旋转表示的数学原理并且对比了它们的优缺点.目录结构: 四元数 ...

  4. matlab求傅里叶级数展开式_傅里叶级数:从向量的角度看函数

    帮助你理解线性代数与机器学习紧密结合的核心内容 下文节选自北大出版社<机器学习线性代数基础>, [遇见]已获授权许可. 这本书不同于传统教材, 从新的角度来介绍线性代数的核心知识, 讲解也 ...

  5. 求两个三维向量的夹角(带正负)

    1.数学上,两个三维向量夹角是没有正负的. 但是从公垂线的角度来看,可以有方向性.参考如下: 三维空间中两个向量会有一条公垂线(向量叉乘可以求得),以公垂线为轴,将第二个向量旋转一个角度,使其与第一个 ...

  6. 机器之心最干的文章:机器学习中的矩阵、向量求导

    作者:七月 本文的目标读者是想快速掌握矩阵.向量求导法则的学习者,主要面向矩阵.向量求导在机器学习中的应用.因此,本教程而非一份严格的数学教材,而是希望帮助读者尽快熟悉相关的求导方法并在实践中应用.另 ...

  7. java 三维向量类_三维向量类

    还是在读书的时候帮外专业朋友做作业,用GDI实现三维空间的立方体绘制和旋转的操作,那个时候自己根据<线性代数与空间解析几何>以及<计算机图形学>等课程的相关知识写了一个三维向量 ...

  8. 基于三维向量对的乱序堆叠物体的位姿识别

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 摘要:针对乱序堆叠物体识别效率低.速度慢的问题,提出一种快速可靠的3D对象检测可以应用于复杂场景中随机 ...

  9. hdu 1174:爆头(计算几何,三维叉积求点到线的距离)

    爆头 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

最新文章

  1. 怎样在swift中创建CocoaPods
  2. js中判断两个数字的大小
  3. win10安装pytorch
  4. python列表按照批次分配数据(亲测)
  5. 计算机启动时默认输入法设置,每次开机都需要重设,教你电脑输入法怎么设置默认模式...
  6. c语言二级考试题库及答案,c语言二级考试题库
  7. win11 edge怎么卸载?win11 edge浏览器彻底卸载的方法教程
  8. html鼠标悬停边框颜色,CSS实现鼠标悬停图片时的边框变色效果
  9. 【uni-app】uni-app移动端开发 - 登录界面
  10. 新概念二册 Lesson 20 One man in a boat独坐孤舟 ( 动名词 doing)
  11. 墙外干货:如何通过风格指南驱动模块化交互设计
  12. 暑假假期训练总结-3
  13. 我最喜欢的音乐系列之李连杰电影插曲
  14. (信号灯七)综合版本-使用HSV颜色空间将类绿色、红色和黄色区域分别二值化
  15. 一文了解销售软件产品的增值税即征即退政策
  16. 让Android Studio项目通过阿里云 代理加速下载依赖资源
  17. 【Python】利用zipfile.ZipFile和write()创建压缩包
  18. Mac上可与“时间机器”搭配使用的备份磁盘
  19. 百万美元“未来科技大奖”揭晓:山东大学彭实戈教授荣获数学与计算机科学奖-547。
  20. anaconda一次性更新所有安装库

热门文章

  1. nginx mysql 安装_CentOS7下安装Nginx+MySQL教程
  2. Centos7.5源码编译安装nodejs
  3. centos7安装ddos-deflate
  4. Android判断网线连接
  5. Matlab实现字符串分割
  6. linux root目录install,Linux如何建立、删除、切换目录?
  7. web前端三大主流框架_小猿圈web前端之前端的主流框架都有哪些?
  8. 设计模式理解:中介者模式(Mediator)
  9. 关于QSqlTableModel的使用说明(QT上创建本地SQL)
  10. c语言位运算_C语言自增减、逻辑运算、位运算、位移运算及三目运算操作