【问题标题】:Trouble writing my own Kmeans clustering function编写我自己的 Kmeans 聚类函数时遇到问题
【发布时间】:2018-04-18 03:21:56
【问题描述】:

我正在使用 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 的簇数的结果。我的理解是 for 循环运行 9 次,x 向量也有 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 向量。输出如下图:

[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

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

【问题讨论】:

  • 与错误无关,但是函数参数是fname但是你在函数内部使用fname1?
  • 当i == 2 时,您将一个值分配给wss[2] - 这使得wss 成为长度为2 且缺少第一个元素的向量。在您的第一个代码示例中,您可以改为分配给 wss[i - 1] &lt;- results$tot.withinss。

标签: r for-loop k-means


【解决方案1】:

我认为问题不在于 k-means,您在定义变量时遇到了维度问题。你想要做的是绘制x vs. tot.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")
    }

看xstarts from 2 as you want and wss will be a vector 9-dimensional,所以你的情节会有

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

而总平方和为tot.withinss。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 实际上,出于绘图目的,x 值应该从 2 开始,因为它表示集群的数量,否则您的逻辑看起来很好。谢谢。
    猜你喜欢
    • 2020-11-18
    • 2014-06-17
    • 1970-01-01
    • 2010-12-27
    • 2023-01-04
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多