程序员必备的一些数学基础知识
作为一个标准的程序员,应该有一些基本的数学素养,尤其现在很多人在学习人工智能相关知识,想抓住一波人工智能的机会。很多程序员可能连这样一些基础的数学问题都回答不上来。
作为一个傲娇的程序员,应该要掌握这些数学基础知识,才更有可能码出一个伟大的产品。
向量 向量(vector)是由一组实数组成的有序数组,同时具有大小和方向。一个n维向量a是由n个有序实数组成,表示为 a = [a1, a2, · · · , an]
矩阵
线性映射 矩阵通常表示一个n维线性空间v到m维线性空间w的一个映射f: v -> w
注:为了书写方便, X.T ,表示向量X的转置。 这里: X(x1,x2,...,xn).T,y(y1,y2,...ym).T ,都是列向量。分别表示v,w两个线性空间中的两个向量。A(m,n)是一个 m*n 的矩阵,描述了从v到w的一个线性映射。
转置 将矩阵行列互换。
加法 如果A和B 都为m × n的矩阵,则A和B 的加也是m × n的矩阵,其每个元素是A和B相应元素相加。 [A + B]ij = aij + bij .
乘法 如A是k × m矩阵和B 是m × n矩阵,则乘积AB 是一个k × n的矩阵。
对角矩阵 对角矩阵是一个主对角线之外的元素皆为0的矩阵。对角线上的元素可以为0或其他值。一个n × n的对角矩阵A满足: [A]ij = 0 if i ̸= j ∀i, j ∈ {1, · · · , n}
特征值与特征矢量 如果一个标量λ和一个非零向量v满足 Av = λv, 则λ和v分别称为矩阵A的特征值和特征向量。
矩阵分解 一个矩阵通常可以用一些比较“简单”的矩阵来表示,称为矩阵分解。
奇异值分解 一个m×n的矩阵A的奇异值分解
其中U 和V 分别为m × m和n×n 的正交矩阵,Σ为m × n的对角矩阵,其对角 线上的元素称为奇异值(singular value)。
特征分解 一个n × n的方块矩阵A的特征分解(Eigendecomposition)定义为
其中Q为n × n的方块矩阵,其每一列都为A的特征向量,^为对角阵,其每一 个对角元素为A的特征值。 如果A为对称矩阵,则A可以被分解为
其中Q为正交阵。
导数 对于定义域和值域都是实数域的函数 f : R → R ,若f(x)在点x0 的某个邻域∆x内,极限
存在,则称函数f(x)在点x0 处可导, f'(x0) 称为其导数,或导函数。 若函数f(x)在其定义域包含的某区间内每一个点都可导,那么也可以说函数f(x)在这个区间内可导。连续函数不一定可导,可导函数一定连续。例如函数|x|为连续函数,但在点x = 0处不可导。
加法法则
y = f(x),z = g(x) 则
乘法法则
链式法则 求复合函数导数的一个法则,是在微积分中计算导数的一种常用方法。若 x ∈ R,y = g(x) ∈ R,z = f(y) ∈ R ,则
Logistic函数是一种常用的S形函数,是比利时数学家 Pierre François Verhulst在 1844-1845 年研究种群数量的增长模型时提出命名的,最初作为一种生 态学模型。 Logistic函数定义为:
当参数为 (k = 1, x0 = 0, L = 1) 时,logistic函数称为标准logistic函数,记 为 σ(x) 。
标准logistic函数在机器学习中使用得非常广泛,经常用来将一个实数空间的数映射到(0, 1)区间。标准 logistic 函数的导数为:
softmax函数是将多个标量映射为一个概率分布。对于 K 个标量 x1, · · · , xK , softmax 函数定义为
这样,我们可以将 K 个变量 x1, · · · , xK 转换为一个分布: z1, · · · , zK ,满足
当softmax 函数的输入为K 维向量x时,
其中,1K = [1, · · · , 1]K×1 是K 维的全1向量。其导数为
离散优化和连续优化 :根据输入变量x的值域是否为实数域,数学优化问题可以分为离散优化问题和连续优化问题。
无约束优化和约束优化 :在连续优化问题中,根据是否有变量的约束条件,可以将优化问题分为无约束优化问题和约束优化问题。 ### 优化算法
全局最优和局部最优
海赛矩阵
《运筹学里面有讲》,前面一篇文章计算梯度步长的时候也用到了: 梯度下降算法
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
梯度下降法
梯度下降法(Gradient Descent Method),也叫最速下降法(Steepest Descend Method),经常用来求解无约束优化的极小值问题。
梯度下降法的过程如图所示。曲线是等高线(水平集),即函数f为不同常数的集合构成的曲线。红色的箭头指向该点梯度的反方向(梯度方向与通过该点的等高线垂直)。沿着梯度下降方向,将最终到达函数f 值的局部最优解。
梯度上升法
如果我们要求解一个最大值问题,就需要向梯度正方向迭代进行搜索,逐渐接近函数的局部极大值点,这个过程则被称为梯度上升法。
概率论主要研究大量随机现象中的数量规律,其应用十分广泛,几乎遍及各个领域。
离散随机变量
如果随机变量X 所可能取的值为有限可列举的,有n个有限取值 {x1, · · · , xn}, 则称X 为离散随机变量。要了解X 的统计规律,就必须知道它取每种可能值xi 的概率,即
称为离散型随机变量X 的概率分布或分布,并且满足
常见的离散随机概率分布有:
伯努利分布
二项分布
连续随机变量
与离散随机变量不同,一些随机变量X 的取值是不可列举的,由全部实数 或者由一部分区间组成,比如
则称X 为连续随机变量。
概率密度函数
连续随机变量X 的概率分布一般用概率密度函数 p(x) 来描述。 p(x) 为可积函数,并满足:
均匀分布 若a, b为有限数,[a, b]上的均匀分布的概率密度函数定义为
正态分布 又名高斯分布,是自然界最常见的一种分布,并且具有很多良好的性质,在很多领域都有非常重要的影响力,其概率密度函数为
其中, σ > 0,µ 和 σ 均为常数。若随机变量X 服从一个参数为 µ 和 σ 的概率分布,简记为
累积分布函数
对于一个随机变量X,其累积分布函数是随机变量X 的取值小于等于x的概率。
以连续随机变量X 为例,累积分布函数定义为:
其中p(x)为概率密度函数,标准正态分布的累计分布函数:
随机向量
随机向量是指一组随机变量构成的向量。如果 X1, X2, · · · , Xn 为n个随机变量, 那么称 [X1, X2, · · · , Xn] 为一个 n 维随机向量。一维随机向量称为随机变量。随机向量也分为离散随机向量和连续随机向量。 条件概率分布 对于离散随机向量 (X, Y) ,已知X = x的条件下,随机变量 Y = y 的条件概率为:
对于二维连续随机向量(X, Y ),已知X = x的条件下,随机变量Y = y 的条件概率密度函数为
期望 对于离散变量X,其概率分布为 p(x1), · · · , p(xn) ,X 的期望(expectation)或均值定义为
对于连续随机变量X,概率密度函数为p(x),其期望定义为
方差 随机变量X 的方差(variance)用来定义它的概率分布的离散程度,定义为
标准差 随机变量 X 的方差也称为它的二阶矩。X 的根方差或标准差。
协方差 两个连续随机变量X 和Y 的协方差(covariance)用来衡量两个随机变量的分布之间的总体变化性,定义为
协方差经常也用来衡量两个随机变量之间的线性相关性。如果两个随机变量的协方差为0,那么称这两个随机变量是线性不相关。两个随机变量之间没有线性相关性,并非表示它们之间独立的,可能存在某种非线性的函数关系。反之,如果X 与Y 是统计独立的,那么它们之间的协方差一定为0。
随机过程(stochastic process)是一组随机变量Xt 的集合,其中t属于一个索引(index)集合T 。索引集合T 可以定义在时间域或者空间域,但一般为时间域,以实数或正数表示。当t为实数时,随机过程为连续随机过程;当t为整数时,为离散随机过程。日常生活中的很多例子包括股票的波动、语音信号、身高的变化等都可以看作是随机过程。常见的和时间相关的随机过程模型包括贝努力过程、随机游走、马尔可夫过程等。
马尔可夫过程 指一个随机过程在给定现在状态及所有过去状态情况下,其未来状态的条件概率分布仅依赖于当前状态。
其中X0:t 表示变量集合X0, X1, · · · , Xt,x0:t 为在状态空间中的状态序列。
马尔可夫链 离散时间的马尔可夫过程也称为马尔可夫链(Markov chain)。如果一个马尔可夫链的条件概率
马尔可夫的使用可以看前面一篇写的有意思的文章: 女朋友的心思你能猜得到吗?——马尔可夫链告诉你 随机过程还有高斯过程,比较复杂,这里就不详细说明了。
信息论(information theory)是数学、物理、统计、计算机科学等多个学科的交叉领域。信息论是由 Claude Shannon最早提出的,主要研究信息的量化、存储和通信等方法。在机器学习相关领域,信息论也有着大量的应用。比如特征抽取、统计推断、自然语言处理等。
在信息论中,熵用来衡量一个随机事件的不确定性。假设对一个随机变量X(取值集合为C概率分布为 p(x), x ∈ C )进行编码,自信息I(x)是变量X = x时的信息量或编码长度,定义为 I(x) = − log(p(x)), 那么随机变量X 的平均编码长度,即熵定义为
其中当p(x) = 0时,我们定义0log0 = 0 熵是一个随机变量的平均编码长度,即自信息的数学期望。熵越高,则随机变量的信息越多;熵越低,则信息越少。如果变量X 当且仅当在x时 p(x) = 1 ,则熵为0。也就是说,对于一个确定的信息,其熵为0,信息量也为0。如果其概率分布为一个均匀分布,则熵最大。假设一个随机变量X 有三种可能值x1, x2, x3,不同概率分布对应的熵如下:
联合熵和条件熵 对于两个离散随机变量X 和Y ,假设X 取值集合为X;Y 取值集合为Y,其联合概率分布满足为 p(x, y) ,则X 和Y 的联合熵(Joint Entropy)为
X 和Y 的条件熵为
互信息 互信息(mutual information)是衡量已知一个变量时,另一个变量不确定性的减少程度。两个离散随机变量X 和Y 的互信息定义为
交叉熵和散度 交叉熵 对应分布为p(x)的随机变量,熵H(p)表示其最优编码长度。交叉熵是按照概率分布q 的最优编码对真实分布为p的信息进行编码的长度,定义为
在给定p的情况下,如果q 和p越接近,交叉熵越小;如果q 和p越远,交叉熵就越大。
程序员必备的一些数学基础知识有以下几种:
线性代数:主要涉及向量、矩阵、线性方程组、特征值、特征向量、奇异值分解等概念,可以用来处理多维数据和矩阵运算,在机器学习、图像处理、计算机图形学等领域有广泛应用。
微积分:主要涉及导数、积分、极限、泰勒展开等概念,可以用来分析函数的变化率和曲线的形状,在优化算法、神经网络、信号处理等领域有广泛应用。
概率论和统计学:主要涉及随机变量、概率分布、条件概率、贝叶斯理论、期望值、方差、协方差、假设检验等概念,可以用来分析数据的规律和不确定性,在数据挖掘、机器学习、自然语言处理等领域有广泛应用。
离散数学:主要涉及集合、逻辑、关系、函数、图论、树、递归、数论等概念,可以用来描述离散结构和离散对象之间的关系,在算法设计、加密解密、编码理论等领域有广泛应用。
当然,这些只是一些常见的数学基础知识,并不一定涵盖了所有程序员需要掌握的数学内容。不同的领域和方向可能还需要其他的数学知识,比如信息论、复变函数、傅里叶分析等。😊
学习编程需要会哪些数学知识
个人观点:编程,无论是用低级的汇编、C语言还是现在的OOP语言,与《数字电路》和《离散数学》关系不是太大。这两门号称计算机学科的基础,实际上是用于研究计算机的组成原理、架构之类的“深层次”科目。而编程的话,你只要了解语言的基本语句结构、能将问题分解成模块关用语言描述之就可以了。要说与...
做JAVA程序员 有必要学离散数学呢
如果你打算做程序员,而且想有很长远的发展,有很多类似高数,离散,线性代数,编译原理,系统结构,操作系统,软件工程这些理论性很强,又觉得用到很少的东西都要好好学习。现在用不到不等于以后也用不到。
作为一个程序员,有哪些常用的算法?
不要一开始就去学OOP,即使你再精通OOP,遇到一些基本算法的时候可能也会束手无策。2. 丰富的想象力。不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想象力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等...
想要学好计算机需要哪些数学知识?
首先,需要准备数学知识。从计算机的发展史来看,它的体系结构与数学模型等都是由许多数学家提出来的,就连最早的计算机都是为了计算而设计的。如果想要学好计算机,就要具备一定的数学基础。而且想要成为一名程序员,就需要拥有很长的逻辑思维能力。学好数学这门学科后可以锻炼人们的逻辑能力,在计算机的编程...
学习游戏程序开发需要什么样的数学和英语基础?
1 对于游戏逻辑程序员来说,要求要了解数学的基本概念,比如:方程式,向量,三角函数,两点间距离公式,如何判定点在圆内,点线圆相交判定等 对于游戏引擎或工具程序员来说,要求数学比较高一些,要精通线性代数,概率,解析几何,计算机图形学 计算方法 2 无论是逻辑程序还是引擎程序,要求英语基础必须...
软考程序员要看哪些书?
1.2 数据的表示 数的表示(原码、反码、补码表示,整数和实数的机内表示方法,精度和溢出)非数值表示(字符和汉字的机内表示、声音和图像的机内表示)校验方法和校验码(奇偶校验码、海明校验码)1.3 算术运算和逻辑运算 计算机中二进制数的运算方法 逻辑代数的基本运算和逻辑表达式的化简 1.4 数学...
程序员的数学图书目录
程序员的数学图书目录深入探索了数学在编程中的基础概念,从第1章的0的故事开始,讲解了0在计数系统中的重要性,包括10进制和2进制计数法,以及基数转换和按位计数。章节中还探讨了0如何作为占位符和统一标准,以及日常生活中0的运用。第2章逻辑部分,介绍了逻辑在决策和问题解决中的关键作用,通过逻辑...
程序员算法基础——贪心算法
在证明局部的最优解是否可以推出全局最优解的时候,常会用到数学的证明方式。如果是动态规划: 要凑出m元,必须先凑出m-1、m-2、m-5、m-10元,我们用dp[i]表示凑出i元的最少纸币数; 有 dp[i]=min(dp[i-1], dp[i-2], dp[i-5], dp[i-10]) + 1 ; 容易知道 dp[...
编程序是否用到大学高等数学的知识?
没必要学高等数学,真的!只要懂点极限的概念,离散数学的一些知识,其中代数理论,图论和数理逻辑的内容就足够了,高等数学对物理的知识比较有用,开发一般的用户软件根本用不到微积分这样的理论,不过这思想确实是很重要。
要想成为一名顶尖的程序员,要学习高等数学吗
就离不开微积分。再举个例子,密码的编译也离不开矩阵代数应用,无论是密文还是密文转明文。还有,文字索引,文本处理……是在太多太多了。以上的知识,还要变成代码写入你的程序中的。所以,光从应用的角度来看,就离不开高等数学。要想成为顶尖的程序员,那就更要学好高等数学。
贾倩欧来: 我来说两句,第一,程序其实就是一道一道的数学题,当然,如果你搞的是普通的WEB开发什么的,这些东西都不重要,但是做大型软件和搞科学研究的话,算法对一个程序来说至关重要,举个粒子,对20万个数据进行排序,不同的排序算法...
泸定县15764208514: 学习编程要掌握哪些数学知识? - ?
贾倩欧来: 数学知识的话,基础的就行……初中水平. 关键不是在于数学知识,而是在于逻辑思维.能够知道怎么求自己想要的就可以了.
泸定县15764208514: 软件开发的程序员需要掌握多的数学知识? - ?
贾倩欧来: 需要数学,但是这个数学不是说你现在学的数学这点知识,而是你是逻辑思维,如果你仅仅是想成为一个程序员,只是一个写代码的人,那你数学不需要太好,但是,如果你真想好好从事计算机这方面,尤其是想软件开发,你必须得学好数学,...
泸定县15764208514: 一个高级程序员所需要掌握的数学知识是多少? - ?
贾倩欧来: 高级程序员最需要的数学知识:算术:二进制、十进制、十六进制之间熟练转换 逻辑知识:与、或、非、空等各种运算 概率与统计:各种报表的编制开发,数据使用挖掘等等都需要
泸定县15764208514: 程序员应具备怎样得数学基础????????? - ?
贾倩欧来: 看你要做什么样的程序员.如果就是一般的做计算机软件的程序员,几乎不需要什么数学基础,当然,如果你有一些离散数学的基础是最好不过了.但如果你要做计算机特殊领域的程序员,比如,人工智能,模式识别,数据加密,数据压缩,数字图像等等,那就需要相关的数学基础了,包括微积分、线性代数、概率论、统计学、数论等等.盖茨曾经说过,不要过分夸大数学对软件的重要性.
泸定县15764208514: 学习编程需要的数学知识 - ?
贾倩欧来: 需要的数学知识:初中的数学水平足够应付C++的入门学习了! C++的基础入门是不需要太深奥的数学知识,主要是语法的理解和句法的应用,重在熟悉他的思维方式和编程思想.类 的实现和 函数 的应用是重点. 当然,如果涉及到具体的数学...
泸定县15764208514: 我要成为超牛得程序员,都需要哪些数学知识? - ?
贾倩欧来: 看你干什么,程序员不是什么都干的也不是超人,每人都有自己的领域,不同领域需要不同的知识,一般"程序员"就是个写代码的,为啥这样写更本不用知道,人家也不屑告诉你 程序员没啥好当的,劝你早点改行,钱少 卖青春卖健康,卖自己的业余时间,当当爱好就行了
泸定县15764208514: 学软件开发需要具备怎样的数学基础呀??? - ?
贾倩欧来: 软件开发需要数学基础,不是是有数学基础就能学懂软件开发的课程.因为软件开发是需要有很强的逻辑思维.如果仅仅是想成为一个程序员,只是一个写代码的人,那数学不需要太好.如果想精通计算机这方面操作,尤其是软件开发,则必须...
泸定县15764208514: 要做程序员需要学会什么??
贾倩欧来: 程序员需要学习:1、掌握数据及其转换、数据的机内表示、算术和逻辑运算,以及相关的应用数学基础知识;2、理解计算机的组成以及各主要部件的性能指标;3、掌握操作系统、程序设计语言的基础知识;4、熟练掌握计算机常用办公软件的基本操作方法;5、熟练掌握基本数据结构和常用算法;6、熟练掌握C程序设计语言,以及C++、Java、Visual Basic中的一种程序设计语言;7、熟悉数据库、网络和多媒体的基础知识;8、掌握软件工程的基础知识,了解软件过程基本知识、软件开发项目管理的常识;9、了解常用信息技术标准、安全性,以及有关法律、法规的基本知识;10、了解信息化、计算机应用的基础知识;11、正确阅读和理解计算机领域的简单英文资料.
泸定县15764208514: 学编程要具备那些知识基础 - ?
贾倩欧来: 上午好?1、一些常用数据结构,算法以及你编程要用到的程序语言,如果你的编程还需要涉及接口和比较底层的内容的话,还要学计算机体系结构,汇编语言和明确学习编程的目的.2、打好基础:(1)数学基础 从计算机发展和应用的历史来看...