2017-07-24 46 views
3

问题删除多元离群值mvoutlier

我有在任何时间> 5个变量的组成一个数据帧,我试图做的是K均值。由于K-Means很大程度上受到异常值的影响,因此我一直试图寻找几个小时来计算和删除多变量异常值。大多数的例子都有两个变量。


可能的解决方案探讨的

问题迄今

关于mvoutlier,我无法产生一个结果,因为它注意到我的数据集所包含的底片并不能因为这个工作。我不知道如何改变我的数据,只有积极的因为我需要底片我正在使用的集合。

关于另一种孤立点检测方法我能够拿出一个异常值列表,但我不确定如何从当前数据集中排除它们。另外,我知道这些计算是在K-Means之后完成的,因此我可能会在做K-Means之前应用这个数学。


最小可验证例

不幸的是,我使用的数据集禁地要显示给任何人,所以你需要任何随机数据超过3集变量。下面的代码是从另一种异常值检测方法后转换为我的数据工作的代码。它也应该动态工作,如果你有一个随机数据集。但也应该有足够的数据,其中聚类中心量应该不会介意的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-均值之前,排除那些行?

回答

1

我不知道这是否有帮助,但如果您的数据是多变量正常的,您可能需要尝试基于Wilks(1963)的方法。 Wilks表明多变量正态数据的马氏距离遵循Beta分布。我们可以把这个(作为例子虹膜萼片数据)的优势:

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 

然后我们可以简单地发现,我们的多元数据的行是从β分布显著不同。

outliers <- which(dat.rows[,"p"] < 0.05) 

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

outliers

+0

尼斯的答案。但是我们怎么能知道这150个变量是多元正态分布的呢?否则,是否有将多元分布重塑为正常的转变? – Seymour

+1

这是一个很棒的交叉验证问题。请参阅以下内容:[多变量分布](https://stats.stackexchange.com/questions/187460/multivariate-distribution) [如何检测给定数据集是否具有多变量正态分布?](https:// stats.stackexchange.com/questions/41348/how-do-you-detect-if-a-given-dataset-has-multivariate-normal-distribution) 此外,如果您正在查看150个变量的数据集,请检查多重共线性。 [推导ols估计量的假设](https://stats.stackexchange.com/questions/149110/assumptions-to-derive-ols-estimator/149111#149111) –

+0

谢谢。我在聚类的背景下,因此第二个环节超出了范围,对吧? – Seymour