Кто-нибудь знает, как изменить эту функцию, чтобы получить полиномиальную регрессию 4-й степени? Так что я получу значения для «d» и «e».
Нужно ли рассчитывать xm до x8m?
Тогда x3ym и x4ym?
Я не уверен, что делать после.
void polyRegression( const std::vector<int>& x, const std::vector<int>& y
)
{
int n = x.size();
std::vector<int> r(n);
std::iota( r.begin(), r.end(), 0 );
double xm = std::accumulate( x.begin(), x.end(), 0.0 ) / x.size();
double ym = std::accumulate( y.begin(), y.end(), 0.0 ) / y.size();
double x2m = std::transform_reduce( r.begin(), r.end(), 0.0, std::plus<double>{}, [](double a) {return a * a; } ) / r.size();
double x3m = std::transform_reduce( r.begin(), r.end(), 0.0, std::plus<double>{}, [](double a) {return a * a * a; } ) / r.size();
double x4m = std::transform_reduce( r.begin(), r.end(), 0.0, std::plus<double>{}, [](double a) {return a * a * a * a; } ) / r.size();
double xym = std::transform_reduce( x.begin(), x.end(), y.begin(), 0.0, std::plus<double>{}, std::multiplies<double>{} );
xym /= fmin( x.size(), y.size() );
double x2ym = std::transform_reduce( x.begin(), x.end(), y.begin(), 0.0, std::plus<double>{}, [](double a, double b) { return a * a * b; } );
x2ym /= fmin( x.size(), y.size() );
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;
}
Задача ещё не решена.
Других решений пока нет …