2


0

最小線形回帰プログラム

外部マシンでいくつかの計算を実行していますが、最後にXとYのペアを取得します。 線形回帰を適用して、A、B、およびR2を取得します。 このマシンには何もインストールできません(Linuxを実行します)。基本的なもの、Python、bash(もちろん)などがインストールされています。

外部ライブラリ(numpyなど)を追加せずに線形回帰係数を提供するスクリプト(python、bashなど)またはプログラム(CとC ++をコンパイルできます)を使用するのに最適なアプローチは何でしょうか

3 Answer


3


単一の単純な既知の関数(あなたの場合のように:行)の場合、基本的な最小二乗ルーチンをゼロから単純にコーディングするのは難しくありません(ただし、細部に注意を払う必要があります)。 これは、数値解析入門クラスで非常に一般的な課題です。

だから、ウィキペディアや数学の世界、または教科書で最小二乗を調べて町に行ってください。


1


係数をファイルに抽出し、別のマシンにインポートしてから、Excel / Matlab /その他のプログラムを使用してみてはどうですか?


1


こんにちは。これは、ウィキペディアの最適なラインに関する記事から得たソリューションです。

#include
#include

// 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
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 > data;
    for (int i = 0; i < 10; ++i) {
      data.push_back(std::pair(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;
}