我试图使用R类型提供程序来拟合和预测支持向量机模型。我成功地拟合了模型,但当我尝试预测时,返回的向量与训练向量长度相同,这显然是不正确的。
我直接在R中运行了等效的代码,返回的列表长度是正确的。
为什么会发生这种情况?
这里是一个例子:
open Systemopen RDotNetopen RProvideropen RProvider.statsopen RProvider.e1071// 随机数生成器let rng = Random()let rand () = rng.NextDouble()// 生成假的X1和X2 let X1s = [ for i in 0 .. 9 -> 10. * rand () ] // 长度 = 10let X2s = [ for i in 0 .. 9 -> 5. * rand () ] // 长度 = 10let Z1s = [ for i in 0 .. 5 -> 10. * rand () ] // 长度 = 6let Z2s = [ for i in 0 .. 5 -> 5. * rand () ] // 长度 = 6// 构建Yslet Ys = [0;1;0;1;0;1;0;1;0;1]let XMat = ["X1", box X1s; "X2", box X2s] |> namedParams |> R.cbindlet ZMat = ["Z1", box Z1s; "Z2", box Z2s] |> namedParams |> R.cbindlet svm_model = ["x", box XMat; "y", box Ys ; "type", box "C"; "gamma", box 1.0] |> namedParams |> R.svmlet 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.Typeprintfn "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)// 随机数生成器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
提供,而是作为其他东西提供的。