3

私たちが去ったところから拾う...

したがって、linalg.eigまたはlinalg.svdを使用してPCAを計算できます。同じデータが供給されると、それぞれが異なる主成分/固有ベクトルと固有値を返します(私は現在Irisデータセットを使用しています)。

ここまたはPCAをアイリスデータセットに適用した他のチュートリアルを見ると、固有値がであることがわかります[2.9108 0.9212 0.1474 0.0206]。このeig方法では、使用する固有値/ベクトルの異なるセットが得られますが、これらの固有値を合計すると、次元の数(4)に等しくなり、各コンポーネントがどの程度貢献しているかを調べるために使用できます。全分散。

返される固有値を取るlinalg.eigことはできません。たとえば、返される値はです[9206.53059607 314.10307292 12.03601935 3.53031167]。この場合の分散の割合は[0.96542969 0.03293797 0.00126214 0.0003702]です。この別のページには、(「コンポーネントによって説明される変動の割合は、その固有値を固有値の合計で割ったものにすぎません。」)と書かれています。

各次元によって説明される分散は一定でなければならないので(私は思う)、これらの比率は間違っています。したがって、すべてのチュートリアルで使用される値である、によって返される値を使用すると、各ディメンションから正しい変動率を取得できますが、によって返される値をそのように使用できないsvd()のはなぜかと思います。eig

返された結果は変数を投影するための有効な方法であると思いますが、各変数によって説明される分散の正しい比率を取得できるように変数を変換する方法はありますか?つまり、このeig方法を使用しても、各変数の分散の比率を維持できますか?さらに、このマッピングは固有値でのみ実行できるので、実際の固有値と正規化された固有値の両方を持つことができますか?

長い記事でごめんなさい。(::)これは、これまでに得たものです。あなたがこの行を読んだだけではないと仮定します。

4

4 に答える 4

4

前の質問に対する Doug の回答を参考にして、次の 2 つの関数を実装すると、次のような出力が得られます。

def pca_eig(orig_data):
    data = array(orig_data)
    data = (data - data.mean(axis=0)) / data.std(axis=0)
    C = corrcoef(data, rowvar=0)
    w, v = linalg.eig(C)
    print "Using numpy.linalg.eig"
    print w
    print v

def pca_svd(orig_data):
    data = array(orig_data)
    data = (data - data.mean(axis=0)) / data.std(axis=0)
    C = corrcoef(data, rowvar=0)
    u, s, v = linalg.svd(C)
    print "Using numpy.linalg.svd"
    print u
    print s
    print v

出力:

Using numpy.linalg.eig
[ 2.91081808  0.92122093  0.14735328  0.02060771]
[[ 0.52237162 -0.37231836 -0.72101681  0.26199559]
 [-0.26335492 -0.92555649  0.24203288 -0.12413481]
 [ 0.58125401 -0.02109478  0.14089226 -0.80115427]
 [ 0.56561105 -0.06541577  0.6338014   0.52354627]]

Using numpy.linalg.svd
[[-0.52237162 -0.37231836  0.72101681  0.26199559]
 [ 0.26335492 -0.92555649 -0.24203288 -0.12413481]
 [-0.58125401 -0.02109478 -0.14089226 -0.80115427]
 [-0.56561105 -0.06541577 -0.6338014   0.52354627]]
[ 2.91081808  0.92122093  0.14735328  0.02060771]
[[-0.52237162  0.26335492 -0.58125401 -0.56561105]
 [-0.37231836 -0.92555649 -0.02109478 -0.06541577]
 [ 0.72101681 -0.24203288 -0.14089226 -0.6338014 ]
 [ 0.26199559 -0.12413481 -0.80115427  0.52354627]]

どちらの場合も、目的の固有値が得られます。

于 2011-01-28T04:47:46.823 に答える
0

両方のケースのデータが同じで、次元の正しい順序であると確信していますか(回転した配列で送信していませんか?)? 正しく使用すれば、どちらも同じ結果が得られることに気付くでしょう ;)

于 2011-01-28T03:10:51.447 に答える
0

私が知っている PCA の実行方法は 3 つあります。相関行列の固有値分解、共分散行列、またはスケーリングされていない中心化されていないデータから導出されます。linalg.eig がスケーリングされていないデータに取り組んでいるようです。とにかく、それは単なる推測です。あなたの質問に適した場所はstats.stackexchange.comです。math.stackexchange.com の人々は、実際の数値を使用しません。:)

于 2011-01-28T03:47:09.433 に答える
0

PCA には SVD (特異値分解) を使用することをお勧めします。これは、
1) 必要な値と行列が直接得られるため、
2) 堅牢だからです。(驚きの)虹彩データの例については、SO のprincipal-component-analysis-in-python
を 参照してください。実行すると、

read iris.csv: (150, 4)
Center -= A.mean: [ 5.84  3.05  3.76  1.2 ]
Center /= A.std: [ 0.83  0.43  1.76  0.76]

SVD: A (150, 4) -> U (150, 4)  x  d diagonal  x  Vt (4, 4)
d^2: 437 138 22.1 3.09
% variance: [  72.77   95.8    99.48  100.  ]
PC 0 weights: [ 0.52 -0.26  0.58  0.57]
PC 1 weights: [-0.37 -0.93 -0.02 -0.07]

SVD の対角行列 d の 2 乗は、PC 0、PC 1 ... からの合計分散の割合を与えることがわかります。

これは役に立ちますか?

于 2011-01-29T16:38:00.660 に答える