【发布时间】:2017-12-30 13:10:55
【问题描述】:
问题
我有一个随时由 > 5 个变量组成的数据框,我正在尝试对其进行 K-Means。因为 K-Means 受异常值的影响很大,所以我一直在尝试寻找几个小时来了解如何计算和删除多元异常值。演示的大多数示例都有 2 个变量。
探索可能的解决方案
mvoutlier - 善良的用户在这里注意到 mvoutlier 可能是我需要的。
Another Outlier Detection Method - 此处的海报评论了混合 R 函数以生成异常值的有序列表。
迄今为止的问题
关于 mvoutlier,我无法生成结果,因为它注意到我的数据集包含负数,因此无法工作。我不确定如何将我的数据更改为仅正数,因为我正在使用的集合中需要负数。
关于另一种异常值检测方法我能够提出异常值列表,但不确定如何将它们从当前数据集中排除。另外,我知道这些计算是在 K-Means 之后完成的,因此我可能会在做 K-Means 之前应用数学。
最小可验证示例
不幸的是,我使用的数据集禁止向任何人展示,因此您需要的是任何包含 3 个以上变量的随机数据集。下面的代码是从 Another Outlier Detection Method 帖子转换的代码,用于处理我的数据。如果您也有随机数据集,它应该动态工作。但它应该有足够的数据,其中集群中心数量应该是 5 就可以了。
clusterAmount <- 5
cluster <- kmeans(dataFrame, centers = clusterAmount, nstart = 20)
centers <- cluster$centers[cluster$cluster, ]
distances <- sqrt(rowSums(clusterDataFrame - centers)^2)
m <- tapply(distances, cluster$cluster, mean)
d <- distances/(m[cluster$cluster])
# 1% outliers
outliers <- d[order(d, decreasing = TRUE)][1:(nrow(clusterDataFrame) * .01)]
输出: 我相信的异常值列表按离他们所在中心的距离排序。然后的问题是将这些结果与数据框中的相应行配对并删除它们,以便我可以开始我的 K-Means 程序。 (请注意,虽然在示例中我在移除异常值之前使用了 K-Means,但我会确保采取必要的步骤并在 K-Means 解决方案之前移除异常值)。
问题
有了另一种异常值检测方法示例,我如何将结果与当前数据框中的信息配对以在执行 K-Means 之前排除这些行?
【问题讨论】: