13

我一直在到处寻找使用 R 识别多元异常值的最佳方法,但我认为我还没有找到任何可信的方法。

我们可以以虹膜数据为例,因为我的数据也包含多个字段

data(iris)
df <- iris[, 1:4] #only taking the four numeric fields

首先,我使用与图书馆 MVN 的Mahalanobis 距离

library(MVN)
result <- mvOutlier(df, qqplot = TRUE, method = "quan") #non-adjusted
result <- mvOutlier(df, qqplot = TRUE, method = "adj.quan") #adjusted Mahalonobis distance

两者都导致了大量的异常值(150 个中的 50 个为未调整的,49/150 个为调整的),我认为这需要更多改进。不幸的是,我似乎无法在 mvOutlier 方法中找到一个变量来设置阈值(说增加一个点成为异常值的概率,以便我们有一个较小的数字)

其次,我使用了异常值库。这是为了找到单变量异常值。所以,我的计划是在数据的每个维度上找到异常值,并且那些在所有维度上都是异常值的点被视为数据集的异常值。

library(outliers)
result <- scores(df, type="t", prob=0.95) #t test, probability is 0.95
result <- subset(result, result$Sepal.Length == T & result$Sepal.Width == T & result$Petal.Length == T & result$Petal.Width == T)

为此我们可以设置概率,但我认为它不能代替多元异常值检测。

我尝试过的其他一些方法

  • 库(mvoutlier):这仅显示情节。很难自动找到异常值。而且我不知道如何将概率添加到这个
  • 厨师距离(链接):一个人说他使用了厨师距离,但我认为没有任何强有力的学术证据证明这是可以的。
4

2 回答 2

5

我会给你这两个链接,第一个是关于多元异常值检测的不同方法的论文,而第二个是研究如何在 R 中实现这些。

库克距离是查看数据点影响的有效方法,因此有助于检测离群点。马氏距离也经常使用。

对于您的测试示例,虹膜数据集没有用。它用于分类问题,因为它显然是可分离的。您排除 50 个数据点将摆脱整个物种。

多元数据中的异常值检测-

http://www.m-hikari.com/ams/ams-2015/ams-45-48-2015/13manojAMS45-48-2015-96.pdf

R 实现

http://r-statistics.co/Outlier-Treatment-With-R.html

于 2017-01-04T11:21:51.150 回答
0

有非常有趣的选择。

第一个是Rlof包,它计算局部异常值因子。它计算反映观察异常程度的分数(称为局部异常值因子)。它测量一个点的局部密度相对于其邻居的偏差。这个想法是检测密度大大低于其邻居的样本。在实践中,局部密度是从 k 个最近的邻居中获得的。

二、孤独包。

它应用了一种名为 Isolation Forest 的随机森林启发方法。

两者都生成不同的分数,这不是概率,但允许确定分配问题类型和主题知识认为合适的异常数据数量的阈值。

于 2021-04-15T04:54:19.060 回答