作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望在应用模型之前删除异常值。我正在使用一条Loess曲线来划定趋势线,并设置了离群值极限。我想删除超出定义限制的行。除了使用自定义功能来做到这一点之外,该功能一次获取每个点并检查本地的黄土坡度等...还有更简单的方法吗?
# Code generating image above
scatter.smooth( idam$T_d, idam$T_x10d)
loessline <- loess.smooth( idam$T_d, idam$T_x10d)
lines(loessline$x, loessline$y, lwd=3)
lines(loessline$x, loessline$y*1.2, lwd=3, col='red')
lines(loessline$x, loessline$y/1.2, lwd=3, col='red')
最佳答案
可以使用DBSCAN R包(用于群集识别的著名算法)来检测异常值(有关更多详细信息,请参见WIKIPEDIA)。
此功能具有三个重要输入:
mtcars
数据集的示例,以显示如何使用
dbscan
识别异常值。请注意,我的示例将使用出色的
data.table
包而不是经典的
data.frame
。
require(data.table)
require(ggplot2)
require(dbscan)
data(mtcars)
dt_mtcars <- as.data.table(mtcars)
# based on rawr's approach
plot(wt~mpg, data=dt_mtcars)
lo <- loess.smooth(dt_mtcars[,mpg], dt_mtcars[,wt])
lines(lo$x,lo$y, lwd=3)
lines(lo$x,lo$y * 1.2, lwd=3 , col=2 )
lines(lo$x,lo$y / 1.2, lwd=3 , col=2 )
eps
和
k
,这是标识集群的必要点数:
res_knn = kNNdist( dt_mtcars[, .(wt, mpg)] , k = 10)
dim_knn = dim(res_knn)
x_knn = seq(1, dim_knn[1])
ggplot() +
geom_line( aes( x = x_knn , y = sort(res_knn[, 1]) , col = 1 ) ) +
geom_line( aes( x = x_knn , y = sort(res_knn[, 2]) , col = 2 ) ) +
geom_line( aes( x = x_knn , y = sort(res_knn[, 3]) , col = 3 ) ) +
geom_line( aes( x = x_knn , y = sort(res_knn[, 4]) , col = 4 ) ) +
geom_line( aes( x = x_knn , y = sort(res_knn[, 5]) , col = 5 ) ) +
geom_line( aes( x = x_knn , y = sort(res_knn[, 6]) , col = 6 ) ) +
geom_line( aes( x = x_knn , y = sort(res_knn[, 7]) , col = 7 ) ) +
geom_line( aes( x = x_knn , y = sort(res_knn[, 8]) , col = 8 ) ) +
geom_line( aes( x = x_knn , y = sort(res_knn[, 9]) , col = 9 ) ) +
geom_line( aes( x = x_knn , y = sort(res_knn[, 10]) , col = 10 ) ) +
xlab('sorted results') +
ylab('kNN distance')
k
因子敏感,但是用于分离离群值的准确
eps
值位于曲线的膝盖部分==>合适的
eps
位于2到4之间。
k
,必须定义一个折衷方案,知道k越低,结果的严格性就越低。
eps = 3
(基于视觉估计)和
k = 4
对dbscan进行参数设置,以得到稍微严格的结果。我们将在rawr的代码的帮助下绘制这些结果:
eps = 3
k = 4
res_dbscan = dbscan( dt_mtcars[, .(wt, mpg)] , eps , k )
plot(wt~mpg, data=dt_mtcars, col = res_dbscan$cluster)
lo <- loess.smooth(dt_mtcars[res_dbscan$cluster>0,mpg], dt_mtcars[res_dbscan$cluster>0,wt])
lines(lo$x,lo$y, lwd=3)
lines(lo$x,lo$y * 1.2, lwd=3 , col=2 )
lines(lo$x,lo$y / 1.2, lwd=3 , col=2 )
mpg = [10,13]
中的点被认为是离群值。
mtcars
是一个多维数据集,其中变量之间的关系可能是线性的(或不是线性的)...为了评估这一点,我们可以对该数据集进行散点图处理,例如对数值进行过滤
pairs(dt_mtcars[, .(mpg, disp, hp, drat, wt, qsec)])
wt ~ mpg
,我们可能会乍一看认为这是一种反线性关系。但是对于其他绘制的关系,情况可能并非如此,在N-Dim环境中查找异常值比较棘手。实际上,在进行特定的2D比较投影时,一个点可能被认为是离群值...但是,如果添加新的比较维度,则相反。确实,我们可能具有可以被识别的共线性,因此是否可以增强聚类关系。
if
,为了说明这种情况,我们将对
dbscan
的数值进行
mtcars
分析。
res_knn = kNNdist( dt_mtcars[, .(mpg, disp, hp, drat, wt, qsec)] , k = 10)
dim_knn = dim(res_knn)
x_knn = seq(1, dim_knn[1])
ggplot() +
geom_line( aes( x = x_knn , y = sort(res_knn[, 1]) , col = 1 ) ) +
geom_line( aes( x = x_knn , y = sort(res_knn[, 2]) , col = 2 ) ) +
geom_line( aes( x = x_knn , y = sort(res_knn[, 3]) , col = 3 ) ) +
geom_line( aes( x = x_knn , y = sort(res_knn[, 4]) , col = 4 ) ) +
geom_line( aes( x = x_knn , y = sort(res_knn[, 5]) , col = 5 ) ) +
geom_line( aes( x = x_knn , y = sort(res_knn[, 6]) , col = 6 ) ) +
geom_line( aes( x = x_knn , y = sort(res_knn[, 7]) , col = 7 ) ) +
geom_line( aes( x = x_knn , y = sort(res_knn[, 8]) , col = 8 ) ) +
geom_line( aes( x = x_knn , y = sort(res_knn[, 9]) , col = 9 ) ) +
geom_line( aes( x = x_knn , y = sort(res_knn[, 10]) , col = 10 ) ) +
xlab('sorted results') +
ylab('kNN distance')
wt ~ mpg
进行的分析相比,我们可以看到
kNNdist(...)
产生了更为重要的kNN距离(例如,直到200带有
k = 10
为止)。但是,我们还有膝盖部分,可以帮助我们估计合适的
eps
值。
eps = 75
和
k = 5
以及
# optimal eps value is between 40 (k=1) and 130 (k=10)
eps = 75
k = 5
res_dbscan = dbscan( dt_mtcars[, .(mpg, disp, hp, drat, wt, qsec)] , eps , k )
pairs(dt_mtcars[, .(mpg, disp, hp, drat, wt, qsec)] , col = res_dbscan$cluster+2L)
wt ~ mpg
获得的结果
关于r - 删除超出黄土曲线极限的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26801242/
如何限制 Realm 返回的对象数量? .findAll 返回匹配查询的所有行,而 .findFirst 只返回第一行。但是像前 1000 这样的东西呢? .findAll 可能会返回太多的行,以至于
SELECT * FROM table WHERE city LIKE example ORDER by RAND() Limit 10 我正在尝试从表中返回一些随机条目,但它在相当多的页面上被点击
我是一名优秀的程序员,十分优秀!