行列を乗算するときに残余平方和を最小にするベクトルを見つけようとしています。関数を最小化する最適ベクトルを見つける
私はscipyの最適化パッケージ(最小化機能を持っています)を知っています。しかし、私のコードには特別な制約があります。 wの全エントリの合計(以下の関数を参照)は1に等しくなければならず、wのエントリは0より小さくなることはできません。私のためにこれを行うパッケージはありますか?そうでない場合はどうすればいいですか?
はワットを最小化しようとすると:
def w_rss(w,x0,x1):
predictions = np.dot(x0,w)
errors = x1 - predictions
rss = np.dot(errors.transpose(),errors).item(0)
return rss
X0 = np.array([[3,4,5,3],
[1,2,2,4],
[6,5,3,7],
[1,0,5,2]])
X1 = np.array([[4],
[2],
[4],
[2]])
W = np.array([[.0],
[.5],
[.5],
[.0]])
print w_rss(W,X0,X1)
今のところ、これはワットの可能な値をループでの私の最高の試みであるが、それが正常に動作していません。
def get_w(x0,x1):
J = x0.shape[1]
W0 = np.matrix([[1.0/J]*J]).transpose()
rss0 = w_rss(W0,x0,x1)
loop = range(J)
for i in loop:
W1 = W0
rss1 = rss0
while rss0 == rss1:
den = len(loop)-1
W1[i][0] += 0.01
for j in loop:
if i == j:
continue
W1[j][0] -= 0.01/den
if W1[j][0] <= 0:
loop.remove(j)
rss1 = w_rss(W1,x0,x1)
if rss1 < rss0:
#print W1
W0 = W1
rss0 = rss1
print '--'
print rss0
print W0
return W0,rss0
次のことが可能です:要素の和が1
あるとき、それはここでは、コードが0だされるように制約関数は、
np.sum(w) - 1
を返します。任意のQP(二次計画法)ソルバーを使用してください。 –私はこれをscipy.optimizeで試しました:cons =({'type': 'eq'、 'fun':ラムダx:1 - 合計(x)}){{NEW LINE}} bnds = tuple((0,1 )= {SLSQP}、bounds = bnds、constraints = cons)を最小化する(W内のxに対して){{NEW LINE}}最小化(w_rss、W1、args =(V、X0、X1)解決策は間違っていた。 –
これは汎用のNLPソルバです。それは正しく設定された問題で動作するはずですが、実際のQPソルバーを使用することをお勧めします。 –