如何在R中用ksvm进行新奇检测?

时间:2012-10-17 10:19:15

标签: r svm kernlab

我正在尝试使用R中的kernlab库(ksvm函数)来实现一个新颖的检测器。这是我想要做的一个简单示例:

# Training data
xxTrain <- matrix(rnorm(2000), nrow=1000, ncol=2, byrow=TRUE)
y <- rep(1,1000)
classifier <- ksvm(xxTrain, y, type="one-svc", kernel="rbfdot", kpar="automatic")
# Test data
x1 <- rnorm(1000)
scale <- c(rep(1,500), rep(10,100), rep(1,400))
x2 <- rnorm(1000)*scale
xxTest <- matrix(c(x1,x2), nrow=1000, ncol=2, byrow=TRUE)
# Prediction
p <- predict(classifier, xxTest, type="response")
# Visualization
plot(x2, type='l')
lines(x1, col="red")
points(5*as.integer(p), type='l', col="blue")

enter image description here

上图是我得到的结果。蓝色迹线是预测,它清楚地显示了一个时间段,其中它始终为0.但它在时间或宽度上与黑色迹线中的异常值不匹配。有100个点(黑色线)幅度较大,而我得到的蓝色输出与黑线不匹配。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

这是你做错了什么:

xxTest <- matrix(c(x1,x2), nrow=1000, ncol=2, byrow=TRUE)

这应该是

xxTest <- matrix(c(x1,x2), nrow=1000, ncol=2, byrow=F )

或更好

xxTest <- cbind( x1, x2 )

或只是

p <- predict( classifier, cbind( x1, x2 ), type= "response" )

结果(我使用灰色表示x2):

enter image description here

说明:通过specyfying byrow=T,您首先获取x1的元素以填充前500行(或者,第1列和第2列),然后使用x2来填充剩余的500行{{ 1}}。由于奇点在x2处约为500 - 600左右,然后它在xxTest的两列中出现在(500 + 500)/ 2 - (500 + 600)/ 2左右,即750-800,这是你能看到什么。