// X.size() == Y.size() > 0. returns correlation between X and Y
double Correlation(const vector<double>& X, const vector<double>& Y)
{
size_t N = X.size();
double EX(0), EY(0), EXY(0), EX2(0), EY2(0);
for (size_t i = 0; i < N; i++)
{
EX += X[i];
EY += Y[i];
EXY += X[i]*Y[i];
EX2 += X[i]*X[i];
EY2 += Y[i]*Y[i];
}
return (N*EXY - EX*EY) / sqrt((N*EX2 - EX*EX) * (N*EY2 - EY*EY));
}
// X.size() == Y.size() > 0. returns {a,b}, where y = a*x + b is
// line of best fit with least mean squared error.
pair<double, double> LeastSquaresCoefs(const vector<double>& X, const vector<double>& Y)
{
size_t N = X.size();
double EX(0), EY(0), EXY(0), EX2(0), EY2(0);
for (size_t i = 0; i < N; i++)
{
EX += X[i];
EY += Y[i];
EXY += X[i]*Y[i];
EX2 += X[i]*X[i];
EY2 += Y[i]*Y[i];
}
double b = (EX2*EY - EX*EXY) / (N * EX2 - EX*EX);
double a = (EXY - b * EX) / EX2;
return {a, b};
}
Do these functions work? Are they correct?
See also: http://math.stackexchange.com/questions/120941/simple-least-squares-regression