我正在准备关于 R 中机器学习的讲座,我想以 hierarchical clustering 为例。我在这里找到了这个非常有指导意义的页面:http://home.deib.polimi.it/matteucc/Clustering/tutorial_html/hierarchical.html
它从以下距离表开始(在读入数据时注意 NA
作为列/行名称,另见下文):
138
和 MI
之间的最短距离是 TO
,所以我们想将这些列和行合并到一个新的列/行 MI/TO
这个新的复合对象 MI/TO
到所有剩余城市的距离等于原始城市之一的最短距离城市 MI
或 TO
,例如MI/TO
到 RM
是 564
(来自 MI
),因为它比 669
(来自 TO
)短。 (这种聚合方式称为 single-linkage clustering )。所以我们有一个新表:
我的问题
我开始用 R 编写代码,很快发现代码变得越来越困惑——远非初出茅庐的程序员可以轻松理解的东西。您是否知道一种方法或包可以以自然和直观的方式进行此类数据操作?
所以这是R中的起始表:
D <- matrix(c(0,662,877,255,412,996,
662,0,295,468,268,400,
877,295,0,754,564,138,
255,468,754,0,219,869,
412,268,564,219,0,669,
996,400,138,869,669,0), ncol=6, byrow=T)
rownames(D) <- colnames(D) <- c("BA","FI","MI","Na","RM","TO")
D
## BA FI MI Na RM TO
## BA 0 662 877 255 412 996
## FI 662 0 295 468 268 400
## MI 877 295 0 754 564 138
## Na 255 468 754 0 219 869
## RM 412 268 564 219 0 669
## TO 996 400 138 869 669 0
最佳答案
内置函数“hclust”已经是一个很好用的函数。
hc1 = hclust(as.dist(D), method = "single")
hc1$merge
plot(hc1)
如果你想澄清,我可以详细描述。
按照hclust的逻辑,你可以试试:
savemat = list()
D1 = D; diag(D1) = Inf # a trick to make zero a infinity
m = 1
while(dim(D1)[1] > 2) {
# get the location of minimum distance
minloc = which(D1 == min(D1), arr.ind = T)[1,]
# make a two-column matrix then find out the minimum value of each row
u = apply(cbind(D1[minloc[2],],D1[minloc[1],]),1,min)
# updating the matrix
D1[minloc[2],] = u
D1[,minloc[2]] = u
u = paste0(rownames(D1)[minloc[2]],'/',rownames(D1)[minloc[1]])
rownames(D1)[minloc[2]] = u
colnames(D1)[minloc[2]] = u
# deleting the merged column/row
D1 = D1[-minloc[1],-minloc[1]]
diag(D1) = Inf
# save the steps into a list element mth
savemat[[m]] = D1
m = m + 1
}
savemat
关于r - 在 R 中编写层次聚类算法的教学方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32266666/