【问题标题】:I'm having difficulty understanding the syntax of scipy.optimize我很难理解 scipy.optimize 的语法
【发布时间】:2013-10-29 02:06:27
【问题描述】:

我觉得问这个很愚蠢,但我很难理解 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

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

【问题讨论】:

    标签: python optimization numpy


    【解决方案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)
    

    【讨论】:

    • 我错过了解的大小必须为1 的约束。不幸的是,这使它成为非线性的。
    • @Joe 在 rhs 为零的情况下不是还是线性的吗?
    • 这取决于观察的数量。如果这是一个未定问题,添加x 必须具有1 范数的先验约束可以让您解决它。我在猜测(?)这就是 OP 想要做的。回想起来,我可能读得太多了。无论哪种方式,你的答案都很好!
    • @Joe 有道理,谢谢。我会保留我的答案,这些 cmets 可以作为警告。
    猜你喜欢
    • 2021-12-29
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多