2017-02-18 5 views
1

/! \ F # бренд новичок /! \Функция работает без прохождения параметров

У меня есть этот код

#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) 

Который дает мне результат

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 

Как это возможно это SimpleLinearRegression функция работает но мы даже не передаем его x и y?

Можете ли вы указать мне ссылку, чтобы понять, что это за F # магия за этим?

+3

'SimpleLinearRegression' - это не функция, а конструктор классов. Сначала вы создаете объект этого класса, даете ему имя 'regression', а затем вызываете метод' Regress' на нем - 'regression.Regress (x, y)' - вот где вы передаете аргументы. –

ответ

2

Я предполагаю, что вы используете F-Sharp Interactive и отправляете весь код FSI одним махом.

Магия в том, что сначала выполняется код, затем результаты записываются. Даже если последовательность выходов «val» получает бит счетчик интуитивно понятным таким образом.

Я могу проиллюстрировать этот пример (для будущих читателей):

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

, который дает этот вывод в FSI:

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

уведомление как a обновляется до конечного значения перед печатью (мы даже не видим 1 и 2, хотя это значения a после строк 1 и 2 соответственно).

 Смежные вопросы

  • Нет связанных вопросов^_^