Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

3 次平滑化スプライン

この例では、Curve Fitting Toolbox™ の csaps コマンドおよび spaps コマンドを使用して、3 次平滑化スプラインを作成する方法を示します。

CSAPS コマンド

コマンド csaps は、"平滑化" スプラインを提供します。これは、ノイズを含むデータの基となるトレンドの推定をある程度近似する 3 次スプラインです。選択した平滑化パラメーターによって、与えられたデータを平滑化スプラインがどの程度近似するかが決まります。基本情報として、ドキュメンテーションの要約版を次に示します。

CSAPS Cubic smoothing spline.

VALUES = CSAPS(X, Y, P, XX)

Returns the values at XX of the cubic smoothing spline for the

given data (X,Y) and depending on the smoothing parameter P, chosen

from the interval [0 .. 1]. This smoothing spline f minimizes

P * sum_i W(i)(Y(i) - f(X(i)))^2 + (1-P) * integral (D^2 f)^2

例: 3 次多項式のノイズを含むデータ

ここでは、試しにいくつかを実行してみます。単純な 3 次式 q(x) := x^3 のデータから開始し、値にノイズを追加して、平滑化パラメーターが .5 になるように値を選択します。次に、基にした 3 次式およびノイズ入りデータと共に、結果の平滑化された値をプロットします。

xi = (0:.05:1);
q = @(x) x.^3;
yi = q(xi);
randomStream = RandStream.create( 'mcg16807', 'Seed', 23 );
ybad = yi+.3*(rand(randomStream, size(xi))-.5);
p = .5;
xxi = (0:100)/100;
ys = csaps(xi,ybad,p,xxi);
plot(xi,yi,':',xi,ybad,'x',xxi,ys,'r-')
title('Clean Data, Noisy Data, Smoothed Values')
legend( 'Exact', 'Noisy', 'Smoothed', 'Location', 'NorthWest' )

この場合は平滑化されすぎています。平滑化パラメーター p を 1 に近づけることで、与えられたデータに近い平滑化スプラインが得られます。p = .6, .7, .8, .9, 1 について試行し、結果の平滑化スプラインをプロットします。

yy = zeros(5,length(xxi));
p = [.6 .7 .8 .9 1];
for j=1:5
   yy(j,:) = csaps(xi,ybad,p(j),xxi);
end
hold on
plot(xxi,yy);
hold off
title('Smoothing Splines for Various Values of the Smoothing Parameter')
legend({'Exact','Noisy','p = 0.5','p = 0.6','p = 0.7','p = 0.8', ...
        'p = 0.9', 'p = 1.0'}, 'Location', 'NorthWest' )

平滑化スプラインは、平滑化パラメーターの選択にかなり影響を受けることがわかります。p = 0.9 の場合でも平滑化スプラインがまだ基のトレンドから離れていますが、p = 1 の場合は (ノイズを含む) データに対する内挿が得られます。

実際に、csapi が使用する定式化 (『A Practical Guide to Splines』の 235ff ページ) は、独立変数のスケーリングに大きな影響を受けます。使用される式を簡単に解析すると、epsilon := h^3/16 および隣接するサイト間の平均差異を h として、p の影響を受ける範囲はおよそ 1/(1+epsilon) となります。特に、p = 1/(1+epsilon/100) の場合にデータの忠実な近似、p = 1/(1+epsilon*100) の場合に良好な平滑化が予想されます。

次のプロットに、このマジック ナンバー 1/(1+epsilon) 付近の p の値の平滑化スプラインを示します。この場合、マジック ナンバー 1/(1+epsilon) が非常に 1 に近いため、1-p を確認するとより多くの情報が得られます。

epsilon = ((xi(end)-xi(1))/(numel(xi)-1))^3/16;
1 - 1/(1+epsilon)
ans = 7.8124e-06
plot(xi,yi,':',xi,ybad,'x')
hold on
labels = cell(1,5);
for j=1:5
   p = 1/(1+epsilon*10^(j-3));
   yy(j,:) = csaps(xi,ybad,p,xxi);
   labels{j} = ['1-p= ',num2str(1-p)];
end
plot(xxi,yy)
title('Smoothing Splines for Smoothing Parameter Near Its ''Magic'' Value')
legend( [{'Exact', 'Noisy'}, labels], 'Location', 'NorthWest' )
hold off

この例で、平滑化スプラインはマジック ナンバー付近の平滑化パラメーターの変化にかなり影響を受けます。これらから、1 から最も遠いものが最良の選択肢のようですが、それより良いものが必要な場合があります。

p = 1/(1+epsilon*10^3);
yy = csaps(xi,ybad,p,xxi);
hold on
plot( xxi, yy, 'y', 'LineWidth', 2 )
title( sprintf( 'The Smoothing Spline For 1-p = %s is Added, in Yellow', num2str(1-p) ) )
hold off

誤差の重みを使用して csaps を指定すると、あるデータ点に他より多くの注意を払うことができます。また、評価サイト xx を指定しない場合、csaps は平滑化スプラインの pp 型を返します。

最後に、csaps はベクトル値データおよび多変量グリッド データを処理することもできます。

SPAPS コマンド

コマンド spaps により得られる 3 次平滑化スプラインは、その選択方法のみが csaps で作成されたものと異なります。次に、spaps のドキュメンテーションの要約版を示します。

SPAPS Smoothing spline.

[SP,VALUES] = SPAPS(X,Y,TOL) returns the B-form and, if asked,

the values at X, of a cubic smoothing spline f for the given

data (X(i),Y(:,i)), i=1,2, ..., n.

The smoothing spline f minimizes the roughness measure

F(D^2 f) := integral ( D^2 f(t) )^2 dt on X(1) < t < X(n)

over all functions f for which the error measure

E(f) := sum_j { W(j)*( Y(:,j) - f(X(j)) )^2 : j=1,...,n }

is no bigger than the given TOL. Here, D^M f denotes the M-th

derivative of f. The weights W are chosen so that E(f) is the

Composite Trapezoid Rule approximation for F(y-f).

f is constructed as the unique minimizer of

rho*E(f) + F(D^2 f),

with the smoothing parameter RHO so chosen so that E(f) equals

TOL. Hence, FN2FM(SP,'pp') should be (up to roundoff) the same

as the output from CPAPS(X,Y,RHO/(1+RHO)).

許容誤差と平滑化パラメーター

csaps に必要な平滑化パラメーター p を指定するより、spaps に適切な許容誤差を指定する方が簡単な場合があります。以前の例では、区間 0.3*[-0.5 .. 0.5] から、一様分布のランダムなノイズを追加しました。したがって、そのようなノイズにおける誤差測定 e の値として、tol に妥当な値を推定できます。

tol = sum((.3*(rand(randomStream, size(yi))-.5)).^2);

次のプロットは、spaps で作成した結果として得られる平滑化スプラインを示しています。誤差の重みが均一になるように指定してあることに注意してください。これが csaps における重みの既定値です。

[sp,ys,rho] = spaps(xi,ybad,tol,ones(size(xi)));
plot(xi,yi,':',xi,ybad,'x',xi,ys,'r-')
title( sprintf( 'Clean Data, Noisy Data, Smoothed Values (1-p = %s )', num2str(1/(1+rho)) ) );
legend( {'Exact','Noisy','Smoothed'}, 'location', 'NorthWest' )

この Figure のタイトルは、、これらのデータの正確な平滑化スプラインを取得するために csaps で使用する p の値を示しています。

さらに、平滑化パラメーターが指定されなかった場合に csaps で求められる平滑化スプラインを次に示します。この場合、csaps は、平滑化スプラインが (前の説明と同様に) 平滑化パラメーターから最も影響を受ける領域を見つけようとするという、特別な手続きでパラメーターを選択します。

hold on
plot(xxi,fnval(csaps(xi,ybad),xxi),'-')
title('Clean Data, Noisy Data, Smoothed Values')
legend({'Exact' 'Noisy' 'spaps, specified tolerance' ...
        'csaps, default smoothing parameter'}, 'Location', 'NorthWest' )
hold off

CSAPS と SPAPS

csaps コマンドと spaps コマンドには、個々の平滑化スプラインを指定する方法に平滑化パラメーターを使用するか、許容誤差を使用するかの違いがあります。もう 1 つの違いは、spaps は 3 次平滑化スプライン以外にも、線形平滑化スプラインまたは 5 次平滑化スプラインを提供できることです。

2 階微分をできるだけ動かしたくない状況では、5 次平滑化スプラインが 3 次平滑化スプラインよりも優れています。