我正在解决群集问题,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有关。
任何人都有这方面的线索吗?
答案 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"
告诉我们h1
和h2
除了匹配的函数调用之外完全相同(显然我们在相应的调用中使用了d1
和d2
)
产生的数字是:
如果正确设置对象,则无需摆弄标签。查看row.names
的{{1}}参数,了解如何在读入数据时指定用作行标签的列。
所有这一切都是使用:
完成的read.table()