线性代数是机器学习中非常重要的基础知识,但是,往往这句话,咱们开始是听不进去的。就好比说,小学的时候,没有哪一个老师不告诉你学习很重要,但是若干年后,大部分的人都会或多或少有些懊悔,觉得当时没有好好听话。同样的道理,在入门阶段,如果不学好线代,那么以后做相关方面的学习和开发的时候,看文档就会变得异常吃力,许多推导式都感觉看不懂,或者当时感觉看懂了,过一会儿又不会了。
正所谓“少壮不努力,开发徒伤悲”,不过也不必要太丧,天大的窟窿也能补,虽然并非一朝之功。先从简单的开始吧,本节讲讲行列式。
定义
维基百科中给出的定义是:行列式是一个函数,将一个n⋅n的矩阵映射到一个标量。
这个标量表示经过这个矩阵所代表的线性变换之后,矩阵的“体积”在空间当中发生的变化。
翻译成人话就是,输入一个矩阵,然后输出一个经过处理算法生成的数字。我们把行列式用det()来表示。如果A是一个n⋅n的矩阵,那么det(A)即表示该矩阵的行列式。
计算
二阶行列式
假设
A=∣∣∣∣a11a21a12a22∣∣∣∣
那么,
det(A)=a11⋅a22−a12⋅a21
也就是对角相乘,然后左斜减去右斜。
三阶行列式
假设
B=∣∣∣∣∣∣a11a21a31a12a22a32a13a23a33∣∣∣∣∣∣
那么,
det(B)=−a11⋅a22⋅a33+a12⋅a23⋅a31+a13⋅a21⋅a32a11⋅a23⋅a32−a12⋅a21⋅a33−a13⋅a22⋅a31
刚看感觉怎么这么复杂,其实仔细一看,还是和二阶的套路差不多,不过是多了个维度罢了。
我们刚刚列举出来了二阶和三阶的具体计算方法,那么按照学数学的常规路径,应该是要推导一下n阶的行列式怎么计算,或者有什么规律之类的。不过在这之前,我们先要了解一下另一个概念——逆序数。
逆序数
假设现在我们有一个数组A,理想情况下它是一个有序数组,不过在现实生活中并不太常见这种理想情况,大多都是乱序的。那么如果我们想要知道当前的这个数组(序列)距离有序到底有多大的差距,也就是量化这个差距,那么会很自然地想到,可以遍历这个数组里面的所有Ai和Aj组合,然后记下次序有误的次数。那么这个次数就叫做逆序数。
放在代码里面,就非常好懂了:
count = 0
for i in range(n):
for j in range(i):
if A[i] < a[j]:
count += 1
也就是说,对于数组A中的每一个数,我们都计算出了它前面的比它大的数。那么对于每一个Ai,我们计算出的前面比它大的数的个数记作ti,那么逆序数就可以表达为:
t=t1+t2+t3+…+tn=i=1∑nti
n阶行列式
接下来,就回归我们刚刚的话题。有了逆序数的概念,我们就可以很方便地写出n阶行列式的公式。
假设
D=∣∣∣∣∣∣∣∣∣a11a21⋮an1a12a22⋮an2⋯⋯⋯a1na2n⋮ann∣∣∣∣∣∣∣∣∣
设自然数1,2,3…n 的一个排列为j1,j2,j3…jn,这个排列的逆序数为t,那么,
det(D)=j1j2…jn∑(−1)ta1j1a2j2…anjn
当然,也可以把(i,j)元素所在的行和列的所有元素全部去除之后,剩下的新的n−1阶的行列式被称为(i,j)元的代数余子式,记为Mij。
如:
E=∣∣∣∣∣∣∣∣a11a21a31a41a12a22a32a42a13a23a33a43a14a24a34a44∣∣∣∣∣∣∣∣
其中(2,2)元的代数余子式为:
M22=∣∣∣∣∣∣a11a31a41a13a33a43a14a34a44∣∣∣∣∣∣
那么E矩阵的行列式就可以表达为:
det(E)=i=1∑na1iM1i
实际上就是计算的时候提取公因式罢了。假设一个三阶行列式:
det(X)=a11(a22a33−a23a32)+a12(a23a31−a21a33)+a13(a21a32−a22a31)
那么把这些代数余子式写出来:
∣∣∣∣∣∣a11a21a31a12a22a32a13a23a33∣∣∣∣∣∣=∣∣∣∣∣∣a11a22a32a23a33∣∣∣∣∣∣+∣∣∣∣∣∣a21a31a12a23a33∣∣∣∣∣∣+∣∣∣∣∣∣a21a31a22a32a13∣∣∣∣∣∣
化简,就是上面的结果。
克拉默法则
可能有许多初学者会觉得行列式的定义和计算都过于繁琐,并且好像还感觉没什么用。
那么除了用在机器学习的模型之中,还能够用来判断线性方程组是否有解。
对于一个有n个未知数的n个线性方程组:
⎩⎪⎪⎪⎨⎪⎪⎪⎧a11x1+a12x2+…+a1nxn=b1a21x1+a22x2+…+a2nxn=b2…an1x1+an2x2+…+annxn=bn
它的解可以用n阶行列式表示。
如果这个n阶的行列式不等于0,即:
det(X)=det⎝⎜⎛a11⋮an1⋯⋯a1n⋮ann⎠⎟⎞=0
那么这个n阶方程组有唯一解:
x1=XX1⋅x2=XX2⋅x3…xn=XXn
其中Xj(j=1,2…n)是把X中第j列替换成方程常数项得到的新的行列式:
Xj=∣∣∣∣∣∣∣a11⋮an1⋯⋯ai,j−1⋮an,j−1b1⋮bna1,j+1⋮an,j+1⋯⋯a1n⋮ann∣∣∣∣∣∣∣
行列式除了上面的内容意外,还有许多很好用的特性以及一些推导计算方法。不过对于算法领域的帮助并不大,有兴趣的同学可以自己研究下。