0

行列を乗算するときに残差二乗和を最小化するベクトルを見つけようとしています。

私はscipyの最適化パッケージ(最小化機能を持っています)を知っています。ただし、私のコードには追加の制約があります。w のすべてのエントリの合計 (以下の関数を参照) は 1 に等しくなければならず、w のエントリは 0 未満であってはなりません。これを行うパッケージはありますか? そうでない場合、どうすればこれを行うことができますか?

w を最小化しようとしています:

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)

これまでのところ、これは w の可能な値をループするための私の最善の試みですが、正しく機能していません。

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
4

1 に答える 1