2015-06-27 3 views
0

Я работаю через функцию F #, которая вычисляет дисперсию. Я пытаюсь пройти через каждую итерацию, чтобы получить правильный ответ, но думаю, что я получаю оттуда что-то, потому что я продолжаю получать неправильный ответ. Может кто-то пожалуйста погулять я через одну итерацию этой функции, чтобы вернуть меня на трассеf # calc variance function

let variance values 
    let average = Seq.average values 
    let length = Seq.length values 

    values 
    |> Seq.map (fun x -> 1.0/float length * (x - average) ** 2.0) 
    |> Seq.sum 

вызов variance [1.0..6.0]

Для меня первое значение, передаваемое в 1.0 поэтому было бы (1.0/6 * (1.0-3.5) ** 2.0) и поэтому .166 * -2.5 ** 2.0

Я также не уверен, что означает ** в формуле, которую я предполагаю умножить.
Правильный ответ должен быть 2.9166666667

+0

[ '**'] (https://msdn.microsoft.com/en-us/library/ee353580.aspx) является оператором 'pow'. – ildjarn

+0

спасибо, не могли бы вы показать мне, как они добираются до 2.9166666667 там – techfinance1

ответ

0

Чтобы было легче понять, вы можете переписать код следующим образом:

let variance values = 
    let average = Seq.average values 
    let length = Seq.length values 

    let sum = values 
       |> Seq.map (fun x -> (x - average) ** 2.0) 
       |> Seq.sum in sum/float length 

variance [1.0..6.0] |> printfn "%A" 

Print: 2,916666667

Ссылка: https://dotnetfiddle.net/09PHXn

По итерация:

let variancetest values = 
    let average = Seq.average values 
    let length = Seq.length values 
    values 
    |> Seq.iteri(fun i x -> 
       printfn "%i [%f]: %f^2 = %A" i x (x - average) ((x - average) ** 2.0)) 
    let sum = values 
       |> Seq.map (fun x -> (x - average) ** 2.0) 
       |> Seq.sum 

    let flength = float length 
    printfn "Sum = %f" sum 
    printfn "1/length = %f" (1.0/flength) 
    printfn "Result/length = %f" (sum/flength) 

variancetest [1.0..6.0] 

Print:

0 [1.000000]: -2.500000^2 = 6.25 
1 [2.000000]: -1.500000^2 = 2.25 
2 [3.000000]: -0.500000^2 = 0.25 
3 [4.000000]: 0.500000^2 = 0.25 
4 [5.000000]: 1.500000^2 = 2.25 
5 [6.000000]: 2.500000^2 = 6.25 
Sum = 17.500000 
1/length = 0.166667 
Result/length = 2.916667 

https://dotnetfiddle.net/02r3qG

+0

ahh благодарите так много всего, что лучше, позвольте мне подумать об этом для маленькой га – techfinance1

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