2015-06-27 130 views
0

我正在通過F#函數計算方差。我試圖逐步完成每次迭代以獲得正確的答案,但我認爲即使在某個地方,我也會得到錯誤的答案。可能有人請走我通過這個功能的一個迭代讓我回到正軌f#計算差異函數

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" 

打印: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] 

打印:

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

啊,非常感謝你的最好讓我思考一點點哈 – techfinance1