2017-02-18 6 views
1

/! \ F # Marke Neuling /! \Funktion arbeitet, ohne die Parameter übergeben

Ich habe diesen Code

#r @"..\packages\Accord.3.4.0\lib\net40\Accord.dll" 
#r @"..\packages\Accord.Statistics.3.4.0\lib\net40\Accord.Statistics.dll" 
#r @"..\packages\Accord.Math.3.4.0\lib\net40\Accord.Math.dll" 

open Accord 
open Accord.Statistics.Models.Regression.Linear 

let input = [|1,1.;2,2.;3,2.25;4,4.75;5,5.|] 

let x = input |> Array.map(fun (x,y) -> float x) 
let y = input |> Array.map(fun (x,y) -> y) 
let regression = SimpleLinearRegression() 

let sse = regression.Regress(x,y) 
let intercept = regression.Intercept 
let slope = regression.Slope 
let mse = sse/float x.Length 
let rmse = sqrt mse 
let r2 = regression.CoefficientOfDetermination(x,y) 

Was mich das Ergebnis

val input : (int * float) [] = [|(1, 1.0); (2, 2.0); (3, 2.25); (4, 4.75); (5, 5.0)|] 
val x : float [] = [|1.0; 2.0; 3.0; 4.0; 5.0|] 
val y : float [] = [|1.0; 2.0; 2.25; 4.75; 5.0|] 
val regression : SimpleLinearRegression = y(x) = 1,075x + -0,224999999999998 
val sse : float = 1.06875 
val intercept : float = -0.225 
val slope : float = 1.075 
val mse : float = 0.21375 
val rmse : float = 0.4623310502 
val r2 : float = 0.9153465347 

Wie gibt, ist, dass möglich, dass SimpleLinearRegression Funktion funktioniert, aber wir nicht einmal x und y übergeben?

Können Sie mich auf eine Referenz verweisen, um zu verstehen, was ist das F # Magie dahinter?

+3

'SimpleLinearRegression' ist keine Funktion, sondern ein Klassenkonstruktor. Zuerst konstruierst du ein Objekt dieser Klasse, gib ihm den Namen Regression und rufe dann die Methode Regress auf - Regression.Regress (x, y) - hier gibst du die Argumente weiter. –

Antwort

2

Ich schätze, Sie verwenden die F-Sharp Interactive und senden den gesamten Code auf einen Schlag an FSI.

Die Magie ist, dass der Code zuerst ausgeführt wird, dann werden die Ergebnisse geschrieben. Selbst wenn die Sequenz von 'val'-Ausgaben auf diese Weise ein bisschen entgegengesetzt wird.

Ich kann mit diesem Beispiel veranschaulichen (für zukünftige Leser):

let mutable a = 1 
let f = a <- 2; fun() -> 3 
do a <- f() 

, die diese Ausgabe in FSI gibt:

val mutable a : int = 3 
val f : (unit -> int) 
val it : unit =() 

merken, wie a auf ihren Endwert aktualisiert wird, bevor gedruckt wird (wir sehen nicht einmal 1 und 2, obwohl das die Werte von a nach Zeile eins bzw. zwei sind).

Verwandte Themen