是否应该使用R中的距离(不相似性)或相似性进行聚类?

时间:2011-09-21 13:01:12

标签: r cluster-analysis

我正在解决群集问题,R中的proxy包提供了dist和simil函数。

为了我的目的,我需要一个距离矩阵,所以我最初使用dist,这里是代码:

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

但在我绘制图像之后,我发现群集结果不是我预期的方式,因为我知道它应该是什么样的。

所以我尝试了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之间的关系感到困惑。根据文档中描述的关系,两个代码片段不应该有相同的结果吗?

我哪里错了?

编辑:

您可以使用以下值的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)
}

Matrix使用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

Matrix使用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

你可以看到两个矩阵中的相应元素加起来为1,我认为这是不对的。所以一定有一些我做错了。

编辑:

在read.table函数中指定名称以读入数据框后,dist方式和simil + pr_simil2dist方式给出相同的正确结果。 技术问题解决了,但我不知道为什么我原来处理数据框的方式与dist和simil有关。

任何人都有这方面的线索吗?

1 个答案:

答案 0 :(得分:5)

我不确定你的意思不是按照预期的。如果我通过proxy::dist()simil()计算距离/相似度矩阵并转换为相异度,我会得到相同的矩阵:

> 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"

告诉我们h1h2除了匹配的函数调用之外完全相同(显然我们在相应的调用中使用了d1d2

产生的数字是:

enter image description here

如果正确设置对象,则无需摆弄标签。查看row.names的{​​{1}}参数,了解如何在读入数据时指定用作行标签的列。

所有这一切都是使用:

完成的
read.table()