【问题标题】:Removing Multivariate Outliers With mvoutlier使用 mvoutlier 去除多元异常值
【发布时间】:2017-12-30 13:10:55
【问题描述】:

问题

我有一个随时由 > 5 个变量组成的数据框,我正在尝试对其进行 K-Means。因为 K-Means 受异常值的影响很大,所以我一直在尝试寻找几个小时来了解如何计算和删除多元异常值。演示的大多数示例都有 2 个变量。


探索可能的解决方案

迄今为止的问题

关于 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 之前排除这些行?

【问题讨论】:

    标签: r k-means outliers


    【解决方案1】:

    我不知道这是否真的有帮助,但如果您的数据是多元正态的,您可能想尝试基于 Wilks (1963) 的方法。 Wilks 表明多元正态数据的马氏距离服从 Beta 分布。我们可以利用这一点(以鸢尾花 Sepal 数据为例):

    test.dat <- iris[,-c(1,2))]
    
    Wilks.function <- function(dat){
      n <- nrow(dat)
      p <- ncol(dat)
      # beta distribution
      u <- n * mahalanobis(dat, center = colMeans(dat), cov = cov(dat))/(n-1)^2
      w <- 1 - u
      F.stat <- ((n-p-1)/p) * (1/w-1) # computing F statistic
      p <- 1 - round( pf(F.stat, p, n-p-1), 3) # p value for each row
      cbind(w, F.stat, p)
    }
    
    plot(test.dat, 
         col = "blue", 
         pch = c(15,16,17)[as.numeric(iris$Species)])
    
    dat.rows <- Wilks.function(test.dat); head(dat.rows)
    #                 w    F.stat     p
    #[1,] 0.9888813 0.8264127 0.440
    #[2,] 0.9907488 0.6863139 0.505
    #[3,] 0.9869330 0.9731436 0.380
    #[4,] 0.9847254 1.1400985 0.323
    #[5,] 0.9843166 1.1710961 0.313
    #[6,] 0.9740961 1.9545687 0.145
    

    然后我们可以简单地找出我们的多元数据的哪些行与 beta 分布有显着差异。

    outliers <- which(dat.rows[,"p"] < 0.05)
    
    points(test.dat[outliers,], 
           col = "red", 
           pch = c(15,16,17)[as.numeric(iris$Species[outliers])])
    

    【讨论】:

    • 不错的答案。但是我们怎么知道这 150 个变量是否是多元正态分布的呢?否则,是否有将多元分布重塑为正态分布的转换?
    • 这是一个很好的交叉验证问题。请参阅以下部分内容:Multivariate distributionHow do you detect if a given dataset has multivariate normal distribution? 此外,如果您正在查看包含 150 个变量的数据集,请检查多重共线性。 assumptions to derive ols estimator
    • 谢谢。我在集群的上下文中,因此第二个链接超出了范围,对吗?
    • 我进行了快速搜索,因为我对聚类方法不太了解,但似乎有些人说是,有些人说不——是否删除一些相关变量。我会在这里放一些:12——我基本上用谷歌搜索了“集群是否受多重共线性影响”——抱歉,我无法提供更多帮助
    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    相关资源
    最近更新 更多