Main Content

smooth

応答データを平滑化する

説明

yy = smooth(y) は移動平均フィルターを使用して、列ベクトル y の応答データを平滑化します。

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
...
smooth の端点の扱い方が原因で、結果は関数 filter が返す結果と異なります。

yy = smooth(y,span) は、移動平均の範囲を span に設定します。

yy = smooth(y,method) は、method で指定された方法と既定の span を使用して、y についてデータを平滑化します。

yy = smooth(y,span,method)method の範囲を span に設定します。

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

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

yy = smooth(x,y,___) は、独立変数 x の値を指定します。この構文は、これより前の構文の任意の引数で使用できます。

すべて折りたたむ

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

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

load count.dat

これを、1 つの交差点における連続 3 日間のデータであると仮定します。その場合、すべてのデータをまとめて平滑化すると、その交差点を通過する交通量の全体的なサイクルが示されます。範囲が 5 時間の移動平均フィルターを使用して、すべてのデータを (線形インデックスによって) 一度に平滑化します。

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

しかし、実際は、3 つの異なる交差点のデータです。そのため、列単位での平滑化の方が、各交差点の 1 日の交通量について、より有意義なイメージが得られます。同じ移動平均フィルターを使用してデータの各列を別々に平滑化します。

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')

Figure contains 3 axes objects. Axes object 1 with title Smooth C1 (All Data) contains 6 objects of type line. Axes object 2 with title Smooth C2 (Each Column) contains 6 objects of type line. Axes object 3 with title Difference C2 - C1 contains 3 objects of type line.

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');

元のデータと平滑化したデータをプロットします。外れ値はロバスト法 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')

Figure contains 2 axes objects. Axes object 1 contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Original data, Smoothed data using 'loess'. Axes object 2 contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Original data, Smoothed data using 'rloess'.

入力引数

すべて折りたたむ

平滑化対象のデータ。列ベクトルとして指定します。

データに NaN が含まれ、x を指定しない場合、データは不均一として扱われ、平滑化法 'lowess' が使用されます。

データ型: single | double

平滑化値を計算するためのデータ点の数。合計データ点数の割合を示す整数または範囲 (0,1) のスカラー値として指定します。

移動平均法または Savitzky-Golay 法を使用する場合、平滑化値を計算するためのデータ点の数は奇数の整数でなければなりません。span に偶数、または結果としてデータ点が偶数となる割合を指定した場合、span は自動的に 1 減らされます。

例: 7; 0.6

応答データを平滑化するための平滑化法。次のいずれかの方法として指定します。

手法

説明

'moving' (既定の設定)

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

'lowess'

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

'loess'

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

'sgolay'

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

'rlowess'

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

'rloess'

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

データ型: char | string

Savitzky-Golay 法で使用されるモデルの多項式の次数。スカラー値として指定します。degreespan 未満でなければなりません。

例: 3

応答データ y の独立変数。列ベクトルとして指定します。x を指定しない場合、x が必要な方法では x = 1:length(y) が仮定されます。y が等間隔でない、または並べ替えられていない場合は、x データを指定します。x が等間隔でなく、method を指定しない場合、lowess が使用されます。x が並べ替えられている必要がある平滑化法を指定した場合、関数は自動的に x データを並べ替えます。

データ型: single | double

出力引数

すべて折りたたむ

平滑化されたデータ。列ベクトルとして返されます。

ヒント

  • 平滑化スプラインを使用して、データの滑らかな近似を生成することができます。詳細については、fit を参照してください。

代替機能

関数 MATLAB® smoothdata を使用してデータを平滑化することもできます。GPU 配列のサポートを除いて、smoothdata には関数 smooth のすべての機能が含まれており、いくつかのメリットがあります。smooth とは異なり、関数 smoothdata は以下をサポートします。

  • 行列、table、timetable

  • 移動中央値法およびガウス法

  • NaN の処理方法を指定するオプション

  • 平滑化したデータを元の行列と置き換えるか、平滑化したデータを元の行列に追加するかを選択するオプション

  • tall 配列、C/C++ コード生成、スレッドベース環境

拡張機能

バージョン履歴

R2006a より前に導入