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

从python而不是l2获取l1规范化特征向量?,python,numpy,linear-algebra,eigenvector,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 *

考虑一下这个矩阵:

[.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,则得到大约[0.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/sumvector。但是有没有办法跳过这一步呢?为什么要在我的脚本中添加计算费用,每次都要对向量求和?你能让numpy、scipy等吐出l1规范化向量而不是l2规范化向量吗?还有,这是l1和l2的正确用法吗

注:我已经看到前面的问题,询问如何以这种方式获得马尔可夫稳态。我的假设是不同的,我在问如何让numpy以我想要的方式吐出一个规范化的向量,我通过包含马尔可夫部分来解释我的推理。

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

另一方面,Wolfram Alpha在后端使用Mathematica,它是一个符号解算器,即不是浮点算术。这就是为什么你会得到同样的结果,如果你用手做

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

在一天结束时,向量是否标准化并不重要。它真的只是必须在正确的方向。如果你需要按比例调整,那么就这样做。因为它是一个简单的乘法,所以它将被矢量化,也就是用numpy快速


HTH.

文档中没有任何关于返回l1规范化向量的内容。计算资源并不是那么繁重。只要根据需要重新缩放它们。@iammax我看你已经接受了这个答案。如果你觉得这个答案有用的话,不妨考虑一下投票。