AlgoPlus v0.1.0
Loading...
Searching...
No Matches
poly_reg.h
1#ifndef POLY_REG_H
2#define POLY_REG_H
3
4#ifdef __cplusplus
5#include <cmath>
6#include <iostream>
7#include <vector>
8#endif
9
10class polynomial_regression {
11 private:
12 std::vector<double> X;
13 std::vector<double> Y;
14 int64_t n;
15
16 public:
17 explicit polynomial_regression(std::vector<double> X, std::vector<double> Y, int64_t n) noexcept
18 : X(X), Y(Y), n(n) {}
19
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);
24 return b_coeffs;
25 }
26
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));
29 }
30
31 inline std::vector<std::vector<double>> calculate_matrix(const std::vector<double>& x,
32 int64_t n) {
33 int64_t m = x.size();
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);
39 }
40 }
41 }
42 return matrix;
43 }
44
45 inline std::vector<double> calculate_vector(const std::vector<double>& x,
46 const std::vector<double>& y, int64_t n) {
47 int64_t m = x.size();
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);
52 }
53 }
54 return vector;
55 }
56
57 // Gaussian elimination
58 inline std::vector<double> solve_linear_system(std::vector<std::vector<double>> A,
59 std::vector<double> b) {
60 int64_t n = A.size();
61 for (int64_t i = 0; i < n; ++i) {
62
63 int64_t maxRow = i;
64 for (int64_t k = i + 1; k < n; ++k) {
65 if (std::abs(A[k][i]) > std::abs(A[maxRow][i])) {
66 maxRow = k;
67 }
68 }
69
70 std::swap(A[maxRow], A[i]);
71 std::swap(b[maxRow], b[i]);
72
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) {
76 if (i == j) {
77 A[k][j] = 0;
78 } else {
79 A[k][j] += c * A[i][j];
80 }
81 }
82 b[k] += c * b[i];
83 }
84 }
85
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];
91 }
92 }
93 return x;
94 }
95
101 inline double predict(double x) {
102 std::vector<double> coeffs = get_coeffs();
103 double y_pred = 0.0;
104
105 for (int64_t i = 0; i < int(coeffs.size()); i++) {
106 y_pred += coeffs[i] * std::pow(x, i);
107 }
108
109 return y_pred;
110 }
111};
112
113#endif
double predict(double x)
predict function
Definition poly_reg.h:101