R 实现K-Means算法问题
我曾尝试实现K-means,但代码有问题,因为我没有得到结果 这是欧几里德距离计算:R 实现K-Means算法问题,r,R,我曾尝试实现K-means,但代码有问题,因为我没有得到结果 这是欧几里德距离计算: euclid <- function(p1, p2) { dm <- matrix(NA, nrow=dim(p1)[1], ncol=dim(p2)[1]) for(i in 1:nrow(p2)) { dm[,i] <- sqrt(rowSums(t(t(p1)-p2[i,])^2)) } dm } euclid顺便说一句,假设这是一个自学问题,因为R中
euclid <- function(p1, p2) {
dm <- matrix(NA, nrow=dim(p1)[1], ncol=dim(p2)[1])
for(i in 1:nrow(p2)) {
dm[,i] <- sqrt(rowSums(t(t(p1)-p2[i,])^2))
}
dm
}
euclid顺便说一句,假设这是一个自学问题,因为R中有kmeans
函数。如果是这样,关于kmeans有一个很好的课程(第一章免费)
问题似乎在于欧几里德函数,特别是这一行
dm[,i] <- sqrt(rowSums(t(t(p1)-p2[i,])^2))
euclid <- function(p1, p2) {
dm <- matrix(NA, nrow=dim(p1)[1], ncol=dim(p2)[1])
for(i in 1:nrow(p2)) {
dm[,i] <- sqrt(rowSums(sapply(1:ncol(p1), function(c) {(p1[,c] - p2[i,c])^2})))
}
dm
}
我换了这条线
dm[,i] <- sqrt(rowSums(t(t(p1)-p2[i,])^2))
euclid <- function(p1, p2) {
dm <- matrix(NA, nrow=dim(p1)[1], ncol=dim(p2)[1])
for(i in 1:nrow(p2)) {
dm[,i] <- sqrt(rowSums(sapply(1:ncol(p1), function(c) {(p1[,c] - p2[i,c])^2})))
}
dm
}
编辑-标签
要获取集群标签,我建议您将包含标签的整个data.frame传递给K_means
函数,如下所示
请注意,我还更改了代码,以便在后续迭代中使用新的中心。在以前的代码中,始终使用最初传递的中心
K_means <- function(dt, c, itr) {
clusterHistory <- vector(itr, mode="list")
centerHistory <- vector(itr, mode="list")
dt_labels <- dt[,1]
dt_data <- dt[,-1]
c_labels <- c[,1]
c_data <- c[,-1]
for(i in 1:itr) {
distsToCenters <- euclid(dt_data,c_data)
clusters <- apply(distsToCenters, 1, which.min)
c_data <- apply(dt_data, 2, tapply, clusters, mean)
# Saving history
clusterHistory[[i]] <- data.frame(Label = dt_labels, cluster_label = c_labels[clusters] ,cluster_number = clusters)
centerHistory[[i]] <- data.frame(Label = c_labels, c_data)
}
list(clusters=clusterHistory, c = centerHistory)
}
顺便说一句,假设这是一个自学问题,考虑到R中有一个kmeans
函数。如果是这样,有一个关于kmeans的好课程(第一章免费)
问题似乎在于欧几里德函数,特别是这一行
dm[,i] <- sqrt(rowSums(t(t(p1)-p2[i,])^2))
euclid <- function(p1, p2) {
dm <- matrix(NA, nrow=dim(p1)[1], ncol=dim(p2)[1])
for(i in 1:nrow(p2)) {
dm[,i] <- sqrt(rowSums(sapply(1:ncol(p1), function(c) {(p1[,c] - p2[i,c])^2})))
}
dm
}
我换了这条线
dm[,i] <- sqrt(rowSums(t(t(p1)-p2[i,])^2))
euclid <- function(p1, p2) {
dm <- matrix(NA, nrow=dim(p1)[1], ncol=dim(p2)[1])
for(i in 1:nrow(p2)) {
dm[,i] <- sqrt(rowSums(sapply(1:ncol(p1), function(c) {(p1[,c] - p2[i,c])^2})))
}
dm
}
编辑-标签
要获取集群标签,我建议您将包含标签的整个data.frame传递给K_means
函数,如下所示
请注意,我还更改了代码,以便在后续迭代中使用新的中心。在以前的代码中,始终使用最初传递的中心
K_means <- function(dt, c, itr) {
clusterHistory <- vector(itr, mode="list")
centerHistory <- vector(itr, mode="list")
dt_labels <- dt[,1]
dt_data <- dt[,-1]
c_labels <- c[,1]
c_data <- c[,-1]
for(i in 1:itr) {
distsToCenters <- euclid(dt_data,c_data)
clusters <- apply(distsToCenters, 1, which.min)
c_data <- apply(dt_data, 2, tapply, clusters, mean)
# Saving history
clusterHistory[[i]] <- data.frame(Label = dt_labels, cluster_label = c_labels[clusters] ,cluster_number = clusters)
centerHistory[[i]] <- data.frame(Label = c_labels, c_data)
}
list(clusters=clusterHistory, c = centerHistory)
}
$clusters
$clusters[[1]]
Label cluster_label cluster_number
1 A A 1
2 B F 3
3 C C 2
4 D A 1
5 E M 4
6 F F 3
7 G M 4
8 H M 4
9 I F 3
10 J F 3
11 K M 4
12 L M 4
13 M M 4
14 N F 3
15 O A 1
16 P F 3
17 Q M 4
18 R M 4
19 S C 2
20 T C 2
$clusters[[2]]
Label cluster_label cluster_number
1 A A 1
2 B F 3
3 C A 1
4 D A 1
5 E M 4
6 F A 1
7 G M 4
8 H M 4
9 I F 3
10 J F 3
11 K M 4
12 L M 4
13 M A 1
14 N F 3
15 O A 1
16 P A 1
17 Q M 4
18 R M 4
19 S C 2
20 T C 2
$clusters[[3]]
Label cluster_label cluster_number
1 A A 1
2 B F 3
3 C A 1
4 D A 1
5 E M 4
6 F A 1
7 G M 4
8 H M 4
9 I F 3
10 J F 3
11 K M 4
12 L M 4
13 M A 1
14 N A 1
15 O A 1
16 P A 1
17 Q M 4
18 R M 4
19 S C 2
20 T C 2
$clusters[[4]]
Label cluster_label cluster_number
1 A A 1
2 B F 3
3 C A 1
4 D A 1
5 E M 4
6 F A 1
7 G M 4
8 H M 4
9 I F 3
10 J F 3
11 K M 4
12 L M 4
13 M A 1
14 N A 1
15 O A 1
16 P A 1
17 Q M 4
18 R M 4
19 S C 2
20 T C 2
$c
$c[[1]]
Label X Y
1 A 3.166667 6.033333
2 C 1.133333 2.566667
3 F 3.500000 3.416667
4 M 6.225000 3.062500
$c[[2]]
Label X Y
1 A 3.300 5.514286
2 C 0.650 1.350000
3 F 3.625 2.500000
4 M 6.400 2.785714
$c[[3]]
Label X Y
1 A 3.325000 5.387500
2 C 0.650000 1.350000
3 F 3.666667 1.833333
4 M 6.400000 2.785714
$c[[4]]
Label X Y
1 A 3.325000 5.387500
2 C 0.650000 1.350000
3 F 3.666667 1.833333
4 M 6.400000 2.785714