我觉得问这个很愚蠢,但我真的很难理解 scipy.optimize 的语法
我有一个 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
同一个优化算法是否适用于这两个问题?还是有不同的方法来解决最小化和找零问题?
最佳答案
你要最小化的函数是:
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)
关于python - 我很难理解 scipy.optimize 的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19648408/