为什么R.predict.svm返回错误大小的列表?

时间:2017-10-17 19:13:55

标签: r machine-learning f# svm

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

1 个答案:

答案 0 :(得分:2)

我怀疑将参数传递给R.predict函数时可能会出现问题。我不是SVM专家,所以我不确定这应该给出的结果是什么,但是当我按如下方式调用它时,我得到的结果类似于你的R版本:

let svm_predict = 
  namedParams ["object", box svm_model; "newdata", box ZMat ]
  |> R.predict 

我认为正在发生的事情是R类型提供程序推断出有关predict函数的参数名称的一些信息,但是无法确切地知道第二个参数是什么 - 而是而不是将其作为newdata提供,它将其作为其他内容提供。