2013-10-29 73 views
3

的語法我覺得自己很蠢問這個,但我有一個很艱難的時間瞭解scipy.optimize的synatx我難以理解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 

願意同優化算法適合這兩個問題需要解決的特殊情況?還是有不同的方法來解決最小化和查找零問題?

回答

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) 
+0

我錯過了解決方案的大小必須約束'1'。不幸的是,這使得它非線性。 –

+0

@Joe在rhs爲零的情況下,它不是線性嗎? – askewchan

+1

這取決於觀察次數。如果這是一個不確定的問題,那麼添加'x'必須具有'1'的標準的先驗約束可以讓你解決它。我猜測(?)那是OP想要做的事情。回想起來,我可能一直在閱讀太多內容。無論哪種方式,您都會很滿意! –