3

我觉得问这个很愚蠢,但我很难理解 scipy.optimize 的语法

我有一个 mxm 矩阵 M,我只是想找到一个 m 维向量 x

    minimizes M.dot(x)

    such that ||x||_2^2 = 1

本质上,我想通过 x 被 l2 归一化来最小化 Mx。

我似乎无法找到一种方法来符合我对 numpy 语法中正在发生的事情的想法。我非常感谢任何帮助我通过理解来纠正我的愚蠢。


该问题还有一个特殊情况,可以通过找到 x 来解决,使得

    M.dot(x) = zeros

    such that ||x||_2^2 = 1

相同的优化算法是否适用于这两个问题?还是有不同的方法来解决最小化和找零问题?

4

1 回答 1

4

您要最小化的功能是:

def f(x, M):
    return M.dot(x)

你的出发点可以是任何东西,比如说,

m = M.shape[0]
x0 = np.ones(m)/np.sqrt(m)

您可以将约束应用为:

def con(x):
    return np.linalg.norm(x) - 1

cons = {'type':'eq', 'fun': con}

最后,最小化应该运行为:

scipy.optimize.minimize(f, x0, args=(M,), constraints=cons)

可以更改许多选项,并且很可能对您的问题很有必要,但希望这可以帮助您将模块的语法应用于您的问题。有关详细信息,请参阅这些示例


在右手边为零的情况下,您的问题是线性的,可以更直接地解决,例如,使用scipy.linalg.solve

from scipy import linalg

x = linalg.solve(M, np.zeros(M.shape[0]))

我不知道如何在这里实现约束,但我相信它可以在事后简单地添加,因为在这种情况下它可以与任何常数乘数保持一致:

x /= linalg.norm(x)
于 2013-10-29T02:55:14.740 回答