今天在看关于马尔可夫链的一些基础知识,深感大一的线性代数没有打好基础,许多概念尚模糊不清,一些定理的证明也看得费力,于是花一个下午的时间做了些回顾,总结如下。
线性代数篇
-
特征向量and特征值
矩阵从直观上来看,能在空间中对向量施以变换,一般来说,这种变换既是在大小上的,也是在方向上的。但在某些情况下,它只能够改变某种向量的大小,而不能改变某种向量的方向,用数学表达式来说,就是,其中是特征值,x是特征向量。这乍看起来好像没什么大用处,但是当要计算时,如果M很大,就可以转换成,大大简化计算。当然,我们一般情况下计算时,x不会恰好就是特征向量,但是可以把它转换成特征向量的线性组合,比如说,,那。
-
行列式
行列式说起来也是很神奇的一个东西,明明是那么复杂的一个矩阵,居然能和一个常数关联起来。也是从直观上来说,行列式是n维平行体的体积。比如说对于一个二维矩阵,就是一个平行四边形的面积;对于一个三维矩阵,就是一个平行六面体的体积。
-
迹
矩阵的迹,指的是主对角线上元素的总和,它有一个神奇的性质,就是恰好等同于矩阵特征值的总和。一个显而易见的情况是对于三角矩阵,主对角线上的元素恰好与特征值一一对应。
-
相互间的关系以及进一步推导
如何求出特征值呢,一个方法是将特征值的定义式改写:
为了使得x是非零解,一个重要的条件是这个矩阵的行向量有共线现象,也就是说,矩阵不是满秩的。这也可以从满秩矩阵的性质推导出来。(比如说矩阵的逆的存在性啊什么的)。
举一个简单的例子来说:
,即 ,为使x不成为零向量,必须令, 即两条行向量共线。
共线之后,再回到行列式上面来,既然其对应的几何含义是n维平行体的体积,那么体积等于面积乘高,也就是说在n维平行体的各个面中,如果有一个面的面积为零,总体积必然为零。而两条共线的行向量必然会组合成这个平行体的一个面,因而平行体的总体积为零,行列式为零。
所以我们得出关系1:的行列式为零。
针对二维矩阵的情况,我们可以具体计算一下的行列式,即:
展开之后:
假设两个解分别为、,根据求根公式,有,换句话说,A矩阵的特征值之积等于A的行列式。
这不是偶然,我们可以证明关系2:矩阵的行列式等于特征值之积。
通过直接对的行列式进行数学上的运算,我们可以得到关系3:三角矩阵的主对角线元素等于特征值,换句话说,它们的乘积是行列式。和已经提到的关系4:矩阵的主对角线元素之和等于特征值之和。
对于矩阵A,如果它有n个特征向量,那么它是可对角化的,假设其特征值为、···,对应特征向量为、···,
令,
,
则,,
当k趋近于无穷时,由于
因此绝对值小于1的元素会收敛至零,等于1的元素仍为1,大于1或者为-1的元素不会收敛。因此对于可对角化的矩阵A,当其特征值的绝对值均小于1或者是值等于1时,A在乘幂运算中是收敛的。
马尔可夫链篇
-
基本概念
马尔可夫链(英语:Markov chain),又称离散时间马尔可夫链(discrete-time Markov chain,缩写为DTMC),因俄国数学家安德烈·马尔可夫(俄语:Андрей Андреевич Марков)得名,为状态空间中经过从一个状态到另一个状态的转换的随机过程。该过程要求具备“无记忆”的性质:下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关。这种特定类型的“无记忆性”称作马尔可夫性质。马尔科夫链作为实际过程的统计模型具有许多应用。
其数学上的定义是:
用通俗的话来说:将来和过去无关,只与现在有关。这一性质称之为马氏性或者无后效性。
-
理论推导
除了无后效性之外,马尔可夫链的另一条性质是时齐性:
也就是说,状态之间的转移概率只与时间间隔的长短有关,与起始时间的选择无关。
定义概率转移矩阵P, 由状态i经过一个时间间隔之后转移到下一个状态j的概率。很容易想象得到,它各个元素均位于0和1之间,并且每一行之和必定为1。(这又称之为右随机矩阵,每一行都是一个随机向量)
当经过多个时间间隔时,定义,且有。
下面证明一下,转移矩阵P满足: ,规定是特征向量x的第i个元素,是x中的第m个元素,同时它是绝对值最大的元素。
一个简单但不严密的反证法:
,如果 ,那么有,产生矛盾。
一个严密而且也不怎么复杂的证法:
所以,当转移矩阵可对角化时,一般情况下计算过程是收敛的。
-
实际应用
转移矩阵在当今最重要的应用之一在于搜索引擎,在pagerank算法中,为了让矩阵收敛,特别提出了这样两个收敛的充要条件:
- 强连通性,在有限的时间内可以从一个初始状态到达另一个终止状态,可以看做图的一种问题。
- 非周期性,即不存在振荡现象,最典型的例子是这样的矩阵:,这种情况下,两种可能的状态会来回转换,无法收敛到稳定状态。
为了实现这两个条件,谷歌矩阵在原始矩阵的基础上做了这样两个工作:
- 对于全为零的行,将该行所有元素置为1/n。
- 取一0和1之间的参数a,对于每一行的随机向量x, 令n = [1/n 1/n ... 1/n],x = ax + (1-a)n,从而令每一个状态都有一定随机性转到其他任何一个状态。
-
举例说明
下面举一个简单的例子来说明一下,现实生活中最为显著的时间间隔,莫过于代际,而且通常情况下,父辈对子辈的影响也远大于祖父辈。现假设一个人是土豪,他的孩子依然是土豪的概率是0.8,成为穷人的概率是0.2,若一个人是穷人,他的孩子依然是穷人的概率是0.9,成为土豪的概率是0.1。
定义转移矩阵P:
a = np.matrix('0.8 0.2;0.1 0.9')
a
matrix([[0.8, 0.2],
[0.1, 0.9]])
理论上探究其收敛性:可以看到,矩阵特征值的绝对值的确小于等于1,而且是可对角化的,这说明它是收敛的。
from numpy import linalg as LA
w, v = LA.eig(a)
w
array([0.7, 1. ])
v
matrix([[-0.89442719, -0.70710678],
[ 0.4472136 , -0.70710678]])
验证其收敛性:
a**55
matrix([[0.33333334, 0.66666666],
[0.33333333, 0.66666667]])
a**56
matrix([[0.33333333, 0.66666667],
[0.33333333, 0.66666667]])
a**60
matrix([[0.33333333, 0.66666667],
[0.33333333, 0.66666667]])
a**70
matrix([[0.33333333, 0.66666667],
[0.33333333, 0.66666667]])
可以看到,矩阵最终收敛到了一个确定的结果,在这一模型中,无论起始身份为何,漫长的时间(56代)过去后,自己的子孙大约有三分之一的概率成为土豪。
可以通过添加初始的概率矩阵验证一下,这里用了比较极端的数据。
一开始就是土豪的情况:
s = np.matrix('1,0')
s*a
matrix([[0.8, 0.2]])
s*a**55
matrix([[0.33333334, 0.66666666]])
s*a**56
matrix([[0.33333333, 0.66666667]])
一开始就是穷人的情况:
s = np.matrix('0,1')
s*a**50
matrix([[0.33333333, 0.66666667]])
穷人比土豪要更快一些达到收敛状态。