在R中进行K-Means聚类的错误

我已经在R中创建了一个数据集,其结构如下:

> head(btc_data)           Date btc_close eth_close vix_close gold_close DEXCHUS change1647 2010-07-18      0.09        NA        NA         NA      NA      01648 2010-07-19      0.08        NA     25.97    115.730      NA     -11649 2010-07-20      0.07        NA     23.93    116.650      NA     -11650 2010-07-21      0.08        NA     25.64    115.850      NA      11651 2010-07-22      0.05        NA     24.63    116.863      NA     -11652 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" 

回答:

导致此错误信息的原因有很多,特别是在存在无效数据类型(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 <- mtcarsdf[1,1] <- NAkmeans(df, 3)Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)df[1,1] <- Infkmeans(df, 3)Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)df[1,1] <- NaNkmeans(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 NaNsum(sapply(df, is.na))[1] 2sum(sapply(df, is.infinite))[1] 1sum(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),]

你也可以重新分配这些值或进行插补,但这是一个完全不同的过程。

可能的问题II:日期:请看以下内容:

library(lubridate)df <- mtcarsdf$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 <- NULLkmeans(df, 3)K-means clustering with 3 clusters of sizes 9, 7, 16---- lengthy output omitted

或者你可以在传递给kmeans之前自己将日期强制转换为数值类型:

df <- mtcarsdf$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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注