2013-08-31 17 views
12

私はa,b個の離散した規則的なグリッドとそれに対応するcの値を持っており、それをさらに補間して滑らかな曲線を得る。補間データから、私はさらにカーブフィッティングのための多項式を作成したいと思います。 3Dプロットを多項式に当てはめるには?3Dカーブフィッティング

私はこれをMATLABで実行しようとしています。 MATLAB(r2010a)でサーフェスフィッティングツールボックスを使用して、フィットした3次元データをカーブさせました。しかし、MATLAB/MAPLEや他のソフトウェアでは、データセットに最適な数式をどのように見つけることができますか?何かアドバイス?また、最も参考になるのは、実際のコード例、PDFファイル、Webなどです。

これは私のデータの一部です。

a = [ 0.001 .. 0.011]; 

b = [1, .. 10]; 

c = [ -.304860225, .. .379710865]; 

ありがとうございます。

答えて

15

点の集合に曲線をフィットさせるには、回帰をordinary least-squaresとすることができます。プロセスを説明しているMathWorksのsolution pageがあります。

例として、いくつかのランダムなデータから始めましょう:希望design matrixを構築することにより、あなたはsolve the overdetermined systemmldivideまたはpinvを使用することができ、@BasSwinckelsが示したとおり

% some 3d points 
data = mvnrnd([0 0 0], [1 -0.5 0.8; -0.5 1.1 0; 0.8 0 1], 50); 

Ax=bように表現:

% best-fit plane 
C = [data(:,1) data(:,2) ones(size(data,1),1)] \ data(:,3); % coefficients 

% evaluate it on a regular grid covering the domain of the data 
[xx,yy] = meshgrid(-3:.5:3, -3:.5:3); 
zz = C(1)*xx + C(2)*yy + C(3); 

% or expressed using matrix/vector product 
%zz = reshape([xx(:) yy(:) ones(numel(xx),1)] * C, size(xx)); 

次に、結果を視覚化します。

% plot points and surface 
figure('Renderer','opengl') 
line(data(:,1), data(:,2), data(:,3), 'LineStyle','none', ... 
    'Marker','.', 'MarkerSize',25, 'Color','r') 
surface(xx, yy, zz, ... 
    'FaceColor','interp', 'EdgeColor','b', 'FaceAlpha',0.2) 
grid on; axis tight equal; 
view(9,9); 
xlabel x; ylabel y; zlabel z; 
colormap(cool(64)) 

1st_order_polynomial


述べたように、我々は独立変数行列(Ax=bA)に複数の用語を追加することによって、高次の多項式フィッティングを得ることができます。

定数、線形、相互作用、および2乗項(1、x、y、xy、x^2、y^2)で二次モデルを適合させたいとします。私たちは、これを手動で行うことができます。

C = x2fx(data(:,1:2), 'quadratic') \ data(:,3); 
zz = x2fx([xx(:) yy(:)], 'quadratic') * C; 
zz = reshape(zz, size(xx)); 

が最後に優れている。また、モデルの受注のカップルのための計画行列を構築するのに役立ちますStatistics Toolboxの中にヘルパー関数x2fxあり

% best-fit quadratic curve 
C = [ones(50,1) data(:,1:2) prod(data(:,1:2),2) data(:,1:2).^2] \ data(:,3); 
zz = [ones(numel(xx),1) xx(:) yy(:) xx(:).*yy(:) xx(:).^2 yy(:).^2] * C; 
zz = reshape(zz, size(xx)); 

あなたが関与多項式オーダーや用語のすべての種類を指定することができますジョンD'エリコにより、ファイル交換の機能polyfitn

model = polyfitn(data(:,1:2), data(:,3), 2); 
zz = polyvaln(model, [xx(:) yy(:)]); 
zz = reshape(zz, size(xx)); 

2nd_order_polynomial

+0

私はどのようにPythonで同じ種類の操作を行うことができます..!?ビット助けが感謝するだろう... @Amro – diffracteD

+2

@diffracteD:私はPythonにコードを翻訳した:https://gist.github.com/amroamroamro/1db8d69b4b65e8bc66a6 – Amro

+0

あなたの助けに...私は確かにそれを試してみる.. ! – diffracteD

3

あり、ファイル交換にいくつかの優れた機能かもしれませんが、手でそれを行うための一つの方法はこれです:

同様
x = a(:); %make column vectors 
y = b(:); 
z = c(:); 

%first order fit 
M = [ones(size(x)), x, y]; 
k1 = M\z; 
%least square solution of z = M * k1, so z = k1(1) + k1(2) * x + k1(3) * y 

、あなたは、2次のフィットを行うことができます

%second order fit 
M = [ones(size(x)), x, y, x.^2, x.*y, y.^2]; 
k2 = M\z; 

あなたが与えた限られたデータセットに数値的な問題があるようです。詳細についてはhelp mldivideを入力してください。

は、いくつかの規則的な格子の上に補間を行うには、そのように行うことができます。

ngrid = 20; 
[A,B] = meshgrid(linspace(min(a), max(a), ngrid), ... 
       linspace(min(b), max(b), ngrid)); 
M = [ones(numel(A),1), A(:), B(:), A(:).^2, A(:).*B(:), B(:).^2]; 
C2_fit = reshape(M * k2, size(A)); % = k2(1) + k2(2)*A + k2(3)*B + k2(4)*A.^2 + ... 

%plot to compare fit with original data 
surfl(A,B,C2_fit);shading flat;colormap gray 
hold on 
plot3(a,b,c, '.r') 

A 3次適合は以下TryHardによって与えられた式を使用して行われますが、式はすぐに退屈になることができたときに注文が増えます。 Mxyorderとなるような関数を書くのが良いです。

+1

M = [ones(size(x))、x、y、x。^ 2、x。* y、y。^ 2、x。^ 3、x ^^ * y、x。* y。^ 2、y。^ 3] 'かなり良い仕事をしています... –

+0

ごめんなさい! Bas Swinckelsに返信いただきありがとうございます。ニースの解決策。しかし、コードやMATLABの任意のツールを使用して最適な数式/方程式を見つける方法はありますか?与えられたデータセットに最も適した数式を見つける方法は? – Syeda

+0

私もこの警告を受けています。警告:順位不足、ランク= 5、対= 9.9961e-013。これが何を意味するのか理解してもらえますか?ありがとうございました。 – Syeda

2

これは具体的な実装よりも哲学的な質問のように聞こえます。具体的には、「どのようにして、一連のデータに最も適した式を見つけるのですか?私の経験では、の選択あなたは達成しようとしているものに応じて行う必要があります。

"ベスト"を定義するものは何ですか?データフィッティングの問題では、多項式係数の追加を続けて、より良いR^2値を作成し続けることができますが、最終的にはデータにフィットします。高次の多項式の欠点は、応答サーフェスに合わせて使用​​したサンプルデータの範囲外の動作です。これは、モデル化しようとしているものには適していない可能性があります。 。

フィッティングしているシステム/データの物理的な動作を把握していますか?これは、数式モデルを作成するために使用する式の組の基礎として使用できます。私のお勧めは、あなたが逃げることができる最も経済的な(シンプルな)モデルを使うことです。