プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

線形回帰(Linear Regression)とは?最小二乗法で直線の方程式を求める方法とC++実装

線形回帰(Linear Regression)は、与えられたデータ点の集合から、それらの点に最もよく当てはまる直線の方程式を求める統計的手法です。求められた直線をもとにすれば、現在のデータセットに存在しない新しい点の値を予測することも可能になります。

線形回帰の基本公式

いくつかのデータ点から線形回帰の問題を解くには、以下の公式を使用します。

m = (n・Σxy − Σx・Σy) / (n・Σx² − (Σx)²)
c = (Σy − m・Σx) / n

ここで、m は直線の傾き(slope)cy切片(y-intercept) を表します。これらの値を求めることで、次の形式の直線の方程式が得られます。

y = mx + c

入力と出力の例

入力:
いくつかの点の (x, y) 座標。{(1,3), (2,4), (3,5), (4,6), (5,8)}

出力:
傾き: 1.2 切片: 1.6
方程式: y = 1.2x + 1.6

アルゴリズム

linReg(coord)

入力: 与えられた座標点の集合。

出力: 傾き m と y切片 c。

Begin
    for i := 1 to n, do
        sumX := sumX + coord[i,0]
        sumY := sumY + coord[i,1]
        sumXsq := sumXsq + (coord[i,0]*coord[i,0])
        sumXY := sumXY + (coord[i,0] * coord[i,1])
    done

    m := (n * sumXY − (sumX*sumY)) / (n * sumXsq − (sumX * sumX))
    c := (sumY / n) − (m * sumX)/n
End

C++による実装例

以下は、上記のアルゴリズムをC++で実装したサンプルコードです。二次元配列に格納された座標点を受け取り、傾きと切片を参照渡しで返します。

#include<iostream>
#include<cmath>
#define N 5
using namespace std;

void linReg(int coord[N][2], float &m, float &c) {
    float sx2 = 0, sx = 0, sxy = 0, sy = 0;
    for(int i = 0; i<N; i++) {
        sx += coord[i][0];   // x の合計
        sy += coord[i][1];   // y の合計

        sx2 += coord[i][0]*coord[i][0];   // x^2 の合計
        sxy += coord[i][0]*coord[i][1];   // x*y の合計
    }

    // 傾きと切片を求める
    m = (N*sxy-(sx*sy))/(N*sx2-(sx*sx));
    c = (sy/N)-(m*sx)/N;
}

main() {
    // 座標点を保持する二次元配列
    int point[N][2] = {{1,3},{2,4},{3,5},{4,6},{5,8}};
    float m, c;
    linReg(point, m, c);
    cout << "The slope: " << m << " The Intercept: " << c << endl;
    cout << "The equation: " << "y = "<< m <<"x + "<< c;
}

実行結果

The slope: 1.2 The Intercept: 1.6
The equation: y = 1.2x + 1.6

まとめ

線形回帰では、各座標点の x、y、x²、xy の合計値を事前に計算しておくことで、傾き m と切片 c を効率よく導き出せます。この方法は最小二乗法に基づいており、機械学習やデータ分析の基礎となる重要な概念です。データの傾向を直線でモデル化することで、未知のデータに対する予測も簡単に行えるようになります。

  1. PyTorchを使った線形回帰の実装方法を徹底解説

    線形回帰とは 単純線形回帰の基礎 2つの連続変数の間にある関係性を把握するために用いられる手法です。 具体例: x = 独立変数(例:体重) y = 従属変数(例:身長) 関係式は y = αx + β という形式で表されます。 それでは、実際にプログラムを通して単純線形回帰の仕組みを見ていきましょう。 #単純線形回帰 import numpy as np import matplotlib.pyplot as plt np.random.seed(1) n = 70 x = np.random.randn(n) y = x * np.random.randn(n) colo

  2. Rubyの線形回帰で未来を予測する方法

    私たちが日々行う選択の多くは、実は数値的な関係に基づいています。科学者がコレステロールを下げると言うから、特定の食品を食べる収入が増えやすいから、学歴を積む最も資産価値が上がりそうだと考えた地域に、家を買うこれらの結論には、どうやって到達するのでしょうか?おそらく、誰かが大量のデータを収集し、それを分析して結論を導き出したのでしょう。よく使われる手法のひとつが「線形回帰」で、これは教師あり学習の一種です。教師あり学習の詳細や活用例については、このシリーズの第1回をご覧ください。線形関係とは2つの値(xとyとします)の間に「線形関係」があるとは、xが1変化すると、yも必ず一定の量だけ変化すること