2017-10-17 5 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)'の第2引数が無関係であることを発見しました。そこに何を入力しても結果は同じです。私が議論を省略したとしても。 – Soldalma

答えて

2

私はR.predict関数にパラメータを渡す際に問題があるかもしれないと思います。私はSVMの上の専門家ではないので、私はこれが与える必要があり、結果が何であるかわからないんだけど、次のように私はそれを呼び出すときに、私はあなたのRのバージョンと同様の結果を得る:

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

私は何だと思いますR型プロバイダがpredict関数のパラメータ名に関する情報を推測するが、第2パラメータが何であるかを正確に把握することができないため、newdataとして提供するのではなく、別のものとして提供する。

+0

何百ものありがとう!私は立ち往生しました。私は実際に何か同様のことをしようとしましたが、 'svm_model'の前に' box'を置いていませんでした。私は 'svm_model'が' SymbolicExpression'型の型であるため、必要ではないと仮定していました。 2番目の考えでは、 'namedParams'に渡されたタプルはすべて同じ型、つまり' string * obj'でなければなりません。 – Soldalma

関連する問題