5

こんにちは皆さん私はPythonの初心者ですクラスの割り当てのためになげなわL1回帰を実装する必要があります。これには、ブロック行列を含む二次方程式を解くことが含まれます。

minimize x^t * H * x  + f^t * x 
where x > 0

ここで、H は 2 X 2 ブロック行列で、各要素は k 次元の行列であり、x と f は 2 X 1 ベクトルであり、各要素は k 次元のベクトルです。

私はndarraysを使用することを考えていました。

そのような :

  np.shape(H) = (2, 2, k, k)
  np.shape(x) = (2, k)

しかし、 np.dot(X, H) はここでは機能しないことがわかりました。この問題を解決する簡単な方法はありますか? 前もって感謝します。

4

2 に答える 2

1

まず、行列に変換することでより効率的な計算ができると確信しています。2k x 2k 行列が 2 x 2 行列であると考える場合、ベクトル空間のテンソル積で操作し、tensordot代わりにを使用する必要があることを述べdotます。

たとえば、k=5 で試してみましょう。

>>> import numpy as np
>>> k = 5

行列aとベクトルを定義するx

>>> a = np.arange(1.*2*2*k*k).reshape(2,2,k,k)
>>> x = np.arange(1.*2*k).reshape(2,k)
>>> x
array([[ 0.,  1.,  2.,  3.,  4.],
       [ 5.,  6.,  7.,  8.,  9.]])

これで、テンソルを乗算できます。必ず正しい軸を選択してください。次の式を明示的にテストしていないため、エラーが発生する可能性があります

>>> result = np.tensordot(a,x,([1,3],[0,1]))
>>> result
array([[  985.,  1210.,  1435.,  1660.,  1885.],
       [ 3235.,  3460.,  3685.,  3910.,  4135.]])
>>> np.shape(result)
(2, 5)
于 2013-11-02T09:32:22.167 に答える