考虑此矩阵:
[.6, .7]
[.4, .3]
这是马尔可夫链矩阵;每个列的总和为1。这可以代表人口分布,过渡率等。
要使总体处于平衡状态,请采用特征值和特征向量...
从Wolfram alpha中,特征值及其对应的特征向量为:
l1 = 1, v1 = [4/7, 1]
l2 = -1/10, v2 = [-1,1]
对于处于平衡状态的总体,取对应于特征值1的特征向量,并对其进行缩放,使总和等于1。
Vector = [7/4, 1]
Total = 11/4
因此将向量乘以4/11 ...
4/11 * [7/4, 1] = [7/11, 4/11]
因此,处于平衡状态的第一个州占人口总数的7/11,另一个州占4/11。
如果采用所需的特征向量,[7/4, 1]
和l2对其进行归一化(因此所有平方值之和为1),则大致为[.868, .496]
。
很好。但是当您从python获取特征向量时...
mat = np.array([[.6, .7], [.4, .3]])
vals, vecs = np.linalg.eig(mat)
vecs = vecs.T #(because you want left eigenvectors)
它发出的特征向量之一是[.868,.496],对于l2范数。现在,您可以很容易地再次对其进行缩放,因此每个值的总和为1(而不是每个值的平方的总和)为1 ...只需执行向量* 1 / sum(vector)。但是有没有办法跳过此步骤?为什么要在我的脚本中加上计算费用,而每次我都要对向量求和呢?您能得到numpy,scipy等吐出l1归一化向量而不是l2归一化向量吗?另外,是否正确使用了术语l1和l2 ...?
注意:我已经看过先前的问题,询问如何以这种方式获得马尔可夫稳态。我的qusetion是不同的,我在问如何让numpy吐出以我想要的方式归一化的向量,并且通过包含markov部分来解释我的推理。
答案 0 :(得分:0)
我认为您假设np.linalg.eig
像手动计算特征向量和特征值一样。 在后台,它使用了一个高度优化(且著名)的FORTRAN库,称为LAPACK。该库使用的数值技术超出了范围,但是长话短说,它不会像您手动计算2x2的特征值。我相信它在大多数时间使用the QR algorithm,有时甚至是QZ,甚至其他时间。这并不是那么简单:我认为有时它甚至会根据矩阵的结构/大小选择不同的算法(我不是LAPACK专家,所以在这里不要引用我)。我所知道的是,LAPACK已经经过了40多年的审查,而且速度非常快,而且速度也很快,而且复杂性也很高。
长话短说,根本无法要求您从np.linalg.eig
获得L1范数::如果您查看QR算法,则每次迭代都会有L2归一化向量(收敛到特征向量)。从大多数数值库中获取它会很困难,原因很简单,因为它们很多都依赖LAPACK或使用类似的算法(例如,MATLAB也输出单位向量)。
在一天结束时,向量是否归一化并不重要。它实际上只是必须朝着正确的方向发展。如果您需要按比例缩放它,则可以这样做。由于它是一个简单的乘法,因此将被numpy
向量化(即快速)。
HTH。