2017-01-28 2 views
1

Я ищу 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) 
+0

Вы можете просто сортировать данные так, что последние несколько строк выпадающие? И классификатор может дать вам предсказанный класс, считать, что вектор и результаты вектор, сравнить результаты, и у вас есть ваша матрица замешательства. –

+0

Извините, но что вы имеете в виду, сортируя данные? Они находятся в 2d, высокое значение в одном из двух измерений не означает, что оно является выбросом. – MomoMI

+0

Какие выбросы вы можете просто добавить точки, такие как x = 3, y = 3, или вы хотите, чтобы точки, которые примерно соответствовали вашему распределению, были немного слишком далеки. – G5W

ответ

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

+0

Спасибо большое. Если бы я предпочитал иметь менее линейную форму, и я изменил соотношение между X и Y, я бы установил шум, генерируемый rnorm (n, 0,1), по-другому? Я имею в виду, как я могу настроить шум? И какова разница в зависимости от X/Y? – MomoMI

+0

Я добавлю некоторые детали ответа. – G5W

+0

Было бы здорово. Я попытался изменить функциональные отношения с гиперболой, но результат выглядит как случайное облако без формы. Я полагаю, что это связано со средним значением и sd rnorm. – MomoMI

Смежные вопросы