Polynomial regression: Difference between revisions

Line 1,384:
9 262 262
10 321 321</pre>
 
=={{header|OCaml}}==
{{trans|Kotlin}}
{{libheader|Base}}
<lang OCaml>open Base
open Stdio
 
let mean fa =
let open Float in
(Array.reduce_exn fa ~f:(+)) / (of_int (Array.length fa))
 
let regression xs ys =
let open Float in
let xm = mean xs in
let ym = mean ys in
let x2m = Array.map xs ~f:(fun x -> x * x) |> mean in
let x3m = Array.map xs ~f:(fun x -> x * x * x) |> mean in
let x4m = Array.map xs ~f:(fun x -> let x2 = x * x in x2 * x2) |> mean in
let xzipy = Array.zip_exn xs ys in
let xym = Array.map xzipy ~f:(fun (x, y) -> x * y) |> mean in
let x2ym = Array.map xzipy ~f:(fun (x, y) -> x * x * y) |> mean in
 
let sxx = x2m - xm * xm in
let sxy = xym - xm * ym in
let sxx2 = x3m - xm * x2m in
let sx2x2 = x4m - x2m * x2m in
let sx2y = x2ym - x2m * ym in
 
let b = (sxy * sx2x2 - sx2y * sxx2) / (sxx * sx2x2 - sxx2 * sxx2) in
let c = (sx2y * sxx - sxy * sxx2) / (sxx * sx2x2 - sxx2 * sxx2) in
let a = ym - b * xm - c * x2m in
 
let abc xx = a + b * xx + c * xx * xx in
 
printf "y = %.1f + %.1fx + %.1fx^2\n\n" a b c;
printf " Input Approximation\n";
printf " x y y1\n";
Array.iter xzipy ~f:(fun (xi, yi) ->
printf "%2g %3g %5.1f\n" xi yi (abc xi)
)
 
let () =
let x = Array.init 11 ~f:Float.of_int in
let y = [| 1.; 6.; 17.; 34.; 57.; 86.; 121.; 162.; 209.; 262.; 321. |] in
regression x y</lang>
 
{{out}}
<pre>
y = 1.0 + 2.0x + 3.0x^2
 
Input Approximation
x y y1
0 1 1.0
1 6 6.0
2 17 17.0
3 34 34.0
4 57 57.0
5 86 86.0
6 121 121.0
7 162 162.0
8 209 209.0
9 262 262.0
10 321 321.0
</pre>
 
=={{header|Octave}}==
Anonymous user