我有一个大约有1万个点的数据集,每个点都有200个数字描述符。 在这10K点中,我想定位离群值,我将其定义为离其最近的10个近邻较远的离群值(距离多远?与第10个近邻的距离就等于离第10个邻点的其他距离) ,离群值则照常定义。)
我尝试计算整个距离矩阵(10K x 10K),对每一行应用部分排序以查找10个最近的邻居。太贵了。
我还检查了快速kNN选项,但它们也太昂贵了。
我认为可以更有效地完成此操作的原因是,我们并不真正在乎实际距离,而只是在乎它们的相对等级。
可以如下生成样本数据矩阵:
df = matrix(rnorm(2000000), nrow = 10000, ncol = 200)
有创意吗?
答案 0 :(得分:1)
编辑
我使用Java实现在计算机(I7-4790)上进行了一些性能测试:数据集具有10K点和200个维度(点略有聚集,每个维度在0.0和1.0之间)。
答案 1 :(得分:0)
这是个主意, 尽管我怀疑它是否适用于随机数据。
# primarily for lag and lead
library(dplyr)
# sample data
df <- mtcars %>%
select(mpg, disp, drat, wt, qsec) %>%
do(as.data.frame(scale(.))) %>%
filter_all(all_vars(!duplicated(.)))
knn <- 4L
distance <- 0.3
colwise_outlier <- sapply(1L:ncol(df), function(j) {
column <- df[, j]
order_ids <- order(column)
column <- column[order_ids]
n <- (knn + 2L) %/% 2L
outlier <- column - lag(column, n=n, default=-Inf) > distance &
lead(column, n=n, default=Inf) - column > distance
# return with original order
outlier[order_ids]
})
is_outlier <- apply(colwise_outlier, 1L, function(r) {
Reduce("&", r)
})
outliers <- df[is_outlier,]
它的作用是首先隔离检查每一列,
并且仅当最多knn
个值在其distance
之内时才将该行标记为异常值。
然后,仅在所有列中都满足此条件的行中保存。
编辑:甚至可以为每列设置不同的distance
值,
以防您的数据未规范化。