大きさが異なるデータの正規化
この例では、griddata
を使った散布データの内挿の結果を、正規化を使用して改善する方法を説明します。正規化を使用すると、内挿の結果を改善できる場合もありますが、解の精度が低下する場合もあります。正規化を使用するかどうかは、内挿するデータの性質に基づいて判断します。
利点: データを正規化すると、独立変数の単位がそれぞれ異なり、そのスケールも大幅に異なる場合に、内挿の結果が改善される可能性があります。この場合、大きさが同じくらいになるように入力をスケーリングすると、内挿の数値的側面が改善されることがあります。正規化したほうがよい例は、
x
が 500 ~ 3500 RPM のエンジン速度を表し、y
が 0 ~ 1 のエンジン負荷を表している場合です。x
とy
のスケールが数桁分異なり、単位も異なります。注意: 変数のスケールが異なっていても、独立変数の単位が同じ場合には、データを正規化する際に注意が必要です。同じ単位のデータの場合、正規化すると、方向バイアスの追加によって解に歪みが生じ、それが基となる三角形分割に影響し、最終的には内挿の精度が低下します。正規化がエラーになる例は、
x
とy
がいずれも場所を表していて、単位がメートルの場合です。x
とy
は等しくスケーリングすることを推奨します。10 m 真東は、10 m 真北と空間的に同じでなければならないからです。
y
の値が x
の値より数桁分大きいサンプル データを作成します。x
と y
は単位が異なると仮定します。
x = rand(1,500)/100; y = 2.*(rand(1,500)-0.5).*90; z = (x.*1e2).^2;
サンプル データを使用して、クエリ点のグリッドを構築します。グリッド上でサンプル データを内挿し、結果をプロットします。
X = linspace(min(x),max(x),25); Y = linspace(min(y),max(y),25); [xq, yq] = meshgrid(X,Y); zq = griddata(x,y,z,xq,yq); plot3(x,y,z,'mo') hold on mesh(xq,yq,zq) xlabel('x') ylabel('y') hold off
griddata
で生成された結果は、あまり滑らかではなく、ノイズが多く見えます。これは、独立変数のスケールが異なることが原因です。一方の変数のサイズをわずかに変更しただけで、もう一方の変数のサイズが大きく変わる可能性があるからです。
x
と y
は単位が異なるため、大きさが同じくらいになるように正規化すると、より適切な結果が生成されるはずです。z スコアを使用してサンプル点を正規化し、griddata
を使用して内挿を再生成します。
% Normalize Sample Points x = normalize(x); y = normalize(y); % Regenerate Grid X = linspace(min(x),max(x),25); Y = linspace(min(y),max(y),25); [xq, yq] = meshgrid(X,Y); % Interpolate and Plot zq = griddata(x,y,z,xq,yq); plot3(x,y,z,'mo') hold on mesh(xq,yq,zq)
この場合、サンプル点を正規化すると、griddata
でより滑らかな解を計算できます。