データマトリックス(テキストマイニングデータ)と同様に、距離マトリックスでk平均を実行することは有効でしたか?


8

(この投稿は私が昨日投稿した質問の再投稿です(現在は削除されています)が、私は言葉の量を減らし、質問の内容を単純化しようとしました)

私が作成したkmeansスクリプトと出力を解釈するのに役立つ情報を得たいと思っています。これはテキスト分析のコンテキストにあります。このスクリプトは、テキスト分析に関するオンラインの記事をいくつか読んだ後に作成しました。それらのいくつかを以下にリンクしました。

この投稿全体で参照するサンプルのrスクリプトとテキストデータのコーパス:

library(tm) # for text mining

## make a example corpus
# make a df of documents a to i
a <- "dog dog cat carrot"
b <- "phone cat dog"
c <- "phone book dog"
d <- "cat book trees"
e <- "phone orange"
f <- "phone circles dog"
g <- "dog cat square"
h <- "dog trees cat"
i <- "phone carrot cat"
j <- c(a,b,c,d,e,f,g,h,i)
x <- data.frame(j)    

# turn x into a document term matrix (dtm)
docs <- Corpus(DataframeSource(x))
dtm <- DocumentTermMatrix(docs)

# create distance matrix for clustering
m <- as.matrix(dtm)
d <- dist(m, method = "euclidean")

# kmeans clustering
kfit <- kmeans(d, 2)
#plot – need library cluster
library(cluster)
clusplot(m, kfit$cluster)

スクリプトは以上です。以下は、スクリプト内のいくつかの変数の出力です。

コーパスに変換されたデータフレームxは次のとおりです。

 x
                       j
    1 dog dog cat carrot
    2      phone cat dog
    3     phone book dog
    4     cat book trees
    5       phone orange
    6  phone circles dog
    7     dog cat square
    8      dog trees cat
    9   phone carrot cat

結果のドキュメント用語行列dtmは次のとおりです。

    > inspect(dtm)
<<DocumentTermMatrix (documents: 9, terms: 9)>>
Non-/sparse entries: 26/55
Sparsity           : 68%
Maximal term length: 7
Weighting          : term frequency (tf)

    Terms
Docs book carrot cat circles dog orange phone square trees
   1    0      1   1       0   2      0     0      0     0
   2    0      0   1       0   1      0     1      0     0
   3    1      0   0       0   1      0     1      0     0
   4    1      0   1       0   0      0     0      0     1
   5    0      0   0       0   0      1     1      0     0
   6    0      0   0       1   1      0     1      0     0
   7    0      0   1       0   1      0     0      1     0
   8    0      0   1       0   1      0     0      0     1
   9    0      1   1       0   0      0     1      0     0

そしてここに距離行列dがあります

> d
         1        2        3        4        5        6        7        8
2 1.732051                                                               
3 2.236068 1.414214                                                      
4 2.645751 2.000000 2.000000                                             
5 2.828427 1.732051 1.732051 2.236068                                    
6 2.236068 1.414214 1.414214 2.449490 1.732051                           
7 1.732051 1.414214 2.000000 2.000000 2.236068 2.000000                  
8 1.732051 1.414214 2.000000 1.414214 2.236068 2.000000 1.414214         
9 2.236068 1.414214 2.000000 2.000000 1.732051 2.000000 2.000000 2.000000

結果は次のとおりです:kfit:

> kfit
K-means clustering with 2 clusters of sizes 5, 4

Cluster means:
         1        2        3        4        5        6        7        8        9
1 2.253736 1.194938 1.312096 2.137112 1.385641 1.312096 1.930056 1.930056 1.429253
2 1.527463 1.640119 2.059017 1.514991 2.384158 2.171389 1.286566 1.140119 2.059017

Clustering vector:
1 2 3 4 5 6 7 8 9 
2 1 1 2 1 1 2 2 1 

Within cluster sum of squares by cluster:
[1] 13.3468 12.3932
 (between_SS / total_SS =  29.5 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss" "betweenss"    "size"         "iter"        
[9] "ifault"      

これが結果のプロットです: ここに画像の説明を入力してください

これについていくつか質問があります。

  1. 私の距離行列d(kfit計算で使用されるパラメーター)を計算する際に、これを行いましたd <- dist(m, method = "euclidean")。私が遭遇した別の記事はこれを行いました:d <- dist(t(m), method = "euclidean")。次に、私が最近投稿したSOの質問に個別に「距離の行列ではなく、データの行列でkmeansを実行する必要があります!」とコメントしました。おそらく、それらはkmeans()入力としてdではなくmを取る必要があることを意味します。これらの3つのバリエーションのうち、どちらが「正しい」か。または、すべてが何らかの方法で有効であるとすると、初期のベースラインモデルを設定する従来の方法はどれでしょうか。
  2. 私が理解しているように、dでkmeans関数が呼び出されると、2つのランダムな重心が選択されます(この場合はk = 2)。次に、rはdの各行を調べ、どのドキュメントがどの重心に最も近いかを判断します。上記のマトリックスdに基づいて、実際にはどのように見えますか?たとえば、最初のランダムな重心が1.5で2番目が2の場合、ドキュメント4はどのように割り当てられますか?行列dでdoc4は2.645751 2.000000 2.000000 so(r)でmean(c(2.645751,2.000000,2.000000))= 2.2なので、この例のkmeansの最初の反復では、doc4は値2のクラスターに割り当てられます。 1.5よりも。この後、クラスターの平均が新しい重心として再計算され、必要に応じてドキュメントが再割り当てされます。これは正しいですか、それとも完全にポイントを逃しましたか?
  3. 上記のkfit出力で、「クラスター平均」とは何ですか?たとえば、Doc3クラスター1の値は1.312096です。この文脈でこの数は何ですか?[編集、投稿の数日後にもう一度見てみると、最終的なクラスターの中心までの各ドキュメントの距離であることがわかります。したがって、最も小さい番号(最も近い番号)が、各ドキュメントがどのクラスターに割り当てられるかを決定します]。
  4. 上記のkfit出力では、「クラスター化ベクトル」は、各ドキュメントが割り当てられたクラスターのように見えます。OK。
  5. 上記のkfit出力では、「クラスター内の二乗和平方和」。それは何ですか?13.3468 12.3932 (between_SS / total_SS = 29.5 %)。各クラスター内の分散の測定値は、おそらく数値が小さいほど、まばらなグループとは対照的に、より強いグループ化を意味します。それは公正な声明ですか?29.5%のパーセンテージについてはどうでしょう。あれは何でしょう?29.5%は「良い」です。kmeansのどのインスタンスでも、より低いまたはより高い数値が優先されますか?異なる数のkで実験した場合、クラスターの数の増加/減少が分析を助けたり妨げたりしたかどうかを判断するために何を探しますか?
  6. プロットのスクリーンショットは-1から3になります。ここで何が測定されていますか?教育と収入、身長と体重とは対照的に、この文脈でのスケールの一番上の3は何ですか?
  7. プロットでは、「これら2つのコンポーネントは点の変動性の50.96%を説明します」というメッセージがここにすでにあります(他の誰かがこの投稿に出くわした場合-kmeansの出力を理解するために、ここに追加したいと思います)。

このスクリプトを作成するのに役立つ記事をいくつか紹介します。


3
反対票を投じる場合は、コメントを残して理由を教えてください。そうすれば修正を試みることができます
Doug Fir

kfit関数ドキュメントはどこにありますか?tmライブラリcran.r-project.org/web/packages/tm/tm.pdfの中を調べたところ、見つかりませんでしkfitた。
ttnphns

こんにちは@ttnphns kfitは、私が作成したスクリプト例のkfit <-kmeans(d、2)の変数です。実際のkfit関数はありません
Doug Fir

私がSPSSであなたのデータを使って行ったことはこれです。私は入力を使ってK-meansを実行しましたtdm。あなたのユークリッド距離行列と(B) d。SPSSのK平均は、入力を常にケースX変数データとして扱い、ケースをクラスター化します。初期中心として、私は両方の分析であなたの分析の出力中心を入力します- cluster means。結果:分析(b)では、(a)ではなく、入力センターと同じ最終センターが得られました。つまり、(b)のK平均はクラスターの中心をさらに改善できなかったことを意味します。これは、分析(b)がユーザーが行ったk平均分析と一致することを意味します。
ttnphns

(続き)しかし、前に述べたように、私の分析(b)はその入力データを距離行列ではなくデータ行列として扱いました。したがって、あなたの分析もそうしました。あなたのK平均関数は距離行列を取り込むようには設計されていません(または、このようなオプションが存在する場合、そのオプションを再生できませんでした)。これは、データ行列を必要とする標準のK平均です。距離行列を与えようとするのは誤りです。したがって、クラスタリングの結果は誤りでした。私の結論もそうだった。
ttnphns

回答:


5

kmeans()関数がどのように機能するかを理解するには、ドキュメントを読んだり、基になるコードを調べたりする必要があります。とはいえ、面倒なことさえせずに距離行列をとることはないと思います。距離行列からk-meansクラスタリングを行う独自の関数を書くこともできますが、それは恐ろしい手間になります。

k-meansアルゴリズムは、距離行列ではなく、データ行列に対して動作することを意図しています。それは唯一の最小化は、ユークリッド距離(参照平方なぜアルゴリズムの使用のみユークリッド距離メトリックをk-meansクラスタリングしていますか?)。ユークリッド距離を意味のある距離メトリックとして持つことができる場合にのみ意味があります。アルゴリズムが発明されて以来、これは常に当てはまりますが、k-meansがおそらく機械学習で最も誤用されているアルゴリズムであるという結果に気づいている人はほとんどいません。

ユークリッド距離は、スパースカテゴリカルデータ(テキストマイニング)には意味をなさないため、このようなことは何もしません。まず、データに適切な距離メトリックを把握する必要があります(@ttnphnsは、いくつかの可能な測定をここで説明します:属性が名目である場合の個人の最適距離関数とは何ですか?)。次に、距離行列を計算し、1つに対して動作できるクラスタリングアルゴリズムを使用できます(たとえば、k-中央値/ PAM、さまざまな階層型アルゴリズムなど)。


かなり断定的な答えを@gungに感謝します。これは私が少し不確かで、さらに混乱するように思えたインターネット調査のうさぎの穴を下ったので、私が探していたものです。私はあなたが言及したk-中央値と他のアルゴリズムを調べます。
Doug Fir 2016

2
また、1つ以上の記事がkmeansへの入力として距離行列を使用しているため、このブログブログにはギャップがあるようです。おそらく1つのブロガーが別のブロガーからコピーされ、誤った情報を含むいくつかの記事に連鎖的な影響を及ぼしました。
Doug Fir 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.