2011-09-21 13 views
1

私はクラスタの問題を抱えており、Rのproxyパッケージはdistとsimilの両方の機能を提供しています。クラスタリングのためにRの距離(非類似性)または類似点を使用する必要がありますか?

は私の目的のために私は距離行列を必要とするので、私は最初にdistのを使用し、ここでのコードです:

distanceMatrix <- dist(dfm[,-1], method='Pearson') 
clusters <- hclust(distanceMatrix) 
clusters$labels <- dfm[,1]#colnames(dfm)[-1] 
plot(clusters, labels=clusters$labels) 

しかし、私は画像をplotedた後、私は、クラスタの結果は、私はそれをexpecte方法がないことがわかりました私はそれがどのように見えるべきかを知っているからです。

だから代わりsimil試みたが、コードは次のようである:

distanceMatrix <- simil(dfm[,-1], method='Pearson') 
clusters <- hclust(pr_simil2dist(distanceMatrix)) 
clusters$labels <- dfm[,1]#colnames(dfm)[-1] 
plot(clusters, labels=clusters$labels) 

このコードは、私がsimilを使用して類似性行列を計算し、その後、私はそれをプロットし、pr_simil2distを使用して行列を距離に変換し、結果を得ます期待!

私はdistとsimilの関係について混乱しています。ドキュメントに記載されている関係によれば、2つのコードスニペットで同じ結果が得られるはずはありませんか?

どこが間違っていますか?

編集:

あなたが悪いインデントのために申し訳ありませんが、次の値のDFMで自分のコードを試すことができます。

       Blog china kids music yahoo want wrong 
         Gawker  0 1  0  0 7  0 
        Read/WriteWeb  2 0  1  3 1  1 
       WWdN: In Exile  0 2  4  0 0  0 
      ProBlogger Blog Tips  0 0  0  0 2  0 
        Seth's Blog  0 0  1  0 3  1 
The Huffington Post | Raw Feed  0 6  0  0 14  5 

編集:

実際にサンプルデータがtailを使用して非常に大きなデータフレームから取られた、と私はDISTとsimil + pr_simil2distを使用して完全に異なる行列を取得しています。完全なデータは、私は他の愚かなミスを犯した場合にはhere.

を見つけたことができ、ここで私の関数の完全なコードは次のとおりです。

私がデータを読み込むために使用するコード:

dfm<- read.table(filename, header=T, sep='\t', quote='') 

コードクラスタリングのために:

hcluster <- function(dfm, distance='Pearson'){ 
    dfm <- tail(dfm)[,c(1:7)] # I use this to give the sample data. 
    distanceMatrix <- simil(dfm[,-1], method=pearson) 
    clusters <- hclust(pr_simil2dist(distanceMatrix)) 
    clusters$labels <- dfm[,1]#colnames(dfm)[-1] 
    plot(clusters, labels=clusters$labels) 
} 

distのを使用してマトリックス:

  94   95   96   97   98 
95 -0.2531580            
96 -0.2556859 -0.4629100         
97 0.9897783 -0.1581139 -0.2927700      
98 0.8742800 -0.2760788 -0.1022397 0.9079594   
99 0.9114339 -0.5020405 -0.2810414 0.8713293 0.8096980 
simil + pr_simil2distを使用して

マトリックス:

  94   95   96   97   98 
95 1.25315802            
96 1.25568595 1.46291005         
97 0.01022173 1.15811388 1.29277002      
98 0.12572004 1.27607882 1.10223973 0.09204062   
99 0.08856608 1.50204055 1.28104139 0.12867065 0.19030202 

次の2つの行列の対応する要素は、私は適切ではないと思われ、1まで追加することを確認することができます。だから私が間違っていることがなければなりません。

編集:私は、データフレームを読み込むためにread.tableを関数内で名前を指定した後

、distの道とsimil + pr_simil2dist方法は、同じ正しい結果を与えます。 技術的に問題が解決しましたしかし、なぜデータフレームを扱う私の元の方法がdistとsimilと関係があるのか​​わかりません。

いずれにも手掛かりがありますか?

+0

あなたのコード正確ではありません再現性がある。私たちのマシンで実行できる簡単な例を与えるために気をつけますか? –

答えて

5

期待通りにあなたが意味するものがわかりません。

> dist(dfm, method='Pearson') 
            Gawker Read/WriteWeb WWdN: In Exile ProBlogger Blog Tips Seth's Blog 
Read/WriteWeb     0.2662006                
WWdN: In Exile     0.2822594  0.2662006             
ProBlogger Blog Tips   0.2928932  0.5917517  0.6984887         
Seth's Blog     0.2662006  0.2928932  0.4072510   0.2928932    
The Huffington Post | Raw Feed 0.1835034  0.2312939  0.2662006   0.2928932 0.2312939 

> pr_simil2dist(simil(dfm, method = "pearson")) 
            Gawker Read/WriteWeb WWdN: In Exile ProBlogger Blog Tips Seth's Blog 
Read/WriteWeb     0.2662006                
WWdN: In Exile     0.2822594  0.2662006             
ProBlogger Blog Tips   0.2928932  0.5917517  0.6984887         
Seth's Blog     0.2662006  0.2928932  0.4072510   0.2928932    
The Huffington Post | Raw Feed 0.1835034  0.2312939  0.2662006   0.2928932 0.2312939 

d1 <- dist(dfm, method='Pearson') 
d2 <- pr_simil2dist(simil(dfm, method = "pearson")) 
h1 <- hclust(d1) 
h2 <- hclust(d2) 
layout(matrix(1:2, ncol = 2)) 
plot(h1) 
plot(h2) 
layout(1) 
all.equal(h1, h2) 

最後の行の収量:

> all.equal(h1, h2) 
[1] "Component 6: target, current do not match when deparsed" 
私は proxy::dist()を介して、または simil()を経由して、距離/類似度行列を計算し、非類似度に変換する場合、私は同じ行列を取得します

h1h2は、マッチした関数呼び出しを除いて全く同じです(明らかに0それぞれの呼び出しではとd2)。

生産図は次のとおりです。

enter image description here

あなたが正しくあなたのオブジェクトを設定した場合、その後、あなたはラベルをいじる必要はありません。データが読み込まれたときに行のラベルとして使用する列を指定する方法についてはread.table()row.names引数を見てください

このすべてを使用して行った:。

dfm <- structure(list(china = c(0L, 2L, 0L, 0L, 0L, 0L), kids = c(1L, 
0L, 2L, 0L, 0L, 6L), music = c(0L, 1L, 4L, 0L, 1L, 0L), yahoo = c(0L, 
3L, 0L, 0L, 0L, 0L), want = c(7L, 1L, 0L, 2L, 3L, 14L), wrong = c(0L, 
1L, 0L, 0L, 1L, 5L)), .Names = c("china", "kids", "music", "yahoo", 
"want", "wrong"), class = "data.frame", row.names = c("Gawker", 
"Read/WriteWeb", "WWdN: In Exile", "ProBlogger Blog Tips", "Seth's Blog", 
"The Huffington Post | Raw Feed")) 
+0

+1すてきな答え。 – Andrie

+0

これは奇妙です...私はdistとsimil + pr_simil2distを使って完全に異なる行列を得ます。編集した投稿をご覧ください。 –

+0

私のマシンであなたのコードを試してみましたが、同じ結果が出ましたので、何が問題なのかまだ分かりません... –

関連する問題