50 lines
1.9 KiB
Java
50 lines
1.9 KiB
Java
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;
|
|
double xm = Arrays.stream(x).average().orElse(Double.NaN);
|
|
double ym = Arrays.stream(y).average().orElse(Double.NaN);
|
|
double x2m = Arrays.stream(x).map(a -> a * a).average().orElse(Double.NaN);
|
|
double x3m = Arrays.stream(x).map(a -> a * a * a).average().orElse(Double.NaN);
|
|
double x4m = Arrays.stream(x).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);
|
|
}
|
|
}
|