June 2018 Update
This commit is contained in:
parent
ba8067c3b7
commit
22f33d4004
5278 changed files with 84726 additions and 14379 deletions
47
Task/Polynomial-regression/D/polynomial-regression.d
Normal file
47
Task/Polynomial-regression/D/polynomial-regression.d
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
import std.algorithm;
|
||||
import std.range;
|
||||
import std.stdio;
|
||||
|
||||
auto average(R)(R r) {
|
||||
auto t = r.fold!("a+b", "a+1")(0, 0);
|
||||
return cast(double) t[0] / t[1];
|
||||
}
|
||||
|
||||
void polyRegression(int[] x, int[] y) {
|
||||
auto n = x.length;
|
||||
auto r = iota(0, n).array;
|
||||
auto xm = x.average();
|
||||
auto ym = y.average();
|
||||
auto x2m = r.map!"a*a".average();
|
||||
auto x3m = r.map!"a*a*a".average();
|
||||
auto x4m = r.map!"a*a*a*a".average();
|
||||
auto xym = x.zip(y).map!"a[0]*a[1]".average();
|
||||
auto x2ym = x.zip(y).map!"a[0]*a[0]*a[1]".average();
|
||||
|
||||
auto sxx = x2m - xm * xm;
|
||||
auto sxy = xym - xm * ym;
|
||||
auto sxx2 = x3m - xm * x2m;
|
||||
auto sx2x2 = x4m - x2m * x2m;
|
||||
auto sx2y = x2ym - x2m * ym;
|
||||
|
||||
auto b = (sxy * sx2x2 - sx2y * sxx2) / (sxx * sx2x2 - sxx2 * sxx2);
|
||||
auto c = (sx2y * sxx - sxy * sxx2) / (sxx * sx2x2 - sxx2 * sxx2);
|
||||
auto a = ym - b * xm - c * x2m;
|
||||
|
||||
real abc(int xx) {
|
||||
return a + b * xx + c * xx * xx;
|
||||
}
|
||||
|
||||
writeln("y = ", a, " + ", b, "x + ", c, "x^2");
|
||||
writeln(" Input Approximation");
|
||||
writeln(" x y y1");
|
||||
foreach (i; 0..n) {
|
||||
writefln("%2d %3d %5.1f", x[i], y[i], abc(x[i]));
|
||||
}
|
||||
}
|
||||
|
||||
void main() {
|
||||
auto x = iota(0, 11).array;
|
||||
auto y = [1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321];
|
||||
polyRegression(x, y);
|
||||
}
|
||||
50
Task/Polynomial-regression/Java/polynomial-regression.java
Normal file
50
Task/Polynomial-regression/Java/polynomial-regression.java
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
import java.util.Arrays;
|
||||
import java.util.function.IntToDoubleFunction;
|
||||
import java.util.stream.IntStream;
|
||||
|
||||
public class PolynomialRegression {
|
||||
private static void polyRegression(int[] x, int[] y) {
|
||||
int n = x.length;
|
||||
int[] r = IntStream.range(0, n).toArray();
|
||||
double xm = Arrays.stream(x).average().orElse(Double.NaN);
|
||||
double ym = Arrays.stream(y).average().orElse(Double.NaN);
|
||||
double x2m = Arrays.stream(r).map(a -> a * a).average().orElse(Double.NaN);
|
||||
double x3m = Arrays.stream(r).map(a -> a * a * a).average().orElse(Double.NaN);
|
||||
double x4m = Arrays.stream(r).map(a -> a * a * a * a).average().orElse(Double.NaN);
|
||||
double xym = 0.0;
|
||||
for (int i = 0; i < x.length && i < y.length; ++i) {
|
||||
xym += x[i] * y[i];
|
||||
}
|
||||
xym /= Math.min(x.length, y.length);
|
||||
double x2ym = 0.0;
|
||||
for (int i = 0; i < x.length && i < y.length; ++i) {
|
||||
x2ym += x[i] * x[i] * y[i];
|
||||
}
|
||||
x2ym /= Math.min(x.length, y.length);
|
||||
|
||||
double sxx = x2m - xm * xm;
|
||||
double sxy = xym - xm * ym;
|
||||
double sxx2 = x3m - xm * x2m;
|
||||
double sx2x2 = x4m - x2m * x2m;
|
||||
double sx2y = x2ym - x2m * ym;
|
||||
|
||||
double b = (sxy * sx2x2 - sx2y * sxx2) / (sxx * sx2x2 - sxx2 * sxx2);
|
||||
double c = (sx2y * sxx - sxy * sxx2) / (sxx * sx2x2 - sxx2 * sxx2);
|
||||
double a = ym - b * xm - c * x2m;
|
||||
|
||||
IntToDoubleFunction abc = (int xx) -> a + b * xx + c * xx * xx;
|
||||
|
||||
System.out.println("y = " + a + " + " + b + "x + " + c + "x^2");
|
||||
System.out.println(" Input Approximation");
|
||||
System.out.println(" x y y1");
|
||||
for (int i = 0; i < n; ++i) {
|
||||
System.out.printf("%2d %3d %5.1f\n", x[i], y[i], abc.applyAsDouble(x[i]));
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
int[] x = IntStream.range(0, 11).toArray();
|
||||
int[] y = new int[]{1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321};
|
||||
polyRegression(x, y);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
function polyfit(x, y, n)
|
||||
A = [ float(x[i])^p for i = 1:length(x), p = 0:n ]
|
||||
A \ y
|
||||
end
|
||||
polyfit(x::Vector, y::Vector, deg::Int) = collect(v ^ p for v in x, p in 0:deg) \ y
|
||||
|
||||
x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||||
y = [1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321]
|
||||
@show polyfit(x, y, 2)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,38 @@
|
|||
// version 1.1.51
|
||||
|
||||
fun polyRegression(x: IntArray, y: IntArray) {
|
||||
val n = x.size
|
||||
val r = 0 until n
|
||||
val xm = x.average()
|
||||
val ym = y.average()
|
||||
val x2m = r.map { it * it }.average()
|
||||
val x3m = r.map { it * it * it }.average()
|
||||
val x4m = r.map { it * it * it * it }.average()
|
||||
val xym = x.zip(y).map { it.first * it.second }.average()
|
||||
val x2ym = x.zip(y).map { it.first * it.first * it.second }.average()
|
||||
|
||||
val sxx = x2m - xm * xm
|
||||
val sxy = xym - xm * ym
|
||||
val sxx2 = x3m - xm * x2m
|
||||
val sx2x2 = x4m - x2m * x2m
|
||||
val sx2y = x2ym - x2m * ym
|
||||
|
||||
val b = (sxy * sx2x2 - sx2y * sxx2) / (sxx * sx2x2 - sxx2 * sxx2)
|
||||
val c = (sx2y * sxx - sxy * sxx2) / (sxx * sx2x2 - sxx2 * sxx2)
|
||||
val a = ym - b * xm - c * x2m
|
||||
|
||||
fun abc(xx: Int) = a + b * xx + c * xx * xx
|
||||
|
||||
println("y = $a + ${b}x + ${c}x^2\n")
|
||||
println(" Input Approximation")
|
||||
println(" x y y1")
|
||||
for (i in 0 until n) {
|
||||
System.out.printf("%2d %3d %5.1f\n", x[i], y[i], abc(x[i]))
|
||||
}
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val x = IntArray(11) { it }
|
||||
val y = intArrayOf(1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321)
|
||||
polyRegression(x, y)
|
||||
}
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
MODULE PolynomialRegression;
|
||||
FROM FormatString IMPORT FormatString;
|
||||
FROM RealStr IMPORT RealToStr;
|
||||
FROM Terminal IMPORT WriteString,WriteLn,ReadChar;
|
||||
|
||||
PROCEDURE Eval(a,b,c,x : REAL) : REAL;
|
||||
BEGIN
|
||||
RETURN a + b*x + c*x*x;
|
||||
END Eval;
|
||||
|
||||
PROCEDURE Regression(x,y : ARRAY OF INTEGER);
|
||||
VAR
|
||||
n,i : INTEGER;
|
||||
xm,x2m,x3m,x4m : REAL;
|
||||
ym : REAL;
|
||||
xym,x2ym : REAL;
|
||||
sxx,sxy,sxx2,sx2x2,sx2y : REAL;
|
||||
a,b,c : REAL;
|
||||
buf : ARRAY[0..63] OF CHAR;
|
||||
BEGIN
|
||||
n := SIZE(x)/SIZE(INTEGER);
|
||||
|
||||
xm := 0.0;
|
||||
ym := 0.0;
|
||||
x2m := 0.0;
|
||||
x3m := 0.0;
|
||||
x4m := 0.0;
|
||||
xym := 0.0;
|
||||
x2ym := 0.0;
|
||||
FOR i:=0 TO n-1 DO
|
||||
xm := xm + FLOAT(x[i]);
|
||||
ym := ym + FLOAT(y[i]);
|
||||
x2m := x2m + FLOAT(x[i]) * FLOAT(x[i]);
|
||||
x3m := x3m + FLOAT(x[i]) * FLOAT(x[i]) * FLOAT(x[i]);
|
||||
x4m := x4m + FLOAT(x[i]) * FLOAT(x[i]) * FLOAT(x[i]) * FLOAT(x[i]);
|
||||
xym := xym + FLOAT(x[i]) * FLOAT(y[i]);
|
||||
x2ym := x2ym + FLOAT(x[i]) * FLOAT(x[i]) * FLOAT(y[i]);
|
||||
END;
|
||||
xm := xm / FLOAT(n);
|
||||
ym := ym / FLOAT(n);
|
||||
x2m := x2m / FLOAT(n);
|
||||
x3m := x3m / FLOAT(n);
|
||||
x4m := x4m / FLOAT(n);
|
||||
xym := xym / FLOAT(n);
|
||||
x2ym := x2ym / FLOAT(n);
|
||||
|
||||
sxx := x2m - xm * xm;
|
||||
sxy := xym - xm * ym;
|
||||
sxx2 := x3m - xm * x2m;
|
||||
sx2x2 := x4m - x2m * x2m;
|
||||
sx2y := x2ym - x2m * ym;
|
||||
|
||||
b := (sxy * sx2x2 - sx2y * sxx2) / (sxx * sx2x2 - sxx2 * sxx2);
|
||||
c := (sx2y * sxx - sxy * sxx2) / (sxx * sx2x2 - sxx2 * sxx2);
|
||||
a := ym - b * xm - c * x2m;
|
||||
|
||||
WriteString("y = ");
|
||||
RealToStr(a, buf);
|
||||
WriteString(buf);
|
||||
WriteString(" + ");
|
||||
RealToStr(b, buf);
|
||||
WriteString(buf);
|
||||
WriteString("x + ");
|
||||
RealToStr(c, buf);
|
||||
WriteString(buf);
|
||||
WriteString("x^2");
|
||||
WriteLn;
|
||||
|
||||
FOR i:=0 TO n-1 DO
|
||||
FormatString("%2i %3i ", buf, x[i], y[i]);
|
||||
WriteString(buf);
|
||||
RealToStr(Eval(a,b,c,FLOAT(x[i])), buf);
|
||||
WriteString(buf);
|
||||
WriteLn;
|
||||
END;
|
||||
END Regression;
|
||||
|
||||
TYPE R = ARRAY[0..10] OF INTEGER;
|
||||
VAR
|
||||
x,y : R;
|
||||
BEGIN
|
||||
x := R{0,1,2,3,4,5,6,7,8,9,10};
|
||||
y := R{1,6,17,34,57,86,121,162,209,262,321};
|
||||
Regression(x,y);
|
||||
|
||||
ReadChar;
|
||||
END PolynomialRegression.
|
||||
|
|
@ -1,10 +1,10 @@
|
|||
require 'matrix'
|
||||
|
||||
def regress x, y, degree
|
||||
x_data = x.map { |xi| (0..degree).map { |pow| (xi**pow).to_f } }
|
||||
x_data = x.map { |xi| (0..degree).map { |pow| (xi**pow).to_r } }
|
||||
|
||||
mx = Matrix[*x_data]
|
||||
my = Matrix.column_vector(y)
|
||||
|
||||
((mx.t * mx).inv * mx.t * my).transpose.to_a[0]
|
||||
((mx.t * mx).inv * mx.t * my).transpose.to_a[0].map(&:to_f)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
betas = regress [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
|
||||
[1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321],
|
||||
2
|
||||
|
||||
p betas
|
||||
p regress([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
|
||||
[1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321],
|
||||
2)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue