[掲示板へもどる]
一括表示

  [No.977] 階層的クラスタ−分析について 投稿者:袋井  投稿日:2012/06/09(Sat) 12:15:31

樋口先生 様;

お世話になります、袋井と申します。

毎々、細かい質問でご迷惑をお掛けしております。


階層的クラスタ−分析について、お聞きしたいことがございます。
よろしくお願いいたします。


(1)
クラスター数=auto を設定した場合の振る舞いについて、教えてください。

デンドグラムと交差する破線が描画されますが、
クラスター数=autoの場合には、距離に基づいて、最適なクラスタ数を推定し、
これに基づいて破線の描画をされているのでしょうか?


(2)
Rプログラムに、flushclustパッケージを利用している記述がございます。

上記質問と関係あるかもしれませんが、
flushclustパッケージのhclust関数では、特徴ある階層型クラスタリングができるのでしょうか?
(例えば、最適なクラスタ数の推定など)



−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
樋口先生に、ご要望がございます。


対応分析、階層的クラスター分析、多次元尺度構成法、共起ネットワークなどの素晴らしい機能が、
上質なインタフェースで提供されています。

改めて御礼を申し上げます。


共起ネットワークの場合には、エッジが張られないノードは描画されない、
多次元尺度構成法の場合には、分析から省かれる語がある、など、
利用者が指定した語が全て取り込まれない場合がございます。
(その理由については、理解、納得しております)

指定したノードを全て取り込んだ可視化をしたいと思ったときに、
RでサポートされているSOM(自己組織化マップ)機能が欲しくなります。

将来のバージョンアップの際に、ご検討をお願いしたいと思います。


Rの標準のSOMは、class,som,kohonenなどのパッケージで関数がありますが、
インタフェースは味気ないものです。

KH coderで実装される場合には是非とも、他の機能と同じく、上質なカラーリングをもつ
ビジュアルインタフェースをお願いしたいと思います。

古典的なオンライン型に加えて、バッチ型もありますが、
利用者にニューラルネット学習を意識させない、計算の安定性などを考えると、
バッチ型がよいかもしれません。


SOM機能については、恐らく、多くの方が望んでおいでになるのではないかと思います。

よろしくお願いいたします。


  [No.978] Re: クラスター数の設定 投稿者:HIGUCHI Koichi  投稿日:2012/06/09(Sat) 14:50:51

こんにちは、樋口です。いつも丁重なポストをいただき、大変ありがとうござ
います。


抽出語やコードのクラスター分析における、クラスター数の設定ですが、マニ
ュアルには書いていませんでしたね。すみません。

デフォルトの「Auto」では、抽出語(コード)数の平方根を四捨五入したも
のを用いています。これは完全なヒューリスティックスと言いますか、経験
的な感触と言いますかで、だいたいこれくらいのクラスター数への分割で、
解釈しやすい結果が得られることが多いように思い、設定したものです。

※以前、数値指標を使ってクラスター数を決められないか検討した記憶がある
のですが、あまり上手くいかず、現在の設定にしたような記憶があります。も
しKH Coderでの利用にお勧めの指標等ございましたら是非ご教示下さい。

なおflashClustにも、そうした便利な機能は無いと思います。クラスター分析
の高速化のためだけに利用しています。


次にSOMについてのリクエストも、大変ありがとうございます。

そういえば、まだバージョン3の頃にViscovery SOMineというものを使ってい
て、印象は良かったです。最近では、このソフト(のデータ量無制限版)は当
時よりも高騰している様子ですが…。

Rのパッケージをそのまま使ったのではできないこと(より優れたカラーリン
グ等)となると、一気に実現のハードルが上がるのですが(苦笑)、確かに
そういうことができれば良いでしょうし、ご要望をいただいた旨しかと覚えて
おきます。

丁重なフィードバックに重ねてお礼申し上げます。


  [No.979] Re: クラスター数の設定 投稿者:袋井  投稿日:2012/06/09(Sat) 17:22:53

樋口先生 様;

お世話になります、袋井と申します。

毎回、ご丁寧にご説明をしてくださり、誠にありがとうございます。
よく理解できました。
御礼を申し上げます。



(1)クラスタリング(クラスター分析)について

k-meansなどの階層型クラスタリングは、分割(最適分割)に興味がある手法ですので、
最適なクラスター数を推定する方法については、色々と提案されています。

例えば、x-meansというものがあります。

オリジナルなx-meansではなく、石岡先生がご提案されているものがお薦めです。

オリジナルと比較して石岡先生のご提案手法は、精度、安定性、高速化などで、色々と工夫がなされています。

色々な分野で良い報告がなされています。

Rプログラムが公開されており、私も利用させていただいております。

x-meansではk-meansを再帰的に呼び出し利用をしております。

つまり、k-meansの欠点(初期値依存性)をひきづっているということですので、
クラスターメンバーは計算毎に、少しづつ変わりますが、
クラスターサイズは安定していますので、最適なクラスター数の目安にはなります。
(心強いです)


x-meansはRプログラムが公開されていますので、KH coderでは、以下のように補完的に使うのがよいと思います。
・x-meansで最適なクラスターを推定する(ユーザーに見せる? 見せない?)
・上記で得たクラスター数を、KHcoderの階層的クラスター分析で、autoの場合のクラスター数とする


k-meansの初期値依存性の問題を解決するためのアイディアが色々と提案されています。

例えば、k-meansでは、k-means++というアイディアがあります。
おもしろいです。

私も自分なりに工夫をして、独立成分分析、ベクトル量子化を使うことを試しています。
(いい結果を得ています)


初期値依存性の問題は、k-meansに限らず、SOMでもNMFでも同様であり、色々なアイディアが提案されています。


最適なクラスター数の推定に戻りますが、Cluster Valid Indexが提案されております。
私も色々と使った経験がありますが、お薦めできるような、うれしい経験をしたことがございません。
(残念です)


一方、
非階層型クラスタリングはクラスターの併合に興味がある手法ですので、
併合の信頼性評価という観点からの手法が提案されています。

例えば、pvclustという手法がございます。
東工大で開発され、CRANのTaskViewにも登録されています。
私も使っています。

KH coderへの応用にはすぐに結びつくかどうかまでは分かりませんが、先生のご研究でお役に立つかもしれません。



(2)SOMについて

SOMについては、色々なソフトがありますね。

最近では、本の付録でも提供されているようです。

私もSOMについては、国内外、高価な商用、フリー、自作含めて、色々な経験があります。

ニューラルネット屋さんが開発したSOMは、私のような一般people、下々の人間には使いづらいですね。

統計解析屋さんの立場からのSOMの方が、良いですね、違和感がなく安心して使えます。

先生が阪大時代にお使いになっていた欧州製ソフトも、そういう立場の製品ですね。

同製品を私は、バージョン3から最新版まで使っていますが、同じデータでもバージョンにより結果が異なるという不思議な経験をしております。
また、同製品よりも他のSOMソフトの方が好ましい結果を得ています。


ソフトの選定は本当に難しいですね。

縁、出会いなのでしょうか?


随分と昔の話となりますが、
古典的なSOMで、乱数から出発して自動分類ができると知った時には、本当に驚きましたね。


今では、私はSOMではなく、NMFにはまっています。



(3)NMFについて

NMFについては集合知プログラミングの文脈で再び注目されているようですね。

KH coderの熱心な利用者さんでご興味を持たれている方も少なくないと思います。

NMFに期待するものとして、
 情報次元圧縮とクラスタリングを同時に行う、
 特徴抽出に優れている、
 テキストクラスタリング、
 ソフトクラスタリング 
などがあるのではないでしょうか?


私がNMFに興味をもったのは、
SOMとNMFを自己組織化アルゴリズムとして紹介する資料を読んだことがきっかけでした。

SOMの経験がある私にとっては、いい出会いでした。
この資料を読まなければ、NMFに深入りすることはなかったと思います。


私は、ほぼ毎日、NMFでデータ分析しています。日課となっています。

NMFのヒートマップの軸(縦、横)は、例えていえば一次元SOMが2軸あるようなものですので、解釈がしやすいです。
クラスタ間の相対比較もしやすいのもうれしいです。

しかし、NMFだけでなく、他の手法と相補うように工夫していることは、言うまでもありません。


KH coderで既に実現しているように、
色々な手法を補完的に活用することが大切であり、
そのために目利きになることが必要だということを、教えていただいた気がしています。

ありがとうございました。


長々とすいませんでした。


  [No.980] Re: クラスター数の設定 投稿者:HIGUCHI Koichi  投稿日:2012/06/09(Sat) 19:01:45

こんにちは、樋口です。書き込みありがとうございます。

今回もいろいろとお教えいただき、大変ありがとうございます。

「あぁ、そういえば」と思い当たるものから、まったく存じ上げず「ちょっと
調べてみよう」というものまで様々で、いつも楽しく拝見・勉強させていただ
いています。

それにしても、「日課」という言葉が出るほどデータ分析をなさっているとい
うのは、並々ならぬことと思いました。生まれもってのセンスといったものだ
けでなく、それだけの量の実務をこなされる中で磨かれるものがあるのでしょ
うね。

あれこれのご示唆をいただきながら、KH Coderの進歩は亀の歩みで、およそ追
いつく気配すらないのが恐縮ですが、どうぞ今後ともよろしくお願いいたしま
す。


  [No.981] Re: クラスター数の設定 投稿者:袋井  投稿日:2012/06/11(Mon) 20:57:07

樋口先生 様;

お世話になります、袋井と申します。

もう一点、教えていただきたいことがございます。
よろしくお願いいたします。


与えられたクラスタ数に基づき、デンドグラムと交差する破線で Cut Tree されます。

Cut Tree された状態での、
・クラスタのサイズ(各クラスタに含まれる語の個数)
・クラスタのメンバ(各クラスタに含まれる語の名称)
を外部ファイル出力したいと考えています。

階層的クラスター分析のRプログラムで、
計算結果を保持していると思われるオブジェクトのコンポーネントの値を確認していますが、
私の乏しい知識では分かりませんでした。


お手数ですが、上記のファイル出力のRプログラムをご教示していただけませんか。

よろしくお願いいたします。


  [No.982] Re: クラスター分析(語・コード)の結果の出力 投稿者:HIGUCHI Koichi  投稿日:2012/06/11(Mon) 23:59:28

こんにちは、樋口です。書き込みありがとうございます。

クラスター分析の結果を「R Source」形式で保存し、R上で実行した
あと、以下のコードを実行してください。

そして「freq」「words1」「words2」のうち、必要なものを
write.tableコマンド等で、ファイルに書き出していただくと良いか
と思います。


freq <- as.data.frame( table(memb, dnn="cluster") )

words1 <- data.frame(
cluster = I(memb),
label = I(labels)
)

words2 <- NULL
for (i in unique(memb) ){
current <- NULL
for (h in subset(words1, words1$cluster==i)$label ){
current <- paste(current,h)
}
substr(current,0,1) <- ''
words2 <- rbind(
words2,
cbind(
i,
current
)
)
}
colnames(words2) <- c("cluster","words")
words2 <- as.data.frame(words2)


  [No.983] Re: クラスター分析(語・コード)の結果の出力 投稿者:袋井  投稿日:2012/06/12(Tue) 19:44:28

樋口先生 様;

お世話になります、袋井と申します。

ご教示をいただき、誠にありがとうございました。

さっそく、確認をさせていただきます。