1

N x M 行列と既知のグラウンド トゥルース ソリューションのセットから、N-1 行列で最小二乗線形回帰を計算しようとしています。そこから、各回帰の傾き、切片、および残差値を取得したいと思います。基本的な考え方は、N の行の各サンプルに対して実際の値を予測する必要があることを知っており、残差を使用して M の列の予測値のどのセットが最も正確であるかを判断したいと考えています。

私はマトリックスをうまく説明していないので、ここに図を示します。

(N,M) matrix with predicted values for each row N
 in each column of M...

##NOTE: Values of M and N are not actually 4 and 3, just examples
   4 columns in "M"
  [1, 1.1, 0.8, 1.3]
  [2, 1.9, 2.2, 1.7]  3 rows in "N"
  [3, 3.1, 2.8, 3.3]


(1,N) matrix with actual values of N


  [1]
  [2]   Actual value of each sample N, in a single column
  [3]  

繰り返しになりますが、わかりやすくするために、(N,M) 行列と (1,N) 行列の各列の間の lstsq 回帰を計算しようとしています。

たとえば、

[1]   and [1]
[2]       [2]
[3]       [3]

次に、間の回帰

[1]   and  [1.1]
[2]        [1.9]
[3]        [3.1]

計算された各回帰の傾き、切片、および標準誤差 (平均残差) を出力します。

これまでのところ、numpy/scipy のドキュメントや「ネット」では、一度に 1 つの列を計算する例しか見つかりませんでした。numpy には、標準のセット内の各列の回帰を計算する機能があると思っていました

np.linalg.lstsq(arrayA,arrayB)

しかし、それはエラーを返します

ValueError: array dimensions must agree except for d_0

列を独自の配列に分割してから、一度に 1 つずつ計算する必要がありますか? numpy で各列の回帰を個別に計算するために使用する必要があるパラメーターまたは行列演算はありますか?

もっとシンプルにしたほうがいいような?いろいろ調べましたが、似たようなことをしている人は見当たりません。

4

2 に答える 2

2

AとBを入れ替えたのかな?

以下は私にとってはうまくいきます:

A=np.random.rand(4)+np.arange(3)[:,None]
# A is now a (3,4) array
b=np.arange(3)
np.linalg.lstsq(A,b)
于 2012-07-10T16:33:02.173 に答える
0

arrayB の 0 次元は、arrayA の 0 次元と同じでなければなりません (参照: np.linalg.lstsq の公式ドキュメント )。現在使用している行列の代わりに、次元を持つ(N, M) and (N, 1)行列が必要です。(N, M) and (N)(N,M) and (1,N)

(N, 1)次元行列とN次元行列は同じ結果になることに注意してください。ただし、配列の形状は異なります。

私はあなたとは少し異なる例外を受け取りますが、それは異なるバージョンが原因である可能性があります (私は Windows で Python 2.7、Numpy 1.6 を使用しています):

>>> A = np.arange(12).reshape(3, 4)
>>> b = np.arange(3).reshape(1, 3)

>>> np.linalg.lstsq(A,b)
# This gives "LinAlgError: Incompatible dimensions" exception

>>> np.linalg.lstsq(A,b.T)
# This works, note that I am using the transpose of b here
于 2012-07-10T17:52:39.083 に答える