从python而不是l2获取l1归一化特征向量?

时间:2018-12-10 21:01:35

标签: python numpy linear-algebra eigenvector

考虑此矩阵:

[.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部分来解释我的推理。

1 个答案:

答案 0 :(得分:0)

我认为您假设np.linalg.eig像手动计算特征向量和特征值一样。 在后台,它使用了一个高度优化(且著名)的FORTRAN库,称为LAPACK。该库使用的数值技术超出了范围,但是长话短说,它不会像您手动计算2x2的特征值。我相信它在大多数时间使用the QR algorithm,有时甚至是QZ,甚至其他时间。这并不是那么简单:我认为有时它甚至会根据矩阵的结构/大小选择不同的算法(我不是LAPACK专家,所以在这里不要引用我)。我所知道的是,LAPACK已经经过了40多年的审查,而且速度非常快,而且速度也很快,而且复杂性也很高。

另一方面,Wolfram Alpha在后端使用Mathematica,这是一个符号求解器(即,不是浮点算术)。这就是为什么您获得“相同”结果的原因,就像您手工完成一样。

长话短说,根本无法要求您从np.linalg.eig获得L1范数::如果您查看QR算法,则每次迭代都会有L2归一化向量(收敛到特征向量)。从大多数数值库中获取它会很困难,原因很简单,因为它们很多都依赖LAPACK或使用类似的算法(例如,MATLAB也输出单位向量)。

在一天结束时,向量是否归一化并不重要。它实际上只是必须朝着正确的方向发展。如果您需要按比例缩放它,则可以这样做。由于它是一个简单的乘法,因此将被numpy向量化(即快速)。

HTH。