2017-10-17 85 views
1

我正在嘗試使用R型提供程序來擬合和預測支持向量機模型。我能夠擬合模型,但是當我嘗試預測返回的矢量與訓練矢量具有相同的長度時,它不應該有這個長度。爲什麼R.predict.svm返回錯誤大小的列表?

我在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 
+3

你的原始R代碼是什麼樣的? –

+0

我添加了R代碼。感謝您的關注。 – Soldalma

+0

我發現'let svm_predict = R.predict(svm_model,ZMat)'中的第二個參數是不相關的。無論我輸入什麼,結果都是一樣的。即使我忽略了這個論點。 – Soldalma

回答

2

我懷疑傳遞參數給R.predict功能時遇到的問題可能。我不是支持向量機的專家,所以我不知道是什麼結果應該給,但是當我把它稱爲如下,我看到類似的[R版本的結果:

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

我想什麼繼續是R型提供者推斷一些關於predict函數的參數名稱的信息,但是不能確切地確定第二個參數是什麼 - 所以不是將其作爲newdata提供,而是將其作爲別的東西提供。

+0

數百萬的感謝!我卡住了。我實際上已經嘗試過類似的方法,但是我沒有在'svm_model'之前放置'box'。我假設,因爲'svm_model'是'SymbolicExpression'類型的類型,所以沒有必要。第二個想法是,顯然所有傳遞給'namedParams'的元組必須具有相同的類型,即'string * obj'。 – Soldalma

相關問題