我在外部机器上运行一些计算,最后得到X,Y对。我想应用线性回归并获得A,B和R2。在这台机器上我无法安装任何东西(它运行Linux)并且安装了基本的东西,python,bash(当然)等等。
我想知道使用脚本(python,bash等)或程序(我可以编译C和C ++)的最佳方法是什么,它给出了线性回归系数,而无需添加外部库(numpy等) )
答案 0 :(得分:3)
对于单个简单的已知函数(如在您的情况下:一行),从头开始简单地编写基本最小二乘例程并不困难(但需要注意细节)。这是介绍性数值分析类中非常常见的任务。
所以,在维基百科或数学世界或教科书中查找最小二乘法并前往城镇。
答案 1 :(得分:1)
如何将coeffs提取到文件中,导入到另一台机器,然后使用Excel / Matlab /其他任何为您执行此操作的程序?
答案 2 :(得分:1)
嗨,这是我从维基百科关于最佳拟合线的文章中得到的解决方案。
#include <iostream>
#include <vector>
// Returns true if linear fit was calculated. False otherwise.
// Algorithm adapted from:
// https://en.wikipedia.org/wiki/Simple_linear_regression#Fitting_the_regression_line
template <typename PairIterator>
bool GetLinearFit(PairIterator begin_it,
PairIterator end_it,
double* out_slope,
double* out_yintercept) {
if (begin_it == end_it) {
return false;
}
size_t n = 0;
double x_avg = 0;
double y_avg = 0;
for (PairIterator it = begin_it; it != end_it; ++it) {
x_avg += it->first;
y_avg += it->second;
n++;
}
x_avg /= n;
y_avg /= n;
double numerator = 0;
double denominator = 0;
for (PairIterator it = begin_it; it != end_it; ++it) {
double x_variance = it->first - x_avg;
double y_variance = it->second - y_avg;
numerator += (x_variance * y_variance);
denominator += (x_variance * x_variance);
}
double slope = numerator / denominator;
double yintercept = y_avg - slope*x_avg;
*out_slope = slope;
*out_yintercept= yintercept ;
return true;
}
// Tests the output of GetLinearFit(...).
int main() {
std::vector<std::pair<int, int> > data;
for (int i = 0; i < 10; ++i) {
data.push_back(std::pair<int, int>(i+1, 2*i));
}
double slope = 0;
double y_intercept = 0;
GetLinearFit(data.begin(), data.end(), &slope, &y_intercept);
std::cout << "slope: " << slope << "\n";
std::cout << "y_intercept: " << y_intercept<< "\n";
return 0;
}