如何在R中使用ksvm进行新颖性检测?

4

我正在尝试使用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")

上图是我得到的结果。蓝色曲线是预测值,它清晰地显示了一个持续为0的周期。但它与黑色曲线中的异常值在时间和宽度上并不匹配。有100个数据点(黑色曲线)的幅度更大,而我得到的蓝曲线输出与黑线不匹配。
我做错了什么?
1个回答

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

解释:通过指定byrow=T ,您首先取出x1的元素以填充前500行(或者列1和2),然后取出x2以填充xxTest 的其余500行。由于x2中的奇点在大约500-600左右,因此它出现在xxTest 的两列中,在(500+500)/2-(500+600)/2左右,即750-800左右,这就是你所看到的。

非常感谢您的答复,您为我节省了很多时间。 - siva82kb
我是偶然发现的——厌倦了重复命令,所以我写了一个一行代码(使用更短的代码,包括cbind等),突然它就起作用了 :-) - January

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接