c++2个三维向量求角度差_交叉学科入门指南(2)——线性回归
本文使用 Zhihu On VSCode 创作并发布
由于上一章的内容主要围绕编程实战展开(现在还在整合原稿第一章和附录,敬请期待),也就是说,这一章才是魔鬼数学的开始。
为什么把“线性回归”作为整个专栏的第一篇呢?因为“线性”(Linear)是我们从小学开始就不停接触的性质之一,到了大学仍然是重中之重,甚至绝大多数理工科都有一门名为“线性代数”(Linear Algebra)的必修课,其魔鬼版本“高等代数”更是和数学分析共同作为整个专业课的基石之一。
同时,线性函数(Linear Function)是最简单的一种函数,同时具有十分优异的性质,比如涉及参数极少、既是凹函数又是凸函数等。因此线性函数对入门者来说,是一个非常好的切入角度。
为了大家能对线性函数的本质有更深刻的理解,十分有必要在进入正题前,谈谈什么是线性性质。
注:什么是回归我就不多讲了吧,实在不知道的话请温习本专栏的置顶文章“数学与交叉学科简介”。
预备篇:线性函数
线性函数——直线、平面与超平面
我们不妨回忆一下,从小到大学了多少和线性函数有关的知识:
小学:正比例和反比例,指出若
始终是的倍数,则和是正比例关系。初中:七年级引入函数后,指出线性函数的解析式为
,在平面直角坐标系下是一条直线。高中:在立体几何中,指出
代表空间内的平面。
凭借这些定义,我们可以合理外推:在平面直角坐标系下,给定一组
当
在表达式中,只有对分量
。换言之,线性函数就是只有加法和数乘的函数,线性性质就是围绕加法和数乘展开的性质。
上述公式反映了线性函数最本质的特征,代表了一类具有线性性质的所有函数。显然,这个公式囊括了二维、三维以及更高维数的情况,因此在之后提到线性函数时,不必特指空间的维数。
线性组合——基与线性相关性
我们再把目光聚焦在线性函数的图像上。在二维平面上,定义
或者用一种更帅气的写法:
观察上面给出的几个实例,相信大家都能发现规律:当所有分量都能用某些变量表示时,变量的个数直接决定了得到图像的维数。比如空间直线只有一个变量
线性表示。
继续考虑二维平面上的线性组合:
之前说了,这条直线上的每一点都肯定符合此方程。如果要让平面上的所有点都符合此方程,又该如何是好呢?首先
我们继续把这个结论合理外推到有限维向量空间
如果要让空间内所有点都满足这个方程,首先代入
。
反映到几何直观上,如果高维空间上的一个点集能和低维的超平面
线性相关;反之,若
线性无关。这时候,各分量大致是这样的:
我们用的
当且仅当
线性无关。这时候,称
实际上,在
线性映射
确立了一个从
则这个线性映射有相当简单的形式
此时等式左边是
是不是感觉整个世界都清爽了?也就是说,线性映射就可以和矩阵对等起来,这在高等代数(2)里有更深入的阐述。如果面对更复杂的情况,比如需要拟合的回归变量不止一个,那就可以用上
线性回归模型的建立
注:通常用向量下标
表示第个样本,标量下标表示第个特征分量,它们同时出现时,代表第个样本的第个特征分量。如果手机端无法正常显示加粗,请转战电脑端。
随便来一个数据集,特征为
能不能在误差尽可能小的情况下,给它们强加一个线性关系呢?
我们先前讲到,一个线性函数就是形如
这种误差标准下,我们的目标就是选取
优化问题的求解
多元函数求导:梯度与雅可比矩阵
想必大家都对一元函数求导
其中
由向量内积的柯西-施瓦茨不等式,
梯度方向是函数增加最快的方向,这也是后续梯度下降等迭代优化算法的理论基础。
如果将求偏导的操作再抽象一下,即引入Nabla算子
则梯度又可以用
现在我们已经把多元函数的导数摸清了,且求多元函数的导数,就等同于求
将每一个分量的梯度向量按行拼装为矩阵,则我们可以得到这样一个矩阵,称为雅可比矩阵(Jacobian):
之后让我们用
后文中的“求导”均代指求梯度向量/雅可比矩阵。
对线性函数求导
考虑关于
对线性映射求导
考虑关于
一眼就可以看出,雅可比矩阵的第
对二次型求导
考虑关于
这正好是
至此,我们已经有了充足的矩阵微积分知识储备,接下来就是干掉线性回归问题的时候了!
利用矩阵微积分求解线性回归
假设数据集给出
则优化目标又可表示为
其中利用了向量范数的等价形式
其中
令导数为
注:整个求解过程都看不懂也无大碍!只要记住本公式,并记下矩阵
的形式,照样可以接着往下展开。直接对作无约束优化,推导过程比这间便多了,但结果不好看,详见文末理论习题3。
如何进一步改善性能
到目前为止,我们仅仅是按照最理想的形式构造线性关系。但是数据集中存在太多不确定因素,真实的数据集很有可能长得奇形怪状,比如存在一个离群值:
这一个离群值直接把整个拟合结果带跑偏了。因为平方距离受离群值的干扰很大(就比如
此外,最小二乘估计式中,涉及到大规模矩阵乘法,更要命的是还有矩阵逆运算。一旦矩阵规模变得非常大,或者
。
为了应对上述现象,一种可行的方法就是引入正则化方法(Regularization),通过向损失函数
(1)岭回归(Ridge Regression): 将参数的
可解得
其中
(2)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,差距不小。是选用算法不行么?还是需要再调调参?给大家留下一个思考题:如何修正算法或调整数据集,改善这个模型的算法效果。感兴趣的同学们可以编写代码,以验证你的猜想。
课后习题
理论习题
- 我之前故意没给出线性映射的正式定义,因为一正经起来就不直观,也不好理解了。现在给定线性映射的定义:若映射
保持加法和数乘运算:
则称
若
维向量空间中,是一组线性无关的向量,试证明任意一个维向量都能用线性表示。这个结论告诉我们,线性空间的维数是由线性无关向量的最多个数(极大线性无关组)决定的。
我采用矩阵写法和矩阵形式求导纯粹是因为最终结果超级好看。对初学者来说,求解这个优化问题远没我写的那么复杂。尝试以
为变元,对作无约束优化,将线性回归的求解用自己的语言描述。尝试自己使用矩阵微积分或无约束优化的知识,求解岭回归问题:
上机操练
- 使用“世一大历年录取分数线”数据集,根据2018年所有省份的一本线、录取难度、同专业全国招生人数、本专业录取人数这四个特征,设计线性回归模型,以预测2019年浙江省各专业录取分数,并和实际分数线比较,以对算法作出评价。任务说明如下:
(1)录取难度:由于录取难度与招生总人数成反比,与最低录取分数线成正比,但不能用纯分数线刻画(如江苏和海南的高考总分不是750),应该用分数线和总分的比值来衡量。因此,设录取难度为
其中系数
(2)题意:既然给定了这四个特征,那么我们的目的就是将录取分数表示为它们的线性组合。任务中每一个省份的每一个专业都构成一条样本,同一省份的各个专业共享参数“一本线、录取难度”,同一专业的各个省份共享参数“同专业全国招生人数”。明确了这点,整理数据集就有头绪了。
(3)预测目标是19年浙江省的录取分数线。在19年数据未知的情形下,如何估计同专业全国招生人数、录取难度和本专业录取人数是一个值得仔细思考的问题。
- 使用“FIFA球员现实信息”数据集,利用能力、潜力、身价、周薪、国际声誉、逆足能力、花式技巧这些特征,建立线性回归模型,预测每一位球员的关注度。任务说明如下:
(1)建议的训练模式:七三开,用随机抽取的
(2)数据标准化:周薪、身价、国际声誉这些特征的数据尺度完全不一样,需要将它们调整一下,使得数据尺度接近,这样算法效果会更好哦~
c++2个三维向量求角度差_交叉学科入门指南(2)——线性回归相关推荐
- 三维向量求夹角(0-360)
规定Z轴的正方向是(0,0,1) 从a->b做法向量: a和b的法向量与Z轴正向的积,积大于0,同向,夹角为正: 积小于0,反向,夹角为负,这里要求0-360,所以夹角为2*pi-theta: ...
- unity三维向量变化为角度_对于向量和矩阵的理解
学数值计算还有复变函数了喔,矩阵忘干净了.又看了一遍 蓝棕 的相关的讲解,总结一下. 1.向量是什么? 从初到末的箭头(物理角度,表示一种运动过程) 有序的数字列表(计算机/数学角度)[1,2] 加和 ...
- unity三维向量变化为角度_三维旋转
chopper:目录zhuanlan.zhihu.com 本篇文章主要介绍三维空间下旋转的三种表示形式:四元数.矩阵和欧拉角,阐述了三种旋转表示的数学原理并且对比了它们的优缺点.目录结构: 四元数 ...
- matlab求傅里叶级数展开式_傅里叶级数:从向量的角度看函数
帮助你理解线性代数与机器学习紧密结合的核心内容 下文节选自北大出版社<机器学习线性代数基础>, [遇见]已获授权许可. 这本书不同于传统教材, 从新的角度来介绍线性代数的核心知识, 讲解也 ...
- 求两个三维向量的夹角(带正负)
1.数学上,两个三维向量夹角是没有正负的. 但是从公垂线的角度来看,可以有方向性.参考如下: 三维空间中两个向量会有一条公垂线(向量叉乘可以求得),以公垂线为轴,将第二个向量旋转一个角度,使其与第一个 ...
- 机器之心最干的文章:机器学习中的矩阵、向量求导
作者:七月 本文的目标读者是想快速掌握矩阵.向量求导法则的学习者,主要面向矩阵.向量求导在机器学习中的应用.因此,本教程而非一份严格的数学教材,而是希望帮助读者尽快熟悉相关的求导方法并在实践中应用.另 ...
- java 三维向量类_三维向量类
还是在读书的时候帮外专业朋友做作业,用GDI实现三维空间的立方体绘制和旋转的操作,那个时候自己根据<线性代数与空间解析几何>以及<计算机图形学>等课程的相关知识写了一个三维向量 ...
- 基于三维向量对的乱序堆叠物体的位姿识别
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 摘要:针对乱序堆叠物体识别效率低.速度慢的问题,提出一种快速可靠的3D对象检测可以应用于复杂场景中随机 ...
- hdu 1174:爆头(计算几何,三维叉积求点到线的距离)
爆头 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...
最新文章
- 怎样在swift中创建CocoaPods
- js中判断两个数字的大小
- win10安装pytorch
- python列表按照批次分配数据(亲测)
- 计算机启动时默认输入法设置,每次开机都需要重设,教你电脑输入法怎么设置默认模式...
- c语言二级考试题库及答案,c语言二级考试题库
- win11 edge怎么卸载?win11 edge浏览器彻底卸载的方法教程
- html鼠标悬停边框颜色,CSS实现鼠标悬停图片时的边框变色效果
- 【uni-app】uni-app移动端开发 - 登录界面
- 新概念二册 Lesson 20 One man in a boat独坐孤舟 ( 动名词 doing)
- 墙外干货:如何通过风格指南驱动模块化交互设计
- 暑假假期训练总结-3
- 我最喜欢的音乐系列之李连杰电影插曲
- (信号灯七)综合版本-使用HSV颜色空间将类绿色、红色和黄色区域分别二值化
- 一文了解销售软件产品的增值税即征即退政策
- 让Android Studio项目通过阿里云 代理加速下载依赖资源
- 【Python】利用zipfile.ZipFile和write()创建压缩包
- Mac上可与“时间机器”搭配使用的备份磁盘
- 百万美元“未来科技大奖”揭晓:山东大学彭实戈教授荣获数学与计算机科学奖-547。
- anaconda一次性更新所有安装库
热门文章
- nginx mysql 安装_CentOS7下安装Nginx+MySQL教程
- Centos7.5源码编译安装nodejs
- centos7安装ddos-deflate
- Android判断网线连接
- Matlab实现字符串分割
- linux root目录install,Linux如何建立、删除、切换目录?
- web前端三大主流框架_小猿圈web前端之前端的主流框架都有哪些?
- 设计模式理解:中介者模式(Mediator)
- 关于QSqlTableModel的使用说明(QT上创建本地SQL)
- c语言位运算_C语言自增减、逻辑运算、位运算、位移运算及三目运算操作