はじめに

最小自乗法による直線近似を実現するクラスです。
(x, y) のデータのペアを順次入力することにより、y = ax + b で表される近似直線の a と b、および、相関係数 r を求めることができます。

このライブラリも、無保証です。
ただし、ソースを示していますので、変更はご自由に行っていただいて結構です。

概要

最小自乗法による直線近似を行います。
一組のデータの直線近似も簡単に行うことができますが、クラスになっているので、複数の組を同時に計算するときに威力が発揮されます。
たとえば、x が正のものと負のもののそれぞれの相関係数を求めるとか。

もともと、いろいろな近似計算を統一的に取り扱おうかなという発想があったので、simpleApprox というスーパークラスが存在していますが、まあ、気にしないでください。

使い方

準備

必要なファイルは、
approx.h のみです。
プログラム本体も、ヘッダファイルに押し込んでいるので、他のファイルは不要です。

使い方

使い方は非常にシンプルです。
インスタンスを定義して、データを入力して、必要なデータを取得するという形になります。

クラスの定義

#include "approx.h" でヘッダをインクルードしたのち、

linearApprox lin;

のように、インスタンス(ここでは lin)を定義します。

データの入力

上記で定義したインスタンスに、たとえば、

lin.add(x のデータ, y のデータ);

のようにひとつずつ add() で入力します。

結果の取得

すべてのデータ入力が終わった後、以下の関数で結果が取得できます。

double getA()
y = ax + b の 係数 a を返します。
double getB()
y = ax + b の 切片 b を返します。
double getR()
相関係数 r を返します。
int getN()
入力されたデータ個数を返します

ちょっとしたヒント

このプログラムは、直線近似の機能をクラスとして提供しています。
クラスからは複数のインスタンスが提供できるため、以下のような例で特に有効です


#include <iostream>
#include "approx.h"

int main()
{
   double x;
   double y;

   linearApprox forPlus;
   linearApprox forMinus;

   std::cout << "データを2つずつ(x と y)を入力してください\n";
   std::cout << "0 0 でデータ入力を終了します\n";

   while(1)
   {
      std::cout << "data(x, y) = ?";
      std::cin >> x >> y;
      if (x == 0) break;
      if (x > 0) forPlus.add(x, y);
      else forMinus.add(x, y);
   }
 
   std::cout << "x > 0 のデータの相関係数 : " << forPlus.getR() << "\n";
   std::cout << "x < 0 のデータの相関係数 : " << forMinus.getR() << "\n";

   return 0;
}


Nagi -- from Yurihama, Tottori, Japan.
E-mail:k1@axis.blue