程序员的数学课06 向量及其导数:计算机如何完成对海量高维度数据计算?
在上一课时,我们学习了利用梯度下降法求解函数的极值。我举了个例子,如果商品利润函数 r 和补贴金额 x 的关系为 r(x) = p(x)×(m - x - c) = (2/(1+e-x) - 1)×(16 - x - 8),然后我又利用梯度下降法,求解出让利润最大的补贴额 x* 为 2.42 元。
就这个例题而言,其实根本不需要求导法或者是梯度下降法。这是因为,商品定价是 8 元,补贴额 x 的决策空间就是从不打折的 0 元到不要钱的 8 元。如果最小颗粒度是“分”,那么决策空间就是 0.00元~8.00元,这 801 个变量而已。写个 for 循环,对每一个可能的补贴额都简单粗暴地计算一遍,也是一种简单可行的方法。
然而,实际问题中可能会更加复杂。例如,购买概率除了与补贴额有关以外,还跟同行竞争对手的补贴额、商品的有效期、温度、天气、节假日等因素有关。假设有 n 个可能的因素,每个因素的决策空间都是 801 个,那么整体的决策空间就瞬间变成了 801n 个!
此时再用简单粗暴的 for 循环计算就变得不现实了,这也是在大数据环境下,数学算法对复杂业务环境求解计算的优势。
向量是高维度数据的处理单元
我们提到,除了补贴额,影响商品购买率的因素还有很多。为了综合刻画这些因素对购买概率以及利润的影响,自然就需要用多元函数来表达,即 r(x,y,z...) = r(补贴额,有效期,温度...)。
维度
每个影响购买概率的因素,又可称作维度。当维度逐渐变多时,就意味着我们需要在高维度数据空间下处理某个多元函数。在计算机或数学领域中,通常用向量或矩阵来对高维度数据进行计算和表示。
向量
向量是高维度数据的表现形式,它由多个数字组合在一起,其中每个数字都是某个维度的特征值。通常印刷体用斜体、加粗的小写字母表示,例如 a=[1,2,3,4,5],而手写时在字母顶上加一小箭头“→”即可。
矩阵
既然向量是多个数字的组合,同样我们也可以把多个向量组合在一起就得到了矩阵。矩阵通常用斜体、加粗的大写字母表示,例如:
根据向量和矩阵的定义,不难发现向量是一种行数为 1 或列数为 1 的特殊矩阵。有了向量和矩阵,就能把高维度的数据用简单的数学符号表达了。
矩阵的基本运算
因为向量是一种特殊的矩阵,矩阵的基本运算对于向量也适用。
1.转置
先来介绍一下矩阵的转置。转置用大写字母 T 作为上标来表示,作用是交换矩阵行和列的值。这样原本的大小就由 n×m 变成 m×n 了,例如:
2.向量的点乘运算
点乘运算只适用于向量,用“·”表示。计算的结果为,两个向量所有对应项的乘积之和。例如,向量 a= [a1,a2,...,an] ,b= [b1,b2,...,bn],则a·b=a1b1+a2b2+……+anbn。例如 a= [1,2,3] ,b= [2,3,4],则 a·b= 1×2 + 2×3 + 3×4 = 20。
3.矩阵的乘积运算
接下来看一下矩阵相关的乘积运算。矩阵可以有两种乘积相关的运算,第一个是矩阵的乘法,第二个是哈达玛积。
运算矩阵的乘法
如果有 n×p 的矩阵 A 和 p×m 的矩阵 B,则矩阵A 和 B 可以做乘法运算。其乘积结果 C =AB 的大小为 n×m,其中每个元素的数值为(C 矩阵中第 i 行第 j 列)
需要注意的是,矩阵的乘法对维数有严格要求。第一个矩阵的列数与第二个的行数必须相等。所以,矩阵的乘法并不满足交换律。
哈达玛积
哈达玛积在对海量数据预处理中会被高频使用,它的计算方式相对简单很多。哈达玛积要求两个矩阵的行列维数完全相同,计算方式是对应位置元素的乘积,例如:
4.求逆运算
最后一个矩阵的基本运算是求逆运算,这很像在标量里对一个数字求倒数。
我们先来介绍一个特殊的矩阵——单位矩阵。单位矩阵定义为主对角线元素为 1,其他元素为 0 的方阵,用I来表示,例如:
求逆运算只可应用在方阵上,用 -1 作为上标来表示,输出的结果也称作逆矩阵。逆矩阵满足的性质是,与原矩阵做乘法运算后,结果为单位矩阵,即 A×A-1=I。
向量的求导
前面说过,在对复杂业务问题进行形式化定义后,再求解最优值的过程中,不管是用求导法还是梯度下降法,都是逃不开要对目标函数进行求导的。复杂业务环境中,自变量肯定不止一个,这就需要我们在向量或矩阵的环境中,掌握求导的运算。
实际工作中,矩阵的求导用得非常少,掌握向量的求导就足够了。因此,我们重点学习“向量关于向量”的导数计算。
我们先给出向量关于向量的导数的计算方法。向量 y 关于向量 w 的求导结果是个矩阵,标记为A。矩阵 A 中第 i 行第 j 列的元素 aij,为向量 y 中第 i 个元素关于向量 w 中第 j 个元素的导数。例如,如果向量 w 的维数为 n×1,向量 y 的维数是 m×1,则 y 关于 w 的求导结果矩阵维数就是 n×m,其中第 i 行第 j 列的元素为:
此时,向量的求导就变成了标量的求导了,相信这并不会难倒我们。
我们给出个相关例题:
如果 wTx= y,其中 w 和 x 都为 n×1 的向量。显然这里的 y 是个标量,也就是一个 1×1 的特殊向量。求 y 关于 x 的导数。
这里的 T 表示的是转置。此处 wTx 是矩阵乘法,1×n 和 n×1 才能相乘。另一种表示方法是 w·x,表示向量点乘。此处二者结果一样。
它的解析过程如下图所示:
计算机处理海量数据
计算机在处理海量数据时,常常依赖复杂的数据结构进行存储。例如数组、链表、栈、哈希表、结构体等等。对于海量数据而言,一定要明确样本和维度这两个概念:
样本,是指一条一条数据,代表的数据的个数;
维度,是指每一条样本的数据集合,代表数据特征的数量。
举个例子,全班 50 名同学语文、数学、英语的考试成绩,就可以视作微型的海量数据。在这个数据集中,50 个同学每个人都有自己的乘积,因此样本就是 50 个。而每个同学的样本,又包含了数学成绩、语文成绩 、英语成绩,这就是每个样本的 3 个维度,也可以称作 3 个特征。这样,就可以得到维数为 50×3 的成绩矩阵。
假设你需要对全班同学的成绩做一些统计计算,那向量的知识就突显出来了。通过向量的加减法,你可以计算出每个人的总分,也可以计算出全班同学每一门课的平均分;通过向量的点乘、哈达玛积,你可以计算出每个同学的偏科情况,即方差。
有了这些基础知识,你就能应对大数据环境中数据的存储、处理、计算和应用了。
小结
在实际工作中,你常会遇到高维度的数据,向量和矩阵就是必不可少的数学基础知识,计算机在处理海量数据时,就通常以向量或数组为单位。
最后我们留一个作业:假设矩阵 50×3 的矩阵 A 为全班 50 个同学 3 门课的考试成绩矩阵,用代码来实现每个同学的得分方差的计算,其中方差的公式为:
如果你用 Python 来开发,可能会用到 NumPy 库,你也可以考虑用 MATLAB 来实现。
关于向量的运算,还可以应用在对散点进行线性回归的拟合中,我们会在下一讲“07 | 线性回归:如何在离散点中寻找数据规律?”中向你详细讲解。
精选评论
*强:
有点看不懂了
程序员的数学课06 向量及其导数:计算机如何完成对海量高维度数据计算?相关推荐
- 【程序员必修数学课】->基础思想篇->递归(下)->分而治之从归并排序到MapReduce
递归(下) 前言 归并排序中的分治思想 分布式系统中的分治思想 1.数据分割和映射 2.归约 3.合并 总结 前言 在上一篇中,我介绍了如何使用递归,来处理迭代法中比较复杂的数值计算.但是我们知道,有 ...
- 一个程序员应该怎样去学习和掌握计算机英语
最近在学习英语,在本科的时候就通过了英语六级的考试,可是实话实说,那只是一次应试的过程,现在的英语仍然是张不开嘴,而且随着时间的流逝那些原本的词汇也忘得差不多了,在网上看到了一篇介绍程序员英语的文章, ...
- 某程序员哀叹工资低:二本计算机毕业,四年前端开发,年包才四十万!薪资真的和学历挂钩吗?...
程序员的薪资和学历有关系吗?是不是学历越高薪资越高? 一个程序员发帖问大家:为什么大家的工资都那么高,毕业三五年就能达到年包六七十万?自己二本计算机专业,做了四年前端开发,如今年包四十多万就到顶 ...
- 程序员等级测试,你不进来试试么?听说等级高的都进一线bat了!
变量是什么?回答出一个清晰准确的解释可能会一下子难倒有经验的程序员. 在讨论变量之前,我们先来了解一下数据认知. 数据认知 计算机系统中有各种类型的数据,简单的如int,char等.在更抽象的层面上, ...
- 转:程序员应该怎样去学习和掌握计算机英语呢?
原文地址:http://mp.weixin.qq.com/s?__biz=MzA3ODY0MzEyMA==&mid=401008537&idx=2&sn=04269c2a5f3 ...
- 一个程序员应该怎样去学习和掌握计算机英语呢
干程序员是一项很辛苦的工作,要成为一个高水平的程序员尤为艰难.这是因为计算机软件技术更新的速度越来越快,而这些技术大多来源于英语国家,我们在引进这些技术时往往受到语言障碍的制约,严重影响到对新技术的理 ...
- 程序员的数学课23 站在生活的十字路口,如何用数学抉择?
人的一生需要面临很多重大的选择和决策,举例而言: 大漂亮毕业一年后遇到了一个小伙靠谱哥:面对靠谱哥的追求,大漂亮是应该接受还是拒绝? 大迷糊工作 3 年,猎头推荐给他一个不错的工作机会,面对年薪 30 ...
- 程序员的数学课16 二分法:如何利用指数爆炸优化程序?
正式讲课之前,我先问你这样一个问题,请你尽可能快速回答. 一张 1 毫米厚度的纸,对折几次后,可以达到地球到月球的距离(39 万公里)? 我在写这篇稿子的时候,问了身边的几个朋友.最小的回答是 1 万 ...
- Java程序员三年的工作经验,却不如一个新人的工资高???
文章目录 一.关于程序员的几个阶段 第一阶段:三年 第二阶段:五年 第三阶段:十年 二.关于项目经验 三.关于专业技能 1.基本语法 2.集合 3.设计模式 4.多线程 5.JDK源码 6.框架 7. ...
最新文章
- SAP QM 模块的弊端?
- React笔记:React基础(2)
- 世界人民盼丰收-国际农民丰收节贸易会:世界农民节日
- php root 启动,php-fpm如何以root身份启动
- java 重复提交_java解决重复提交表单
- Developer Express 中Gridcontrol获取选中行单元格的值
- springboot获取静态图片路径_springboot为实体追加图片路径
- 蓝桥杯 ADV-148算法提高 排队打水问题(贪心)
- java web scala_Springboot与scala编写第一个web程序
- 硬刚Hive | 4万字基础调优面试小总结
- 统计 fasta 文件序列长度及 GC 含量
- css 将图片折角,纯css3实现的折角效果(无需图片和js代码)
- 马士兵_JAVA自学之路
- 今年天猫双11的这些技术,可能会改变整个零售行业
- 信息系统项目管理师对入户广州还能发挥作用吗?
- mybatis源码-plugin源码
- 【RDMA】14. RDMA之Memory Window
- 链接器、链接过程及相关概念解析
- 计算机表格单元格合并,excel表格数据拆分和合并单元格-excel中如何将已经合并的单元格拆分,并将该单元格......
- 我是这样克服拖延症的
热门文章