ドキュメンテーション

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

smooth

応答データを平滑化する

構文

yy = smooth(y)
yy = smooth(y,span)
yy = smooth(y,method)
yy = smooth(y,span,method)
yy = smooth(y,'sgolay',degree)
yy = smooth(y,span,'sgolay',degree)
yy = smooth(x,y,...)
gpuarrayYY = smooth(gpuarrayY)

説明

yy = smooth(y) は移動平均フィルターを使用して、列ベクトル y のデータを平滑化します。結果は列ベクトル yy に返されます。移動平均の既定の範囲は 5 です。

yy の最初の数要素は次で与えられます。

yy(1) = y(1)
yy(2) = (y(1) + y(2) + y(3))/3
yy(3) = (y(1) + y(2) + y(3) + y(4) + y(5))/5
yy(4) = (y(2) + y(3) + y(4) + y(5) + y(6))/5
...

端点の扱い方が原因で、結果は関数 filter が返す結果と異なります。

yy = smooth(y,span) は移動平均の範囲を span に設定します。span は奇数でなければなりません。

yy = smooth(y,method) は、方法 method と既定の範囲を使用して、y についてデータを平滑化します。method でサポートされている値を次の表に示します。

method

説明

'moving'

移動平均 (既定)。フィルター係数のローパス フィルターは範囲の逆数と等しくなります。

'lowess'

重み付き線形最小二乗法と 1 次多項式モデルを使用する局所回帰

'loess'

重み付き線形最小二乗法と 2 次多項式モデルを使用する局所回帰

'sgolay'

Savitzky-Golay フィルター。重みなし線形最小二乗回帰と指定した次数 (既定の設定は 2) の多項式モデルによって決定されたフィルター係数を使用する一般化された移動平均。この方法は、等間隔でない予測子データを受け入れることができます。

'rlowess'

回帰において外れ値に小さい重みを割り当てる、ロバスト バージョンの 'lowess'。この方法は、平均絶対偏差の 6 倍より離れているデータに重みゼロを割り当てます。

'rloess'

回帰において外れ値に小さい重みを割り当てる、ロバスト バージョンの 'loess'。この方法は、平均絶対偏差の 6 倍より離れているデータに重みゼロを割り当てます。

yy = smooth(y,span,method)method の範囲を span に設定します。loess および lowess 法の場合、span は合計データ点数の割合であり、1 以下です。移動平均法および Savitzky-Golay 法の場合、span は奇数でなければなりません (偶数の span は自動的に 1 減らされます)。

yy = smooth(y,'sgolay',degree) は、degree で指定された多項式の次数で Savitzky-Golay 法を使用します。

yy = smooth(y,span,'sgolay',degree) は、Savitzky-Golay の計算において span で指定されたデータ点数を使用します。span は奇数、degreespan 未満でなければなりません。

yy = smooth(x,y,...)x データをさらに指定します。x が指定されない場合、x データが必要な方法では x = 1:length(y) が仮定されます。等間隔でないまたは並べ替えられていない x データは、指定する必要があります。x が等間隔でなく、method を指定しない場合、lowess が使用されます。x を並べ替えておく必要がある平滑化法の場合、並べ替えが自動的に実行されます。

gpuarrayYY = smooth(gpuarrayY) は GPU で演算を実行します。入力 gpuarrayY は gpuArray 列ベクトルです。出力 gpuarrayYY は gpuArray 列ベクトルです。この構文には Parallel Computing Toolbox™ が必要です。

メモ

gpuArray の x および y 入力を関数 smooth で使用できますが、これは既定の 'method', 'moving' でのみ推奨されます。他の方法で GPU データを使用しても、パフォーマンス上のメリットは得られません。

すべて折りたたむ

移動平均フィルターを使用して、線形インデックスによるデータ平滑化および列ごとのデータ平滑化を別々に行います。結果をプロットして比較します。

count.dat のデータを読み込みます。24 行 3 列の配列 count には、3 つの交差点におけるある日の 1 時間ごとの交通量が含まれています。

load count.dat

範囲が 5 時間の移動平均フィルターを使用して、すべてのデータを (線形インデックスによって) 一度に平滑化します。

c = smooth(count(:));
C1 = reshape(c,24,3);

同じフィルターを使用してデータの列を別々に平滑化します。

C2 = zeros(24,3);
for I = 1:3,
    C2(:,I) = smooth(count(:,I));
end

元のデータと平滑化データ、線形インデックスによるものと列ごとのものとを別々にプロットします。その後、2 つの平滑化データセットの差をプロットします。2 つの手法では端点近くの結果が異なります。

subplot(3,1,1)
plot(count,':');
hold on
plot(C1,'-');
title('Smooth C1 (All Data)')

subplot(3,1,2)
plot(count,':');
hold on
plot(C2,'-');
title('Smooth C2 (Each Column)')

subplot(3,1,3)
plot(C2 - C1,'o-')
title('Difference C2 - C1')

loessrloess の手法を使用して平滑化されたデータの結果をプロットして比較します。その後、どちらの手法が外れ値の影響をあまり受けないかを判断します。

2 つの外れ値を含むノイズの多いデータを作成します。

x = (0:0.1:15)';
y = sin(x) + 0.5*(rand(size(x))-0.5);
y([90,110]) = 3;

loess および rloess の手法を使用し、データ点の総数の 10% 幅を使ってデータを平滑化します。

yy1 = smooth(x,y,0.1,'loess');
yy2 = smooth(x,y,0.1,'rloess');

元のデータと平滑化したデータをプロットします。外れ値はロバスト法にはあまり影響しません。

subplot(2,1,1)
plot(x,y,'b.',x,yy1,'r-')
set(gca,'YLim',[-1.5 3.5])
legend('Original data','Smoothed data using ''loess''',...
       'Location','NW')

subplot(2,1,2)
plot(x,y,'b.',x,yy2,'r-')
set(gca,'YLim',[-1.5 3.5])
legend('Original data','Smoothed data using ''rloess''',...
       'Location','NW')

ヒント

別の方法として、平滑化スプラインによる近似により、平滑化されたデータを生成することができます。詳細については、関数 fit を参照してください。

参考

|

R2006a より前に導入

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