1

こんにちは。

ベクトルの次元数を減らすだけのPCAタスクに直面しています。この場合、私は2次元行列には興味がありませんが、K個の主固有ベクトルに沿って投影したいD次元ベクトルにすぎません。

PCAを実装するには、このベクトルの共分散行列を取得する必要があります。ベクトルの例でこれを実行してみましょう。

someVec = np.array([[1.0, 1.0, 2.0, -1.0]])

numpy.covと互換性を持たせるために、このベクトルを1 X 4行列、つまり行ベクトルとして定義しました。numpy.covは特徴が行にあると仮定するため、numpy.covを介してこのベクトルの共分散行列を取得すると、スカラー共分散行列が生成されます。

print np.cov(someVec)
1.58333333333

しかし、これは単に次元の仮定の違いであり(というよりはそうあるべきです)、転置ベクトルの共分散を取ることはうまくいくはずですよね?そうでないことを除いて:

print np.cov(someVec.T)
/usr/lib/python2.7/site-packages/numpy/lib/function_base.py:2005: RuntimeWarning:                  
invalid value encountered in divide
return (dot(X, X.T.conj()) / fact).squeeze()
[[ nan  nan  nan  nan]
[ nan  nan  nan  nan]
[ nan  nan  nan  nan]
[ nan  nan  nan  nan]]

ここで何を間違えたのか正確にはわかりません。何かアドバイス?

ありがとう、

ジェイソン

4

3 に答える 3

5

rowvar転置を渡す場合は、ゼロに設定する必要があります。

In [10]: np.cov(someVec, rowvar=0)
Out[10]: array(1.5833333333333333)

In [11]: np.cov(someVec.T, rowvar=0)
Out[11]: array(1.5833333333333333)

ドキュメントから:

rowvar:int、オプション

rowvarがゼロ以外(デフォルト)の場合、各行は変数を表し、列に観測値があります。それ以外の場合、関係は置き換えられます。各列は変数を表し、行には観測値が含まれます。

完全な共分散行列を見つけたい場合は、複数の観測値が必要になります。単一の観測値と、numpyのデフォルトの推定量を使用すると、NaNまさに期待どおりになります。Nの代わりに正規化を実行したい場合は、バイアス(N-1)にaを渡すことができます。1

In [12]: np.cov(someVec.T, bias=1)
Out[12]:
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])

繰り返しますが、ドキュメントから。

バイアス:int、オプション

デフォルトの正規化は(N-1)によるものです。ここで、Nは与えられた観測値の数です(偏りのない推定)。バイアスが1の場合、正規化はNによって行われます。これらの値は、numpyバージョン>=1.5でキーワードddofを使用することでオーバーライドできます。

于 2012-12-10T21:31:14.690 に答える
0

次のオプションを使用する必要がありrow_var=0ますnumpy.cov

In [1]: a = array([[1, 2, 3, 4]])

In [2]: np.cov(a)
Out[2]: array(1.6666666666666667)

In [3]: np.cov(a.T)
Out[3]: 
array([[ nan,  nan,  nan,  nan],
       [ nan,  nan,  nan,  nan],
       [ nan,  nan,  nan,  nan],
       [ nan,  nan,  nan,  nan]])

In [4]: np.cov(a.T, rowvar=0)
Out[4]: array(1.6666666666666667)
于 2012-12-10T21:33:44.333 に答える
0

実際には、それはサイズ4 x 4の行列を返すべきではありませんか?つまり、ベクトルには4つの「特徴」があるため、特徴間の分散を測定して適切な場所に保存したい場合は、共分散行列が必要です。

観測値は1つしかないため、共分散行列を計算することはできません。推定量に応じて、共分散はゼロまたは未定義のいずれかになります。

それが直感的に明確でない場合は、次の質問に答えてみてください。

  1. の分散は1.0何ですか?
  2. 1.0との共分散は何2.0ですか?

本質的に、これらはあなたがnumpy.cov()実行しようとしている計算です。

于 2012-12-10T21:41:15.603 に答える