ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

プログラムによる近似

多項式モデルのための MATLAB 関数

2 つの MATLAB® 関数が、多項式モデルを用いてデータをモデリングできます。

多項式近似関数

関数

説明

polyfit

polyfit(x,y,n) は、モデルからのデータの偏差の二乗和を最小にすることにより (最小二乗法)、データ y を近似するn 次多項式 p(x) の係数を求めます。

polyval

polyval(p,x) は、polyfit で決まる n 次多項式の x での値を計算します。

例として、時間 t の各値で、量 y を測定すると仮定します。

t = [0 0.3 0.8 1.1 1.6 2.3];
y = [0.6 0.67 1.01 1.35 1.47 1.25];
plot(t,y,'o')

t に対する y のプロット

2 次の多項式関数を用いてこのデータのモデリングを試みることができます。

未知係数 a0a1a2 は、データのモデルからの偏差の二乗和を最小にすることで計算されます (最小二乗法)。

多項式係数を見つけるためには、MATLAB プロンプトで次のように入力します。

p=polyfit(t,y,2)

MATLAB は、多項式係数を降べきの順で計算します。

p =
   -0.2942    1.0231    0.4981

データについての 2 次多項式モデルは、次式になります。

データとともにモデルをプロットするには、等間隔の時間 t2 で多項式を計算して、元のデータをプロットに重ねます。

t2 = 0:0.1:2.8;     % Define a uniformly spaced time vector
y2=polyval(p,t2);   % Evaluate the polynomial at t2
figure
plot(t,y,'o',t2,y2) % Plot the fit on top of the data 
                    % in a new Figure window

データ (点) とモデル (線) のプロット

次の構文を用いて、残差を計算します。

y2=polyval(p,t); % Evaluate model at the data time vector
res=y-y2; % Calculate the residuals by subtracting
figure, plot(t,res,'+') % Plot the residuals

残差のプロット

2 次の近似はデータの基本的な形に概ね従っていますが、データが乗っているように見える滑らかな曲線をとらえていないように見えることに注意してください。残差にはパターンがあるように見え、他のモデルが必要である可能性を示しています。(次に示す) 5 次多項式は、データの揺らぎに従い、より適切な近似をします。

今回は polyfit の 5 次多項式を用いて演習を繰り返します。

p5= polyfit(t,y,5)

p5 =
    0.7303   -3.5892    5.4281   -2.5175    0.5910    0.6000

y3 = polyval(p5,t2);   % Evaluate the polynomial at t2
figure
plot(t,y,'o',t2,y3) % Plot the fit on top of the data 
                    % in a new Figure window

5 次多項式近似

    メモ:   物理的な状況のモデリングを試みようとする場合、特定次数のモデルが対象としている状況において意味をもつかどうかを考察することが常に重要です。

非多項式項をもつ線形モデル

多項式関数がデータに対して満足できるモデルを与えない場合、非多項式項をもつ線形モデルを用いて試すことができます。たとえば、パラメーター a0a1a2 に関して線形で、データ t に関しては線形ではないような、次の関数を考えます。

連立方程式のセットを作成して解き、パラメーターに対して解くことによって、未知の係数 a0a1a2 を計算できます。次の構文では、デザイン行列を形成することでこれを行います。ここで、各列は応答 (モデルの項) の予測に使用する変数を表し、各行はそれらの変数の 1 つの観測に対応します。

% Enter t and y as columnwise vectors
t = [0 0.3 0.8 1.1 1.6 2.3]';
y = [0.6 0.67 1.01 1.35 1.47 1.25]';

% Form the design matrix
X = [ones(size(t))  exp(-t)  t.*exp(-t)];

% Calculate model coefficients
a = X\y

a =
    1.3983
  - 0.8860
    0.3085

したがって、データのモデルは次のように与えられます。

さて、等間隔のキザミでモデルを計算し、オリジナルのデータと重ね書きしましょう。

T = (0:0.1:2.5)';
Y = [ones(size(T))  exp(-T)  T.*exp(-T)]*a;
plot(T,Y,'-',t,y,'o'), grid on

重回帰

y が複数の予測変数からなる関数の場合、変数間の関係を表す行列方程式は、データが追加されて大きくなります。これは、重回帰と呼ばれます。

x1x2 の値に対して、値 y を観測していると仮定しましょう。MATLAB コマンド ウィンドウで、次のように、これらの値を入力します。

x1 = [.2 .5 .6 .8 1.0 1.1]';
x2 = [.1 .3 .4 .9 1.1 1.4]';
y  = [.17 .26 .28 .23 .27 .24]';

データの多変量モデルを、次のように考えます。

重回帰では、未知係数 a0a1a2 を、データのモデルからの偏差の二乗和を最小にすることで計算します (最小二乗法)。

設計行列 X を形成することにより連立方程式を構成して解き、バックスラッシュ演算子を使用してパラメーターについて解きます。

X = [ones(size(x1))  x1  x2];
a = X\y

a =
    0.1018
    0.4844
   -0.2847

データの最小二乗近似モデルは、次のようになります。

モデルを検証するために、モデルから求めた点と観測データ点との偏差の絶対値から最大値を求めます。

Y = X*a;
MaxErr = max(abs(Y - y))

MaxErr = 
     0.0038

この値がデータ値に比べて十分小さいので、データへの近似がうまくいっているモデルであることを確信できます。

例: プログラムによる近似

この例では、MATLAB 関数を用いて次のことを行います。

この例は、1790 年から 1990 年までの米国での人口のデータを含む census.mat のデータを使用します。

データを読み込みプロットするためには、MATLAB プロンプトで次のコマンドを入力します。

load census
plot(cdate,pop,'ro')

MATLAB ワークスペースに次の 2 つの変数が追加されます。

  • cdate は、1790 年から 1990 年までの 10 年ごとの年度を示す列ベクトルです。

  • pop は、cdate の中の各年度に対応する米国の人口数が記された列ベクトルです。

データの次のプロットには、変数間の強い相関を示すはっきりとしたパターンが見られます。

1790 年から 1990年 までの米国の人口

相関係数の計算

例では、ここで、統計的な相関を決め、データのモデリングが適切であるか確かめるために、変数 cdatepop を決定します。相関係数の詳細は、線形相関を参照してください。

MATLAB プロンプトで次の構文を入力します。

corrcoef(cdate,pop)

MATLAB は、次の相関係数行列を計算します。

ans =

    1.0000    0.9597
    0.9597    1.0000

行列の対角要素は、各変数がそれ自身と完全に相関していることを表し、1 に等しくなります。非対角要素は非常に 1 に近く、変数 cdatepop の間には統計的な強い相関があることを示します。

データに対する多項式近似

例では、ここで、データのモデリングのために、MATLAB 関数 polyfitpolyval を適用します。

% Calculate fit parameters
[p,ErrorEst] = polyfit(cdate,pop,2);
% Evaluate the fit
pop_fit = polyval(p,cdate,ErrorEst);
% Plot the data and the fit
plot(cdate,pop_fit,'-',cdate,pop,'+');
% Annotate the plot
legend('Polynomial Model','Data','Location','NorthWest');
xlabel('Census Year');
ylabel('Population (millions)');

次の図は、2 次の多項式近似がデータの良い近似を与えていることを示します。

この近似の残差を計算するために、MATLAB プロンプトで次の構文を入力します。

res = pop - pop_fit;
figure, plot(cdate,res,'+')
title('Residuals for the Quadratic Polynomial Model')

残差のプロットがパターンを示していることに注意してください。これは、このデータのモデリングに 2 次多項式は適切でない可能性があることを意味します。

信頼限界のプロットと計算

信頼限界は、予測された応答に対する信頼区間です。区間の幅は、近似がどの程度正確であるかを示します。

この例では、サンプル データ censuspolyfitpolyval を適用し、2 次多項式モデルに対する信頼限界を求めます。

次の構文は、 の区間を使用します。これは、大きい標本に対する 95% 信頼区間に相当します。

% Evaluate the fit and the prediction error estimate (delta)
[pop_fit,delta] = polyval(p,cdate,ErrorEst);
% Plot the data, the fit, and the confidence bounds
plot(cdate,pop,'+',...
     cdate,pop_fit,'g-',...
     cdate,pop_fit+2*delta,'r:',...
     cdate,pop_fit-2*delta,'r:'); 
% Annotate the plot
xlabel('Census Year');
ylabel('Population (millions)');
title('Quadratic Polynomial Fit with Confidence Bounds')
grid on

95% の区間は、新しい観測が区間内に入る可能性が 95% であることを示します。

この情報は役に立ちましたか?