R 实现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中

我曾尝试实现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中有
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