【问题标题】:K-Means clustering in R errorR错误中的K-Means聚类
【发布时间】:2018-02-10 15:21:22
【问题描述】:

我有一个在 R 中创建的数据集。它的结构如下:

> head(btc_data)
           Date btc_close eth_close vix_close gold_close DEXCHUS change
1647 2010-07-18      0.09        NA        NA         NA      NA      0
1648 2010-07-19      0.08        NA     25.97    115.730      NA     -1
1649 2010-07-20      0.07        NA     23.93    116.650      NA     -1
1650 2010-07-21      0.08        NA     25.64    115.850      NA      1
1651 2010-07-22      0.05        NA     24.63    116.863      NA     -1
1652 2010-07-23      0.06        NA     23.47    116.090      NA      1

我正在尝试使用 k-means 对观察结果进行聚类。但是,我收到以下错误消息:

> km <- kmeans(trainingDS, 3)
Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)
In addition: Warning message:
In storage.mode(x) <- "double" : NAs introduced by coercion 

这是什么意思?我是否错误地预处理数据?我能做些什么来修复它?我不能放弃 NA,因为在 4500 个初始观察结果中,如果我运行 complete cases,我只剩下 100 个观察结果。

基本上我希望基于change 列的值为-1,0,1 形成3 个集群。然后,我希望分析每个集群的组成部分,以找到最强的变化预测因子。还有哪些其他算法对此最有用?

我还尝试使用以下代码删除所有 NA 值,但仍然收到相同的错误消息:

> complete_cases <- btc_data[complete.cases(btc_data), ]
> km <- kmeans(complete_cases, 3, nstart = 20)
Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)
In addition: Warning message:
In storage.mode(x) <- "double" : NAs introduced by coercion

> sum(!sapply(btc_data, is.finite)) 
[1] 8008
> sum(sapply(btc_data, is.nan))
[1] 0
> 
> sum(!sapply(complete_cases, is.finite)) 
[1] 0
> sum(sapply(complete_cases, is.nan))
[1] 0

这是数据的格式:

> sapply(btc_data, class)
      Date  btc_close  eth_close  vix_close gold_close    DEXCHUS     change 
    "Date"  "numeric"  "numeric"  "numeric"  "numeric"  "numeric"   "factor" 

【问题讨论】:

  • &gt; sum(!sapply(btc_data, is.finite)) [1] 8008 &gt; sum(!sapply(btc_data, is.nan)) [1] 18193
  • @coffeinjunky 我编辑了这个问题....另外,我不知道为什么完整案例的 sum721 特别是因为只有 103 个观察结果...当我手动检查df 没有 NA 的
  • 好的-我删除了! 并编辑了问题...你的意思是knn 应该在complete_cases 上工作,但我仍然收到相同的错误消息
  • 好的,我添加了该信息
  • 酷。在这种情况下,日期列可能是罪魁祸首。

标签: r machine-learning k-means


【解决方案1】:

收到此错误消息的原因有多种,尤其是存在无效数据类型(NA、NaN、Inf)或日期时。让我们来看看它们:

但首先,让我们检查它是否适用于 mtcars 数据集,因为我将使用它:

kmeans(mtcars, 3)
K-means clustering with 3 clusters of sizes 9, 7, 16
--- lengthy output omitted

可能的问题1:无效的数据类型NA/NaN/Inf

df <- mtcars
df[1,1] <- NA
kmeans(df, 3)
Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)

df[1,1] <- Inf
kmeans(df, 3)
Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)

df[1,1] <- NaN
kmeans(df, 3)
Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)

您可以使用以下方法检查这些值:

df[1:3,1] <- c(NA, Inf, NaN) # one NA, one Inf, one NaN
sum(sapply(df, is.na))
[1] 2
sum(sapply(df, is.infinite))
[1] 1
sum(sapply(df, is.nan))
[1] 1

为了摆脱这些,我们可以删除相应的观察。但请注意complete.cases 不会删除Inf

complete_df <- df[complete.cases(df),]
sum(sapply(complete_df, is.infinite))
[1] 1

相反,使用例如

df[apply(sapply(df, is.finite), 1, all),]

您也可以重新分配这些值或估算它们,但这是一个完全不同的过程。

可能的问题二:日期:参见以下内容:

library(lubridate)
df <- mtcars
df$date <- seq.Date(from=ymd("1990-01-01"), length.out = nrow(df), by=1)
kmeans(df, 3)
Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)
In addition: Warning message:
In kmeans(df, 3) : NAs introduced by coercion

您可以通过排除日期或将日期转换为其他内容来解决此问题,例如

df$newdate <- seq_along(df$date)
df$date <- NULL
kmeans(df, 3)
K-means clustering with 3 clusters of sizes 9, 7, 16
---- lengthy output omitted

或者您可以尝试在将日期传递给kmeans之前自己将日期强制转换为数字:

df <- mtcars
df$date <- seq.Date(from=ymd("1990-01-01"), length.out = nrow(df), by=1)
df$date <- as.numeric(df$date)
kmeans(df, 3)
K-means clustering with 3 clusters of sizes 9, 16, 7
--- lengthy output omitted

【讨论】:

  • 我明白,但有两件事 - 当我删除 NA 时,数据是两个小。更重要的是,我运行了complete_cases,然后又运行了knn,但我仍然遇到同样的错误。
  • 如果您没有(足够的)数据,我们可以帮助您的确实不多。您可以尝试的唯一方法是输入您的数据而不是删除它。关于您的第二点,我无法对此发表评论,因为您尚未发布该代码或该错误消息。
【解决方案2】:

检查您要聚类的变量的数据类型。如果数据类型为非数字,则很可能会出现错误。还可以尝试在集群之前正确处理日期格式。

【讨论】:

  • 这并没有真正为一年前的现有和接受的答案添加任何内容。
【解决方案3】:

您是否在聚类中使用了“日期”列?

在使用 k-means 聚类时,您应该使用数值类型的数据。

试试这个,

btc_data$Date = as.numeric(gsub("-", "", as.character(btc_data$Date)))

【讨论】:

  • 不需要gsub/as.character,只要as.numeric(btc_data$Date)就行了。
猜你喜欢
  • 2013-02-07
  • 2018-04-05
  • 2017-08-18
  • 2020-08-27
  • 2015-04-11
  • 2015-05-29
  • 2018-04-22
  • 2019-12-18
  • 2011-08-13
相关资源
最近更新 更多