【C++】最小二乗法で直線近似してみた!【雑記】

スポンサーリンク
TitleC++
スポンサーリンク

はじめに

直線近似を手計算するのは面倒だったのでC++で作ってみました。

私の用途ではfloat型で事足りましたが、用途によっては型サイズを超えるのでプログラムの参考にする際にはデータサイズの部分に注意してください。

最小二乗法って何?

簡単に言えば、近似したい形の関数との誤差の二乗が一番小さくなるように関数の定数を求める方法です。

詳しい話はwikipediaを覗いてみてください。

ソースコード

このプログラムでは次のような形でデータがテキストファイルに保存されている必要があります。

データ数
x1 y1
x2 y2
... ...
xn yn

以下がプログラムのソースコードです。

#include <iostream>
#include <fstream>

#define FILENAME "min2.txt"

int main(){
	
	//入力ファイルストリーム
	std::ifstream ifs(FILENAME);
	
	//ファイルオープンエラー
	if(ifs.fail()){
		std::cout << "file_open_error" << std::endl; //エラー出力
		return 1; //エラー終了
	}
	
	int num = 0; //データ数格納
	ifs >> num; //データ数の読み込み
	
	//データ格納用
	float **data = new float*[num];
	for(int i = 0; i < num; i++){
		data[i] = new float[2];
	}
	
	int i = 0; //要素番号
	
	//最後まで読み込み
	while(ifs){
		//データの読み込み
		ifs >> data[i/2][i%2];
		i++;
	}
	
	//計算用変数
	float x = 0, x2 = 0, y = 0, xy = 0, a = 0, b = 0;
	
	//Σを求める
	for(int i = 0; i < num; i++){
		x += data[i][0];
		x2 += data[i][0] * data[i][0];
		y += data[i][1];
		xy += data[i][0] * data[i][1];
	}
	
	//演算
	a = (num*xy - x*y) / (num * x2 - x*x);
	b = (x2*y - xy*x) / (num * x2 - x*x);
	
	//出力
	std::cout << "a= " << a << std::endl;
	std::cout << "b= " << b << std::endl;
	
	return 0;
}

終わりに

最近は研究室配属されて何かあるわけではないのですが、進捗報告会やイベントで時間がどんどん削られています。なるべく暇を見つけて更新していきます。

コメント

タイトルとURLをコピーしました