注:本文的代码是使用Python 3写的。
机器学习中的基本数学知识 线性代数(linear algebra) 第一公式矩阵的操作 换位(transpose)矩阵乘法矩阵的各种乘积内积外积元素积(element-wise product/point-wise product/Hadamard product加低等数学几何 范数(norm)拉格朗日乘子法和KKT条件微分(differential) 表示形式法则常见导数公式统计学/概率论信息论 香农熵(Shannon Entropy)博弈论不知道放到哪儿机器学习 激活函数损失函数附录 希腊字母的含义和发音数学符号的含义和发音参照
f(x)=xwT+b
这是在机器学习中,最常见的公式。我把这个称为机器学习的第一公式,实际上就是线性分类函数(linear classifier)。 训练分类器的目标就是求出(w,b)。 其中: x 是一个一行矩阵 [[x1,x2,...,xn]]。 w 是一个一行矩阵 [[w1,w2,...,wn]]。 x 和 w 的维度相同。 b 是一个数。 xwT=∑ni=1xiwi
,称为点积(dot product)。
有时,我们也会见到这个公式表示为类似下面的样子,它们的基本含义都是一样的。 f(x)=wx+b
f(x)=wTx+b f(x)=w⃗ ⋅x⃗ +b
注:这里w
表示为一个一维数组(或者向量、矢量(vector)) [x1,x2,...,xn]。 注:一维数组:在数学上,可以理解为向量,表示多维空间上的一个点。 注:由于在线性代数中,矩阵乘法ab≠ba,所以对于表达式wTx,严格地说,要把矢量(向量)看做一列的矩阵(而不是一行的矩阵),才符合数学上的定义。 注:表达式w⃗ ⋅x⃗ 和wx是正确的,因为w和x
是矢量,这个符合矢量计算的定义。
由于,这篇文章是从数学的角度写的,所以我们先关注矩阵的操作。
换位(transpose)
矩阵的换位操作:将矩阵中的数按照对角线交换。 数学公式:wT
代码示例:
# Matrix Transpose m = numpy.mat([[1, 2], [3, 4]]) print("Matrix.Transpose:") print(m.T) ''' Output: Matrix.Transpose: [[1 3] [2 4]] '''矩阵乘法
矩阵相乘的含义 如果一斤苹果10元,5斤苹果多少元?答案是:10∗5=50
如果一斤苹果10元,一斤梨20元,5斤苹果2斤梨一共多少元? 答案是:
[1020][52]=10×5+20×2=90
我们可以看出矩阵相乘的约束:乘数1的列数要和乘数2的行数相等。
矩阵乘法不满足交换律
m1⋅m2≠m2⋅m1
我们再看看交换乘数后,计算的结果:[1020][52]=[10×520×510×220×2]=[501002040]
比如:数20的含义是2斤苹果多少钱。
举例说明它们的不同之处:
m1=[12]
m2=[1020]
m1⋅m2的计算方法是:m1⋅m2=[12][1020]1∗10+2∗20=[50]
m2⋅m1
的计算方法是:m2⋅m1=1020110∗120∗1210∗220∗2=[10202040]
计算公式 矩阵相乘是:用矩阵1的每一行和矩阵2的每一列的点积,得到一个矩阵。 l∗m 的矩阵乘以 m∗n 的矩阵,形成一个l∗n 的矩阵。
x⋅y=[x1⋯xn]⎡⎣⎢y1⋯yn⎤⎦⎥=[∑ni=1xiyi]x⋅y=⎡⎣⎢x1⋯xm⎤⎦⎥[y1⋯yn]=⎡⎣⎢x1y1⋯xmy1⋯⋯⋯x1yn⋯xmyn⎤⎦⎥x⋅y=⎡⎣⎢⎢⎢x11x21⋯xm1⋯⋯⋯⋯x1nx2n⋯xmn⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢⎢y11y21⋯yn1⋯⋯⋯⋯y1qy2q⋯ynq⎤⎦⎥⎥⎥⎥=⎡⎣⎢∑ni=1x1iyi1⋯∑ni=1xmiyi1⋯⋯⋯∑ni=1x1iyiq⋯∑ni=1xmiyiq⎤⎦⎥
代码演示:# Matrix Multiplication print("Matrix Multiplication") a = numpy.mat([1, 2]) b = numpy.mat([[10], [20]]) print(a * b) print(a.T * b.T) a = numpy.mat([[1, 2], [3, 4]]) b = numpy.mat([[10, 20], [30, 40]]) print(a * b) ''' Output: [[50]] [[10 20] [20 40]] [[ 70 100] [150 220]] '''
矩阵的各种乘积
操作数学符号PythonDemo点积(dot product)ab a.dot(b) numpy.dot(a, b)AB=(1,2)(1020)=1∗10+2∗20=50
内积(inner product)a⋅b 〈a,b〉 numpy.inner(a, b)a⋅b=abT
外积(outer product)a⊗b numpy.outer(a, b)A⊗B=(12)(1020)=(1∗102∗101∗202∗20)=(10202040)
元素积(element-wise product, point-wise product, Hadamard product )a∘b a⊙b numpy.multiply(a, b)A⊙B=(1324)(1020)=(1∗103∗102∗204∗20)=(10304080)
注:Python中,矩阵数据可以表示为matrix和ndarray两种类型。 这两种类型的操作非常接近,但是有细微的不同。 ndarray * operation :element-wise product. matrix * operation :dot product. numpy.multiply for ndarray :element-wise product. same. numpy.multiply for matrix :element-wise product. same. numpy.dot for ndarray : inner product. 1-d array. numpy.dot for matrix :dot product. shape determined by values. numpy.inner for ndarray :inner product. 1-d array. numpy.inner for matrix :inner product. shape determined by values. numpy.outer for ndarray :outer product. same. numpy.outer for matrix :outer product. same.
内积
英文: inner product, scalar product。 矢量的降维运算,变成一个数。 矩阵的内积是每行每列的内积的矩阵。
xy=〈x,y〉=∑ni=1xiyi
x = numpy.array([1, 2]) y = numpy.array([10, 20]) print("Array inner:") print(numpy.inner(x, y)) ''' Output: Array inner: 50 ''' x = numpy.mat([[1, 2], [3, 4]]) y = numpy.mat([10, 20]) print("Matrix inner:") print(numpy.inner(x, y)) ''' Output: Matrix inner: [[ 50] [110]] '''
外积
矢量的升维运算, m
维矢量和n维矢量的外积是m∗n为矩阵。 矩阵的并集运算, a1∗a2维矢量和b1∗b2维矩阵的外积是(a1∗a2)∗(b1∗b2)为矩阵。x⊗y=⎡⎣⎢⎢⎢x1x2⋯xm⋯⋯⋯⋯x1nx2n⋯xmn⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢⎢y1y2⋯yp⋯⋯⋯⋯y1qy2q⋯xpq⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢x1y1⋯x1ny1x2y1⋯xmny1⋯⋯⋯⋯⋯⋯x1y1q⋯x1ny1qx2y1q⋯xmny1qx1y2⋯x1ny2x2y2⋯xmny2⋯⋯⋯⋯⋯⋯x1ypq⋯x1nypqx2ypq⋯xmnypq⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥
x = numpy.array([1, 3]) y = numpy.array([10, 20]) print("Array outer:") print(numpy.outer(x, y)) ''' Output: Array outer: [[10 20] [30 60]] ''' x = numpy.mat([[1, 2], [3, 4]]) y = numpy.mat([10, 20]) print("Matrix outer:") print(numpy.outer(x, y)) ''' Output: Matrix outer: [[10 20] [20 40] [30 60] [40 80]] '''
注:有没有发现matrix outer 是vector outer的并集。
元素积(element-wise product/point-wise product/Hadamard product
计算公式
x⋅y=[x1⋯xn][y1⋯yn]=[x1y1⋯xnyn]x⋅y=[x1⋯xn]⎡⎣⎢y1⋯ym⎤⎦⎥=⎡⎣⎢x1y1⋯x1ym⋯⋯⋯xny1⋯xnym⎤⎦⎥x⋅y=⎡⎣⎢x11⋯xm1⋯⋯⋯x1n⋯xmn⎤⎦⎥⎡⎣⎢y11⋯ym1⋯⋯⋯y1n⋯xn⎤⎦⎥=⎡⎣⎢x11y11⋯xm1ym1⋯⋯⋯x1ny1n⋯xmnynn⎤⎦⎥
x = numpy.array([1, 3]) y = numpy.array([10, 20]) print("Array element-wise product:") print(x * y) ''' Output: Array element-wise product: [10 60] '''
加
x = numpy.mat([[1, 2], [3, 4]]) y = numpy.mat([[10, 20],[30, 40]]) print("Matrix Add :") print(x + y) ''' Output: Matrix Add : [[11 22] [33 44]] '''求总和公式 这个大家应该都知道。
∑i=1Nxi=x1+x2+⋯+xn
求总积公式
∏i=1Nxi=x1×x2×⋯×xn
对数 对数的含义: 求数的长度。将乘法转变成加法。解决下溢出问题:由于太多很小的数相乘造成的问题。
数学表达
log(x)=log10xlog2xln(x)
由于不同底的对数的结果是等比关系,所以,有时底数是谁,是无所谓的。
等比 a
等比于b。可用于算法复杂度计算。a ba∝b
下取整(floor)和上取整(ceil)
floor: ⌊x⌋ceil: ⌈x⌉
L1范数 ∥w∥1
: L1范数,也就是各项目绝对值的和。
∥w∥1=∑ni=1|wi|
L2范数 ∥w∥ or ∥w∥2
: L2范数,也就是各项目平方和的平方根。∥w∥=∑ni=1w2i−−−−−−−√
如果方程式f(x)=wx+b
有不等式约束条件,拉格朗日乘子法和KKT条件提供了一种方法,可以计算(w,b)L(w,b,α)
关于拉格朗日乘子法和KKT条件,请看:深入理解拉格朗日乘子法(Lagrange Multiplier)和KKT条件
f′(x)or partial differential in Leibniz notation:∂f(x)∂xdydxor:∇f(x)∇x : the gradient of f at x
含义
df(x)dx=limh→0f(x+h)−f(x)hwhereddx is an operation of f(x)
数学含义是在x
点上,f(x)的变化除以x的变化。 数学上可以认为是:斜率 机器学习中指的是:梯度。 计算梯度后,乘以一个比值(步长),可以得到矫正值,用于反向传播(矫正)权值。 partial differential:偏微分,表示函数在某个维度上的微分。这时,可将其它维度看做常量。
∂(u+v)∂x=∂u∂x+∂v∂x
积法则(product rule)(f⋅g)′=f′⋅g+f⋅g′∂(u⋅v)∂x=u⋅∂v∂x+v⋅∂u∂x
链式法则(chain rule of differentiation)(f(g(x)))′=f′(g(x))g′(x)∂z∂x=∂z∂y⋅∂y∂x
p(A|B)=p(B|A)p(A)p(B)wherep(A) : the probability of observing event A.p(B) : the probability of observing event B.p(A|B) : the probability of observing event A given that B is true.p(B|A) : the probability of observing event B given that A is true.
比如:在判断垃圾邮件的算法中: P(A) : 所有邮件中,垃圾邮件的概率。 P(B) : 出现某个单词的概率。 P(B|A) : 垃圾邮件中,出现某个单词的概率。 P(A|B) : 出现某个单词的邮件,是垃圾邮件的概率。
熵的定义 在信息论中,熵是接收的每条消息中包含的信息的平均量,又被称为信息熵、信源熵、平均自信息量。 熵定义为信息的期望值。 熵实际是对随机变量的比特量和顺次发生概率相乘再总和的数学期望。 熵的单位通常为比特, bit 或者sh(annon) (基于2),但也用nat(基于自然对数)、Hart(基于10)计量,取决于定义用到对数的底。熵的单位不重要。(因为是求对数,所以是等比的。不理解这句话也无所谓。) 熵值是一个>=0的值。 如果为0,则表明结果可以准确预测。从下面的公式可以看出,其概率为1.
熵的特征 发生概率越小的信息,熵值越大。常识的熵为0。从计算损失的角度来说:熵值越大,说明损失越大。期望值 在概率论和统计学中,一个离散性随机变量的期望值(或数学期望、或均值,亦简称期望,物理学中称为期待值)是试验中每次可能结果的概率乘以其结果的总和。 比如掷骰子, 其点数的期望值是3.5: E(x)=1∗1/6+1∗2/6+1∗3/6+1∗4/6+1∗5/6+1∗6/6=3.5
通俗的理解 信息熵是: 各个 (值的概率 * 值的长度) 的总和。
数据集的信息熵的计算公式
H(X)=E[I(X)]=E[−lnP(X)]=∑i=1nP(xi)I(xi)=−∑i=1nP(xi)logP(xi)(1)(2)(3)(4)whereH(X):数据集合X的信息熵值。E():求期望值。I():求信息值(惊奇值)。X:数据集合X。xi:数据集合X的标签的一个枚举值。I(xi):xi的资讯量(informationself).I(xi)=−log(P(xi))P(xi) : 发生x_i的概率。x的机率质量函数(probability mass function)。P(xi)=count(xi)/len(X).
熵的作用 计算损失(Loss function) 用于调整梯度递减的步长。(本次熵(损失)比上次熵(损失)大,说明步长太大了。)用于决策树 熵越大,说明特征(feature)的划分数据能力越强。
例如:
c∈{1,2}P(1)=0.9P(2)=0.1∴argmaxcP(c)=1
返回最大值数学表示 maxa∈AP(a)
解释 在所有a∈A的计算中,返回最大值P(a)。
约束条件(Subject to)数学表示 y=2x+1,s.t. x>0
解释 当约束条件x>0,成立时,有y=2x+1。
定义上相等数学表示 A≐B
解释 A的定义为B。
2补数(2's complement) 一种使用2进制表示有符号数的方法。 第一位为符号位, 如果是0,则记做0; 如果为1,则记做−2n−1, n is the size of the number
。 例如: 0010为2; 1010为-6。
请看我的另外一个博文:神经网络学习笔记 - 激活函数的作用、定义和微分证明
请看我的另外一个博文:神经网络学习笔记 - 损失函数的定义和微分证明
松弛变量(slack variable):在SVM中,为了处理异常点(跑到另一个分类中的点),设定的容忍值。
如有希望介绍的数学概念,请写到评论中,我有空会加上。
原文:https://www.cnblogs.com/steven-yang/p/6348112.html