【问题标题】:How can I perform novelty detection with ksvm in R?如何在 R 中使用 ksvm 执行新颖性检测?
【发布时间】:2012-10-07 13:55:48
【问题描述】:

我正在尝试使用 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个幅度较大的点(黑线),我得到的蓝色输出与黑线不匹配。

我做错了什么?

【问题讨论】:

    标签: r svm kernlab


    【解决方案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):

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

    【讨论】:

    • 非常感谢您的回答。你为我节省了很多时间。
    • 我偶然发现了它——厌倦了重复命令,所以我制作了一个单行器(使用更短的代码,cbind 等),突然它起作用了:-)
    猜你喜欢
    • 2015-08-29
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    相关资源
    最近更新 更多