import java.util.Arrays;
import org.jetbrains.annotations.NotNull;
public class Tools {
public record LinearRegressionResult(double slope, double intercept, double[] predictedValues) {
@Override
public double[] predictedValues() {
return predictedValues.clone();
}
@NotNull
@Override
public String toString() {
return "LinearRegressionResult{"
+ "intercept="
+ intercept
+ ", slope="
+ slope
+ ", predictedValues="
+ Arrays.toString(predictedValues)
+ '}';
}
}
public static LinearRegressionResult linearRegression(double[] y) {
int n = y.length;
double[] x = new double[n];
for (int i = 0; i < n; i++) {
x[i] = i;
}
return linearRegression(x, y);
}
public static LinearRegressionResult linearRegression(double[] x, double[] y) {
if (x.length != y.length) {
throw new IllegalArgumentException("Input arrays must have the same length.");
}
int n = x.length;
double sumX = 0.0, sumY = 0.0, sumXY = 0.0, sumX2 = 0.0;
for (int i = 0; i < n; i++) {
sumX += x[i];
sumY += y[i];
sumXY += x[i] * y[i];
sumX2 += x[i] * x[i];
}
double slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);
double intercept = (sumY - slope * sumX) / n;
double[] predictedValues = new double[n];
for (int i = 0; i < n; i++) {
predictedValues[i] = slope * x[i] + intercept;
}
return new LinearRegressionResult(slope, intercept, predictedValues);
}
public static void testLinearRegression_slope_2() {
double[] y = {1, 3, 5, 8, 7, 12};
LinearRegressionResult result = linearRegression(y);
System.out.println(result);
}
public static void testLinearRegression_slope_0() {
double[] y = {0, 5, 0, 5, 0};
LinearRegressionResult result = linearRegression(y);
System.out.println(result);
}
public static void testLinearRegression_slope_negative() {
double[] y = {10, 11, 9.5, 8, 11};
LinearRegressionResult result = linearRegression(y);
System.out.println(result);
}
public static void testLinearRegression_same_values_slope_0() {
double[] y = {1, 1};
LinearRegressionResult result = linearRegression(y);
System.out.println(result);
}
public static void testLinearRegression_empty_array_NaN() {
double[] y = {};
LinearRegressionResult result = linearRegression(y);
System.out.println(result);
}
public static void testLinearRegression() {
testLinearRegression_slope_2();
testLinearRegression_slope_0();
testLinearRegression_slope_negative();
testLinearRegression_same_values_slope_0();
testLinearRegression_empty_array_NaN();
}
public static void main(String[] args) {
testLinearRegression();
}
}