我很难理解scipy.optimize的语法

时间:2013-10-29 02:06:27

标签: python optimization numpy

我觉得这很愚蠢,但是我很难理解scipy.optimize的synatx

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

    minimizes M.dot(x)

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

基本上我想最小化Mx,x为l2标准化。

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


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

    M.dot(x) = zeros

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

同样的优化算法是否适合这两个问题?或者有不同的方法来解决最小化和找到零问题?

1 个答案:

答案 0 :(得分: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)

可以更改许多选项,并且可能需要很好地解决您的问题,但希望这有助于您将模块的语法应用于您的问题。请参阅these examples for more information


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

from scipy import linalg

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

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

x /= linalg.norm(x)