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

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

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

米国の人口を予測

この例では、データの外挿による将来の予測のために、適度であっても多項式を使うことが危険であることを示します。

この例の予測は、MATLAB が作成されるより前に行われたものです。1977 年に Prentice-Hall によって公表され、Forsythe、Malcolm、および Moler らの "Computer Methods for Mathematical Computations" 内の練習として始まりました。

現在では、MATLAB と Handle Graphics によって、パラメーターを変更して結果を見ることは大変容易に行えますが、根本的な数学的法則は変わりません。

1900 年から 2000 年の米国の人口調査データを示します。

% Time interval
t = (1900:10:2000)';

% Population
p = [75.995 91.972 105.711 123.203 131.669 ...
     150.697 179.323 203.212 226.505 249.633 281.422]';

% Plot
plot(t,p,'bo');
axis([1900 2020 0 400]);
title('Population of the U.S. 1900-2000');
ylabel('Millions');

2010 年には人口はどうなると推定しますか?

p
p =

   75.9950
   91.9720
  105.7110
  123.2030
  131.6690
  150.6970
  179.3230
  203.2120
  226.5050
  249.6330
  281.4220

t の多項式でデータを近似し、これを使用して t = 2010 に外挿しましょう。多項式の係数は、要素がスケーリングした時間 A(i,j) = s(i)^(n-j) の乗数となる 11 行 11 列のヴァンデルモンド行列を含む方程式の線形システムを解くことで得られます。

n = length(t);
s = (t-1950)/50;
A = zeros(n);
A(:,end) = 1;
for j = n-1:-1:1, A(:,j) = s .* A(:,j+1); end

データ p に近似する次数 d の多項式に対する係数 c は、ヴァンデルモンド行列の最後の d+1 列を含む方程式の線形システムを解くことで得られます。

   A(:,n-d:n)*c ~= p

d が 10 より小さい場合、さらに未知の方程式があり、最小二乗解は適切です。d が 10 に等しい場合、その方程式は厳密な解になり、多項式は実際にデータを内挿します。どちらの場合も、システムは、MATLAB のバックスラッシュ演算を使って解きます。ここで、3 次の近似に対する係数を出力します。

c = A(:,n-3:n)\p
c =

    1.2629
   23.7261
  100.3659
  155.9043

1900 年から 2010 年の各年で多項式を評価し、結果をプロットしましょう。

v = (1900:2020)';
x = (v-1950)/50;
w = (2010-1950)/50;
y = polyval(c,x);
z = polyval(c,w);

hold on
plot(v,y,'k-');
plot(2010,z,'ks');
text(2010,z+15,num2str(z));
hold off

3 次と 4 次多項式近似を比較します。外挿の点が大きく異なることに注意してください。

c = A(:,n-4:n)\p;
y = polyval(c,x);
z = polyval(c,w);

hold on
plot(v,y,'k-');
plot(2010,z,'ks');
text(2010,z-15,num2str(z));
hold off

次数が増加すると、外挿はさらに不安定になります。

cla
plot(t,p,'bo'); hold on; axis([1900 2020 0 400]);
colors = hsv(8); labels = {'data'};
for d = 1:8
   [Q,R] = qr(A(:,n-d:n));
   R = R(1:d+1,:); Q = Q(:,1:d+1);
   c = R\(Q'*p);    % Same as c = A(:,n-d:n)\p;
   y = polyval(c,x);
   z = polyval(c,11);
   plot(v,y,'color',colors(d,:));
   labels{end+1} = ['degree = ' int2str(d)];
end
legend(labels,2)

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