10class polynomial_regression {
12 std::vector<double> X;
13 std::vector<double> Y;
17 explicit polynomial_regression(std::vector<double> X, std::vector<double> Y, int64_t n) noexcept
20 inline std::vector<double> get_coeffs() {
21 std::vector<std::vector<double>> k = calculate_matrix(this->X, this->n);
22 std::vector<double> l = calculate_vector(this->X, this->Y, this->n);
23 std::vector<double> b_coeffs = solve_linear_system(k, l);
27 inline std::vector<std::vector<double>> create_matrix(int64_t rows, int64_t cols) {
28 return std::vector<std::vector<double>>(rows, std::vector<double>(cols, 0.0));
31 inline std::vector<std::vector<double>> calculate_matrix(
const std::vector<double>& x,
34 auto matrix = create_matrix(n + 1, n + 1);
35 for (int64_t i = 0; i <= n; ++i) {
36 for (int64_t j = 0; j <= n; ++j) {
37 for (int64_t k = 0; k < m; ++k) {
38 matrix[i][j] += pow(x[k], i + j);
45 inline std::vector<double> calculate_vector(
const std::vector<double>& x,
46 const std::vector<double>& y, int64_t n) {
48 std::vector<double> vector(n + 1, 0.0);
49 for (int64_t i = 0; i <= n; ++i) {
50 for (int64_t k = 0; k < m; ++k) {
51 vector[i] += y[k] * pow(x[k], i);
58 inline std::vector<double> solve_linear_system(std::vector<std::vector<double>> A,
59 std::vector<double> b) {
61 for (int64_t i = 0; i < n; ++i) {
64 for (int64_t k = i + 1; k < n; ++k) {
65 if (std::abs(A[k][i]) > std::abs(A[maxRow][i])) {
70 std::swap(A[maxRow], A[i]);
71 std::swap(b[maxRow], b[i]);
73 for (int64_t k = i + 1; k < n; ++k) {
74 double c = -A[k][i] / A[i][i];
75 for (int64_t j = i; j < n; ++j) {
79 A[k][j] += c * A[i][j];
86 std::vector<double> x(n);
87 for (int64_t i = n - 1; i >= 0; --i) {
88 x[i] = b[i] / A[i][i];
89 for (int64_t k = i - 1; k >= 0; --k) {
90 b[k] -= A[k][i] * x[i];
102 std::vector<double> coeffs = get_coeffs();
105 for (int64_t i = 0; i < int(coeffs.size()); i++) {
106 y_pred += coeffs[i] * std::pow(x, i);