从python中获取l1规范化特征向量而不是l2



考虑这个矩阵:

[.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(向量(。但是有没有办法跳过这一步?为什么要在我的脚本中添加计算费用,每次都要求和向量?你能让numpy、scipy等吐出l1归一化向量而不是l2归一化向量吗?此外,这是l1和l2术语的正确用法吗。。。?

注意:我已经看到了以前的问题,问如何以这种方式获得马尔可夫稳态。我的问题不同,我问如何让numpy吐出一个以我想要的方式归一化的向量,我通过包括马尔可夫部分来解释我的推理。

我认为您假设np.linalg.eig像手工一样计算特征向量和特征值。事实并非如此在引擎盖下,它使用了一个高度优化的(著名的(FORTRAN库LAPACK。这个库使用的数值技术有点超出了范围,但长话短说,它不会像手工计算2x2的特征值。我相信它大部分时间都使用QR算法,有时使用QZ,甚至其他算法。事情并没有那么简单:我认为它有时甚至会根据矩阵结构/大小选择不同的算法(我不是LAPACK专家,所以这里不要引用我的话(。我所知道的是,LAPACK经过了大约40年的审查,速度非常快,速度越快,复杂性就越大。

另一方面,WolframAlpha在后端使用Mathematica,它是一个符号求解器(即不是浮点运算(。这就是为什么你会得到"同样"的结果,就好像你用手做一样。

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

归根结底,向量是否被归一化并不重要。它真的必须朝着正确的方向发展。如果你需要按比例缩放,那么就这样做。它将被numpy矢量化(即快速(,因为它是一个简单的乘法。

HTH。

最新更新