模拟异常值和非线性数据以测试一类分类器

时间:2017-01-28 19:24:43

标签: r classification

我正在寻找一个R代码/软件包来模拟带有异常值的非线性数据,以便测试一些单类分类器算法。

我发现这段代码创建了一个香蕉形数据集。这是非常好的,因为我的真实数据在2d看起来像双曲线。 但我需要一个数据集,其中标记了所有异常值,这样我就可以打印混淆矩阵并评估模型的性能。 它不一定要看起来像这样。最重要的是非线性。

提前致谢。

banana=function(A,B,C1,C2,N,keep=10,init=10)
{
R=init*keep+N*keep
x1=x2=0
bimat=matrix(double(2*N),ncol=2)
for (r in 1:R) {
    x1=rnorm(1,mean=(B*x2+C1)/(A*(x2^2)+1),sd=sqrt(1/(A*(x2^2)+1)))
    x2=rnorm(1,mean=(B*x2+C2)/(A*(x1^2)+1),sd=sqrt(1/(A*(x1^2)+1)))
    if (r>init*keep && r%%keep==0) {
        mkeep=r/keep; bimat[mkeep-init,]=c(x1,x2)
    }
}

return(bimat)
}

# usage
set.seed(66)
nvar2=2
A=0.5; B=0; C1=C2=3
y2=banana(A=A,B=B,C1=C1,C2=C2,1000)

1 个答案:

答案 0 :(得分:1)

这是一种方法。想法是生成数据,其中y是x的非线性函数加上一些噪声。当你想要异常值时,使用相同的生成过程,除了强制噪声“大”。你可以调整“大意味着什么。”

NonLinear = function(n) {
    x = rnorm(n, 5, 1)
    y = (x-3)^3/10 + rnorm(n,0,1)
    data.frame(x,y)
}
plot(NL)

NL_Outliers = function(n, Lower, Upper) {
    x = rnorm(n, 5, 0.8)
    y = (x-3)^3/10 + 
        sample(c(-1,1), 10, replace=TRUE) * runif(n, Lower, Upper)
    data.frame(x,y)
}

NL = NonLinear(200)
plot(NL, ylim=c(-4,10))
NLO = NL_Outliers(10, 3.2, 4.5)
points(NLO, pch=20, col="red")

Nonlinear data with tuned outliers