2016-10-02 4 views
0

私は現在、勾配降下の実装の問題を抱えています。私は入力値の行列を持っています。例えば、[[1,1,0,2],[2,3,5,1],[2,1,8,0]]です。出力ベクトルに対する誤差を最小にする重みを計算したい、最小化された関数は標準線形モデルなので、私の仮説は最小である - >np.dot(input,weights)-yです。問題は - 重みベクトルの値が特定の数、例えば2に加算されるべきである。出力のベクトルもnp.dot(input,weights)/sum(np.dot(input,weights))のように正規化される - この結果は次に望ましい出力ベクトルと比較される。どのように私はこのタスクをpython/numpyで定義すべきですか?ヒト同調手順の一般的な最適化 - Pythonでの実装

例:

1)入力行列 [[4,0,2,0,2,0],[2,0,0,2,2,0],[2,0,0,2,2,0],[4,0,2,0,0,0],[0,0,2,0,0,2],[0,4,0,0,0,2],[0,2,0,0,0,2],[0,2,2,0,0,0],[0,0,2,0,0,2],[4,0,2,0,0,0]]

2)所望の出力[12.94275893,8.07054252,9.281123898,10.53654162,8.698251382,14.67643103,7.158870124,10.26752354,8.324615155,10.0433418]

3)np.dotように入力ベクトルを変換量(入力、重み)/合計(np.dot(入力、重み))は大丈夫です [11,21,18,0,20,14] - 合計は84で固定されます。

4)最終出力、合理的に偏差2からテッド)あなたの例のデータの規模については[15.15,7.83,7.83,10.10,8.08,14.14,8.84,9.85,8.08,10.10]

+0

あなたが求めていることは私には分かりません。 '' '問題は - 重みベクトルの値が特定の数、例えば2に加算されるべきであるということです' 'それはどういう意味ですか?なぜ正規化が重要か?通常、新しいデータを変換する準備が整っているノーマライザをフィッティングします。また、これは研究/学習目的のためのものですか?あなたのためにこれを行う良いソフトウェアがたくさんあるので。 – sascha

+0

私は自分の体重が合計で固定されていることを意味しました。それらの値の合計は正確に2でなければなりません。 – tretyacv

+0

それは一般的に解決するのは実行不可能な** np-hard **の問題のようですね!それはもはや凸最適化の問題ではない。もちろん、この値に関して偏差に作用するペナルティ項を加える近似解を得ることができます。しかし、よく..まだ非凸であると思います(これは、最適化するのが非常に難しいことを意味します)。 **編集:**多分私の気持ちが間違っていた。ペナルティー・タームを使用する場合は凸でなければなりません。 – sascha

答えて

-1

は、ここソリューションです:

import numpy as np 
from scipy import optimize 

a = np.array([[1,1,0,2],[2,3,5,1],[2,1,8,0]], dtype=float) 
target = np.random.randn(3) 
target /= target.sum() 

def f(p): 
    p = np.r_[p, 2 - p.sum()] 
    res = a.dot(p) 
    res /= res.sum() 
    return res - target 

r, _ = optimize.leastsq(f, np.zeros(3)) 
print(target) 
print(np.r_[r, 2 - r.sum()]) 

出力:

[-0.21987606 0.70869974 0.51117632] 
[ 2.15713915 7.47554671 0.38959227 -8.02227813] 

ここでは、あなたの実際のデータのコードです

import numpy as np 
from scipy import optimize 

a = np.array([[4,0,2,0,2,0], 
       [2,0,0,2,2,0], 
       [2,0,0,2,2,0], 
       [4,0,2,0,0,0], 
       [0,0,2,0,0,2], 
       [0,4,0,0,0,2], 
       [0,2,0,0,0,2], 
       [0,2,2,0,0,0], 
       [0,0,2,0,0,2], 
       [4,0,2,0,0,0]], dtype=float) 

target = np.array([12.94275893,8.07054252,9.281123898,10.53654162,8.698251382, 
        14.67643103,7.158870124,10.26752354,8.324615155,10.0433418]) 

target /= target.sum() 

def make_vector(x): 
    return np.r_[x, 84 - x.sum()] 

def calc_target(x): 
    res = a.dot(make_vector(x)) 
    res /= res.sum() 
    return res 

def error(x): 
    return calc_target(x) - target 

x, _ = optimize.leastsq(error, np.zeros(a.shape[1] - 1)) 
print(make_vector(x)) 
print(calc_target(x) * 100) 
print((calc_target(x) - target) * 100) 

出力:

[ 9.40552097 20.32874298 19.8199082 13.13991088 10.00062863 
    11.30528834] 
[ 12.90025777 8.63333209 8.63333209 10.2474406 8.25642656 
    13.78390749 8.39140263 10.65003363 8.25642656 10.2474406 ] 
[-0.04250116 0.56278957 -0.64779181 -0.28910102 -0.44182483 -0.89252354 
    1.23253251 0.38251009 -0.0681886 0.2040988 ] 

問題はnumpy.linalg.lstsq()でも解決できるようですが、問題を単純化する必要があります。

+2

OPは数学の面で苦労していて、間違いなく学びたいと思う人のようです。スタックオーバーフローはコード作成サービスではないので、将来の読者のために説明を加えることをお勧めします。 –

+1

ありがとうございます!私はより大きなデータセットでそれをテストし、あなたに知らせます。 Andrasが言及したように、私は理論的な洞察も感謝します。 – tretyacv

+1

このコードにはいくつかの仮定/モデル決定が隠されています(損失+ペナルティは1.0のpentalty-factorと一緒に最小化されていますか?)、これらについて言及するのは本当に素晴らしいことです。そして、(私の意見では)numpyを意識した(非専門家)ユーザでさえ、 '' 'np_r_'''のようなものを見るときに苦労します。それにもかかわらず、興味深いコード。 – sascha

関連する問題