既知のクラスターの分離を最大化するための次元削減手法?


8

それで、R ^ nにたくさんのデータポイントがあるとします。nはかなり大きい(50など)。このデータは3つのクラスターに分類され、各データポイントがどのクラスターに属しているかがわかります。私がやりたいのは、これらのクラスターを2Dで視覚化して、クラスター間の分離を最大化することです。Rのデータポイントの位置に基づいてクラスターが簡単に分離できることを証明することが目標です。 ^ nだけ。

これまで私がこれまで行ってきた方法は、データポイントでPCA変換を実行し、クラスターがかなりきれいに分離されているように見えるまでPCのペアをランダムに視覚化することです。このアプローチはかなりアドホックに思えますが、全体的な分散を最大化する代わりに、クラスター間の分離を最大化するPCAスタイルのデータのローテーションを見つける簡単な方法があるはずです。

これを行う標準的な技術はありますか?そうでない場合、そのような変換を作成する方法についてのアイデアはありますか?


Projection Pursuitに興味があるかもしれません。(GGobiソフトウェアで利用可能。)
chl

回答:


6

「全体的な分散を最大化する代わりに、クラスター間の分離を最大化する、データのPCAスタイルのローテーション」。判別分析はまさにそのような手法です。主成分はそれに沿った分散を最大化します。判別関数は、それに沿ったクラスター分散/クラスター内プール分散間の比率を最大化します。


判別分析は、データの2D埋め込みを生成するものとして標準的に提示されていません。たとえばフィッシャーのLDAからどの2D埋め込みを抽出することをお勧めしますか?
eric_kernfeld

@eric_kernfeld、判別関数の空間にデータを簡単にプロットします。また、ここここに示すように、元の変数のスペース内で追加の軸として関数を表示するのも簡単です
ttnphns

8

気になるかもしれない2つの方法が思い浮かびます。1つ目は既知のクラスターを利用する方法であり、Goldbergerらによって「近傍成分分析」と呼ばれています。

アイデアは、高次元空間から視覚化可能な空間へのマッピング(アフィンなど)を学ぶことです。(例えばRR2)。このマッピングは、k最近傍分類のバリエーションが使用されている場合、正しい分類の平均数を最大化することによって推定されます。得られたいくつかの印象的な結果があります:

wine、faces、およびdigitsデータセットのNCA

もう1つはtSNEで、マッピングを学習します(例:RR2)。このマッピングには制約はありませんが、損失は最適化されています(一部のパラメーター化ではありませんが、R2それ自体)は、新しいスペースが元のスペースと同様の距離を反映することです。同様のことはここではかなり複雑で、空間内の点の特定の分布と対応するKLダイバージェンスを仮定することに基づいています。

後者の場合は、所定のリンクで見つけることができるMATLABコードがあります。以下はMNISTデータセットの視覚化です:

MNIST上のtSNE


3

このペーパーをご覧ください。

G. Sanguinetti、クラスタ化されたデータセットの次元削減、IEEE Trans。パターン分析および機械知能(PAMI)30(3)、535-540(2008)(www)

線形判別分析の教師なしバージョンについて説明していますが、これについていくつかのデモンストレーションを見てきました。ツールボックスに非常に便利なツールのように見えます。

各サンプルがどのクラスに属するかがすでにわかっている場合は、(ttnphnsが示唆しているように)線形判別分析が必要です。統計パターン認識に関するAndrew Webbの本は、その種の参考書として適しています。


0

記事「PCA、PLS、MLR、CCAへの統合アプローチ」(M Borgaらによる)は、PCAやLDAを含むさまざまな種類の線形投影法について簡潔に説明しています。


0

部分最小二乗法はあなたが望むことをします。Rの「pls」ライブラリは、私が伝統的に使用してきたものです。50ポイントの3つのグループを作成し、それらをグループラベル付きのデータフレームに組み立て、PLSを実行する例を次に示します。

library(MASS)
library(pls)

pts1 = mvrnorm(50,c(3,0,3),diag(c(1,1,1)))
pts2 = mvrnorm(50,c(-3,0,3),diag(c(1,1,1)))
pts3 = mvrnorm(50,c(3,3,-3),diag(c(1,1,1)))
pts = as.data.frame(rbind(pts1,pts2,pts3))

pts$labels = c(rep(1,50),rep(2,50),rep(3,50))

plsresult = plsr(labels~.,ncomp=2,data=pts)
plot(plsresult$scores,col=pts$labels)

この場合、なぜPLS判別分析を使用しないのですか?
chl '10 / 10/03
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.