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

Why does R.predict.svm return a list of the wrong size?

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

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

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

我认为发生的事情是 R 类型提供程序推断出一些关于 predict 函数的参数名称的信息,但无法弄清楚第二个参数到底是什么 - 因此而不是提供它作为 newdata,它作为其他东西提供。