主要包括线性代数,概率论,信息论(包括熵等,是我不熟悉的部分),数值计算(如复杂度等计算机常识),最优化(如梯度下降法,拟牛顿法)等一些比较基础浅显的知识,也是需要必须掌握的基础。
标量
一个标量就是一个单独的数,一般用小写的的变量名称表示。
向量
一个向量就是一列数,这些数是有序排列的。用过次序中的索引,我们可以确定每个单独的数。通常会赋予向量粗体的小写名称。当我们需要明确表示向量中的元素时,我们会将元素排列成一个方括号包围的纵柱:
我们可以把向量看作空间中的点,每个元素是不同的坐标轴上的坐标。
$$ x = \begin{bmatrix} x_{1}\\ x_{2}\\ ...\\ x_{n} \end{bmatrix} $$
矩阵
矩阵是二维数组,其中的每一个元素被两个索引而非一个所确定。我们通常会赋予矩阵粗体的大写变量名称,比如A。 如果一个实数矩阵高度为m,宽度为n,那么我们写作:
$$ A \epsilon R^{m\times n} ,且 A = \begin{bmatrix} a_{11} & a_{12} & ... & a_{1n}\\ a_{21} & a_{22} & ... & a_{2n}\\ a_{31} & a_{32} & ... & a_{3n}\\ ...& ... & &... \\ a_{m1} & a_{m2} & ... & a_{mn} \end{bmatrix} $$
矩阵这东西在机器学习中就不要太重要了!实际上,如果我们现在有N个用户的数据,每条数据含有M个特征,那其实它对应的就是一个NM的矩阵呀;再比如,一张图由1616的像素点组成,那这就是一个1616的矩阵了。现在才发现,我们大一学的矩阵原理原来这么的有用!要是当时老师讲课的时候先普及一下,也不至于很多同学学矩阵的时候觉得莫名其妙了。
张量
几何代数中定义的张量是基于向量和矩阵的推广,通俗一点理解的话,我们可以将标量视为零阶张量,矢量视为一阶张量,那么矩阵就是二阶张量。
例如,可以将任意一张彩色图片表示成一个三阶张量,三个维度分别是图片的高度、宽度和色彩数据。将这张图用张量表示出来,就是最下方的那张表格:
其中表的横轴表示图片的宽度值,这里只截取0~319;表的纵轴表示图片的高度值,这里只截取0~4;表格中每个方格代表一个像素点,比如第一行第一列的表格数据为[1.0,1.0,1.0],代表的就是RGB三原色在图片的这个位置的取值情况(即R=1.0,G=1.0,B=1.0)。
当然我们还可以将这一定义继续扩展,即:我们可以用四阶张量表示一个包含多张图片的数据集,这四个维度分别是:图片在数据集中的编号,图片高度、宽度,以及色彩数据。
张量在深度学习中是一个很重要的概念,因为它是一个深度学习框架中的一个核心组件,后续的所有运算和优化算法几乎都是基于张量进行的。
范数
有时我们需要衡量一个向量的大小。在机器学习中,我们经常使用被称为范数(norm) 的函数衡量矩阵大小。Lp 范数如下:
$$
\left \|x \right \|{p}=(\sum{i}^{ }\left | x_{i} \right |^{p})^{\frac{1}{p}}
$$
所以:
L1范数||x||:向量x各个元素的绝对值之和;
L2范数||x||2:向量x各个元素平方和的开方(类比|a|=根号下x^2+y^2,最常用的距离公式就是L2范数)
特征值分解(谱分解)
许多数学对象可以通过将它们分解成多个组成部分。特征分解是使用最广的矩阵分解之一,即将矩阵分解成一组特征向量和特征值。
方阵A的特征向量是指与A相乘后相当于对该向量进行缩放的非零向量v:
$$ A\nu = \lambda \nu $$
标量λ被称为这个特征向量对应的特征值。
使用特征分解去分析矩阵A时,得到特征向量构成的矩阵V和特征值构成的向量 λ,我们可以重新将A写作:
$$ A=Vdiag(\lambda )V^{-1} $$
奇异值分解(Singular Value Decomposition,SVD)
矩阵的特征分解是有前提条件的,那就是只有对可对角化的矩阵(方针且满秩)才可以进行特征分解。但实际中很多矩阵往往不满足这一条件,甚至很多矩阵都不是方阵,就是说连矩阵行和列的数目都不相等。这时候怎么办呢?人们将矩阵的特征分解进行推广,得到了一种叫作“矩阵的奇异值分解”的方法,简称SVD。通过奇异分解,我们会得到一些类似于特征分解的信息。
它的具体做法是将一个普通矩阵分解为奇异向量和奇异值。比如将矩阵A分解成三个矩阵的乘积:
$$ A=UDV^{T} $$
假设A是一个mn矩阵,那么U是一个mm矩阵,D是一个mn矩阵,V是一个nn矩阵。
这些矩阵每一个都拥有特殊的结构,其中U和V都是正交矩阵,D是对角矩阵(注意,D不一定是方阵)。对角矩阵D对角线上的元素被称为矩阵A的奇异值。矩阵U的列向量被称为左奇异向量,矩阵V 的列向量被称右奇异向量。
更多的矩阵分解相关知识和应用查看:
Moore-Penrose伪逆(加号广义逆)
对于非方矩阵而言,其逆矩阵没有定义。假设在下面问题中,我们想通过矩阵A的左逆B来求解线性方程:Ax=y
等式两边同时左乘左逆B后,得到:x=By
是否存在唯一的映射将A映射到B取决于问题的形式。
如果矩阵A的行数大于列数,那么上述方程可能没有解;如果矩阵A的行数小于列数,那么上述方程可能有多个解。
Moore-Penrose伪逆(MP逆)使我们能够解决这种情况,矩阵A的伪逆定义为:
$$ A^{+}=\lim_{a\rightarrow 0}(A^{T}A+\alpha I)^{-1}A^{T} $$
但是计算伪逆的实际算法没有基于这个式子,而是使用下面的公式:
$$ A^{+}=VD^{+}U^{T} $$
几种常用的距离
上面大致说过, 在机器学习里,我们的运算一般都是基于向量的,一条用户具有100个特征,那么他对应的就是一个100维的向量,通过计算两个用户对应向量之间的距离值大小,有时候能反映出这两个用户的相似程度。这在后面的KNN算法和K-means算法中很明显。
设有两个n维变量A=\left[ x_{11}, x_{12},...,x_{1n} \right]和B=\left[ x_{21} ,x_{22} ,...,x_{2n} \right] ,则一些常用的距离公式定义如下:
曼哈顿距离
想想Friends中纽约的曼哈顿街区,一个一个block,又叫城市街区距离,数学定义和python实现如下:
$$ d_{12} =\sum_{k=1}^{n}{\left| x_{1k}-x_{2k} \right| } $$
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,5,6])
print (sum(abs(vector1-vector2)))
# 3+3+3=9
欧氏距离
欧氏距离其实就是L2范数,数学定义和python实现如下:
$$ d_{12} =\sqrt{\sum_{k=1}^{n}{\left( x_{1k} -x_{2k} \right) ^{2} } } $$
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,5,6])
print (sqrt((vector1-vector2)*(vector1-vector2).T))
# .T means martrix transpose. square root(3*3+3*3+3*3)=5.1...
闵可夫斯基距离
从严格意义上讲,闵可夫斯基距离不是一种距离,而是一组距离的定义:
$$ d_{12} =\sqrt[p]{\sum_{k=1}^{n}{\left( x_{1k} -x_{2k} \right) ^{p} } } $$
实际上,当p=1时,就是曼哈顿距离;当p=2时,就是欧式距离。
切比雪夫距离
切比雪夫距离就是L_{\varpi} ,即无穷范数,数学表达式和python如下:
$$ d_{12} =max\left( \left| x_{1k}-x_{2k} \right| \right) $$
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,5,7])
print ((abs(vector1-vector2)).max())
# 4
夹角余弦(余弦距离)
夹角余弦的取值范围为[-1,1](三角函数的取值范围),可以用来衡量两个向量方向的差异;夹角余弦越大,表示两个向量的夹角越小;当两个向量的方向重合时,夹角余弦取最大值1;当两个向量的方向完全相反时,夹角余弦取最小值-1。
机器学习中用这一概念来衡量样本向量之间的差异,其数学表达式和python如下:
$$ cos\theta =\frac{AB}{\left| A \right| \left|B \right| } =\frac{\sum_{k=1}^{n}{x_{1k}x_{2k} } }{\sqrt{\sum_{k=1}^{n}{x_{1k}^{2} } } \sqrt{\sum_{k=1}^{n}{x_{2k}^{2} } } } $$
from numpy import *
vector1 = mat([2,2,3])
vector2 = mat([4,5,7])
print ((vector1*vector2.T)/(linalg.norm(vector1)*linalg.norm(vector2)))
# linalg.norm = linear + algebra, norm. Default L2-norm
汉明距离
汉明距离定义的是两个字符串中不相同位数的数目。
例如:字符串‘1111’与‘1001’之间的汉明距离为2。
信息编码中一般应使得编码间的汉明距离尽可能的小。
汉明距离的Python实现:
from numpy import *
mat1 = array([1,1,1,1,3,5,8,2,1,6,0])
mat2 = array([1,0,0,1,5,3,8,5,1,8,3])
smstr = nonzero(mat1-mat2) #The subscripts of nonzero elements
sm = smstr[0]# tuple to array
print (len(sm))
杰卡德相似系数
两个集合A和B的交集元素在A和B的并集中所占的比例称为两个集合的杰卡德相似系数,用符号J(A,B)表示,数学表达式为:
$$ J\left( A,B \right) =\frac{\left| A\cap B\right| }{\left|A\cup B \right| } $$
杰卡德相似系数是衡量两个集合的相似度的一种指标。一般可以将其用在衡量样本的相似度上。
杰卡德距离
与杰卡德相似系数相反的概念是杰卡德距离,其定义式为:
$$ J_{\sigma} =1-J\left( A,B \right) =\frac{\left| A\cup B \right| -\left| A\cap B \right| }{\left| A\cup B \right| } $$
为什么使用概率?
概率论是用于表示不确定性陈述的数学框架,即它是对事物不确定性的度量。
在人工智能领域,我们主要以两种方式来使用概率论。首先,概率法则告诉我们AI系统应该如何推理,所以我们设计一些算法来计算或者近似由概率论导出的表达式。其次,我们可以用概率和统计从理论上分析我们提出的AI系统的行为。
计算机科学的许多分支处理的对象都是完全确定的实体,但机器学习却大量使用概率论。实际上如果你了解机器学习的工作原理你就会觉得这个很正常。因为机器学习大部分时候处理的都是不确定量或随机量。
随机变量
随机变量可以随机地取不同值的变量。我们通常用小写字母来表示随机变量本身,而用带数字下标的小写字母来表示随机变量能够取到的值。例如,x1和x2都是随机变量X可能的取值。
对于向量值变量,我们会将随机变量写成X,它的一个值为x。就其本身而言,一个随机变量只是对可能的状态的描述;它必须伴随着一个概率分布来指定每个状态的可能性。
随机变量可以是离散的或者连续的。