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 に答える