无法编写我自己的Kmeans聚类函数

时间:2017-11-06 02:26:51

标签: r for-loop k-means

我正在使用for循环在R中编写一个简单的函数。该函数采用数据集,在for循环内,循环遍历并为kmeans函数提供不同的簇数值。代码如下:

 s_kmeans <- function(fname){
       wss = NULL
       dataset <- read.csv(file=fname1,header = TRUE, sep = ",")
       for(i in 2:10)
       {
         results <- kmeans(dataset,i)
         wss[i] <- results$tot.withinss
       }
       x <- c(2:10)
       df <- data.frame(x,wss)
       g <- ggplot(df, aes(x))
       g <- g+geom_line(aes(y=wss), color="red")
}

现在,如果我运行此代码,则会出错:

Error in data.frame(x, wss) : 
  arguments imply differing number of rows: 9, 10

实际上我想要从簇数为2到10的结果。我的理解是循环运行9次,x vector也有9个元素。我修改了代码,如下所示:

 s_kmeans <- function(fname){
           wss = NULL
           dataset <- read.csv(file=fname1,header = TRUE, sep = ",")
           for(i in 2:10)
           {
             results <- kmeans(dataset,i)
             wss[i] <- results$tot.withinss
           }
           x <- c(1:10)
           print(wss)
           print(x)
           df <- data.frame(x,wss)
           g <- ggplot(df, aes(x))
           g <- g+geom_line(aes(y=wss), color="red")
    }

现在它没有给出任何错误,但是将NA作为wss的第一个元素(wss中的总共10个元素,应该是9,因为循环运行9次)向量和x向量。 Out如下所示:

[1]        NA 1019.0836  864.0937  655.6397  506.3810  520.0426  374.2550  294.3192  330.9977  316.5263
 [1]  1  2  3  4  5  6  7  8  9 10

我不知道发生了什么。任何人都可以请帮助。

2 个答案:

答案 0 :(得分:1)

因为你没有为wss [1]设置值,所以它给了你NA。尝试修改你的循环如下

for(i in 1:9)
{
    results <- kmeans(dataset,i+1)
    wss[i] <- results$tot.withinss
}
x <- c(1:9)

答案 1 :(得分:0)

我认为问题不在于k-means,在定义变量时,维度存在问题。你想要做的是绘制xtot.withinss,即群集数量和总和,并选择最佳数字,这样你就必须做下一个:

s_kmeans <- function(fname){
           wss = NULL
           dataset <- read.csv(file=fname1,header = TRUE, sep = ",")
           for(i in 2:10)
           {
             results <- kmeans(dataset,i)
             wss[(i-1)] <- results$tot.withinss
           }
           x <- 2:10
           print(wss)
           print(x)
           df <- data.frame(x,wss)
           g <- ggplot(df, aes(x))
           g <- g+geom_line(aes(y=wss), color="red")
    }

x2开始,wss将是9维向量,所以你的情节会有

> x
[1]  2  3  4  5  6  7  8  9 10

正方形的总和为tot.withinss