Main Content

大きさが異なるデータの正規化

この例では、griddata を使った散布データの内挿の結果を、正規化を使用して改善する方法を説明します。正規化を使用すると、内挿の結果を改善できる場合もありますが、解の精度が低下する場合もあります。正規化を使用するかどうかは、内挿するデータの性質に基づいて判断します。

  • 利点: データを正規化すると、独立変数の単位がそれぞれ異なり、そのスケールも大幅に異なる場合に、内挿の結果が改善される可能性があります。この場合、大きさが同じくらいになるように入力をスケーリングすると、内挿の数値的側面が改善されることがあります。正規化したほうがよい例は、x が 500 ~ 3500 RPM のエンジン速度を表し、y が 0 ~ 1 のエンジン負荷を表している場合です。xy のスケールが数桁分異なり、単位も異なります。

  • 注意: 変数のスケールが異なっていても、独立変数の単位が同じ場合には、データを正規化する際に注意が必要です。同じ単位のデータの場合、正規化すると、方向バイアスの追加によって解に歪みが生じ、それが基となる三角形分割に影響し、最終的には内挿の精度が低下します。正規化がエラーになる例は、xy がいずれも場所を表していて、単位がメートルの場合です。xy は等しくスケーリングすることを推奨します。10 m 真東は、10 m 真北と空間的に同じでなければならないからです。

y の値が x の値より数桁分大きいサンプル データを作成します。xy は単位が異なると仮定します。

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 で生成された結果は、あまり滑らかではなく、ノイズが多く見えます。これは、独立変数のスケールが異なることが原因です。一方の変数のサイズをわずかに変更しただけで、もう一方の変数のサイズが大きく変わる可能性があるからです。

xy は単位が異なるため、大きさが同じくらいになるように正規化すると、より適切な結果が生成されるはずです。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 でより滑らかな解を計算できます。

参考

| |