我正在尝试使用R类型提供程序来拟合和预测支持向量机模型。我能够适应模型,但是当我试图预测返回的矢量与训练矢量具有相同的长度时,它不应该具有。
我在R中直接尝试了等效代码,返回的列表长度正确。
为什么会这样?
以下是一个例子:
open System
open RDotNet
open RProvider
open RProvider.stats
open RProvider.e1071
// Random number generator
let rng = Random()
let rand () = rng.NextDouble()
// Generate fake X1 and X2
let X1s = [ for i in 0 .. 9 -> 10. * rand () ] // length = 10
let X2s = [ for i in 0 .. 9 -> 5. * rand () ] // length = 10
let Z1s = [ for i in 0 .. 5 -> 10. * rand () ] // length = 6
let Z2s = [ for i in 0 .. 5 -> 5. * rand () ] // length = 6
// Build Ys
let Ys = [0;1;0;1;0;1;0;1;0;1]
let XMat =
["X1", box X1s; "X2", box X2s]
|> namedParams
|> R.cbind
let ZMat =
["Z1", box Z1s; "Z2", box Z2s]
|> namedParams
|> R.cbind
let svm_model =
["x", box XMat; "y", box Ys ; "type", box "C"; "gamma", box 1.0]
|> namedParams
|> R.svm
let svm_predict = R.predict(svm_model, ZMat)
let res =
if svm_predict.Type = RDotNet.Internals.SymbolicExpressionType.IntegerVector then
svm_predict.AsInteger()
|> List.ofSeq
else failwithf "Expecting a Numeric but got a %A" svm_predict.Type
printfn "The predicted values are: %A" res
// The predicted values are: [1; 2; 1; 2; 1; 2; 1; 1; 1; 2]
这是原始的R代码:
library(stats)
library(e1071)
// Random number generator
x1 <- 10 * rnorm(10)
x2 <- 5 * rnorm(10)
x = cbind(x1, x2)
z1 <- 10 * rnorm(5)
z2 <- 5 * rnorm(5)
z = cbind(z1, z2)
zs <- c(0,1,0,1,0,1,0,1,0,1)
svm_fit = svm(x=x,y=zs,type="C",gamma=1.0)
svm_pred = predict(svm_fit, z)
print(svm_pred)
1 2 3 4 5
1 0 1 1 1
Levels: 0 1
答案 0 :(得分:2)
我怀疑将参数传递给R.predict
函数时可能会出现问题。我不是SVM专家,所以我不确定这应该给出的结果是什么,但是当我按如下方式调用它时,我得到的结果类似于你的R版本:
let svm_predict =
namedParams ["object", box svm_model; "newdata", box ZMat ]
|> R.predict
我认为正在发生的事情是R类型提供程序推断出有关predict
函数的参数名称的一些信息,但是无法确切地知道第二个参数是什么 - 而是而不是将其作为newdata
提供,它将其作为其他内容提供。