【问题标题】:Power iteration幂次迭代
【发布时间】:2014-03-07 22:16:25
【问题描述】:

我正在尝试理解幂迭代来计算矩阵的特征值。

我遵循en.wikipedia.org/wiki/Power_iteration#The_method的算法:

from math import sqrt

def powerIteration(A):

    b = [random() for i in range(len(A))]
    tmp = [0] * len(A)

    for iteration in range(10000):

        for i in range(0, len(A)):
            tmp[i] = 0
            for j in range(0, len(A)):
                tmp[i] += A[i][j] * b[j]

        normSq = 0
        for k in range(0, len(A)):
            normSq += tmp[k] * tmp[k]
        norm = sqrt(normSq)

        for i in range(len(A)):
            b[i] = tmp[i] / norm

    return b

当我运行 powerMethod([[0.0, 1.0], [1.0, 0.0]]) 时,它会返回一对随机数字,例如:[0.348454142915605, 0.9373258293064111][0.741752215683863, 0.6706740270266026]

问题 #1 - 为什么这些数字是随机的?显然我从随机向量 b 开始,但我希望它会收敛。

问题 #2 - 我喂食时有这个Online Matrix Calculator

0 1
1 0

它返回:

Eigenvalues:
( 1.000, 0.000i)
(-1.000, 0.000i)

Eigenvectors:
( 0.707, 0.000i) (-0.707, 0.000i)
( 0.707, 0.000i) ( 0.707, 0.000i)

如果我理解正确,返回 b 应该得到这些特征向量之一,但它没有。为什么输出如此不同?

问题 #3 - 我应该在上述算法中添加什么以使其返回一个特征值(在本例中为 1 或 -1)? (如果理解正确,幂迭代只返回一个特征值。)我如何实际计算一个特征值?

【问题讨论】:

    标签: python algorithm math matrix eigenvalue


    【解决方案1】:

    幂法不会对您的矩阵收敛。

    来自维基百科页面:

    收敛是几何的,有比率 |lambda_2 / lambda_1|

    Lambda_1 和 lambda_2 是两个绝对值最高的特征值。在您的情况下,它们是 1 和 -1,因此收敛比是 |1/-1| = 1。换句话说,每次迭代时误差都保持不变,因此幂方法不起作用。

    另一种理解方式是,您的矩阵采用一对 (a,b) 并将其反转为 (b,a)。您得到的答案将取决于您是进行偶数还是奇数的迭代。

    【讨论】:

    • 嗯,那是……不幸。除了使用其他算法之外,我能做些什么吗?无论如何,我如何计算这个lambda_{1, 2}?当我使用不同的矩阵时,比如[[0.0, 2.0], [1.0, 0.0]],它仍然不收敛..?
    • @EcirHana 那一个有两个范数 sqrt(2) 的特征值,所以比率又是 1。
    • 您可以做一件事,那就是应用矩阵移位来破坏对称性。这显然不适用于多个特征值。所以尝试迭代 [[1.0, 2.0], [1.0, 1.0]] 并记住从该矩阵的特征值中减去 1 以补偿添加的单位矩阵。
    猜你喜欢
    • 1970-01-01
    • 2014-04-03
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 2011-07-29
    相关资源
    最近更新 更多