点の集合に曲線をフィットさせるには、回帰をordinary least-squaresとすることができます。プロセスを説明しているMathWorksのsolution pageがあります。
例として、いくつかのランダムなデータから始めましょう:希望design matrixを構築することにより、あなたはsolve the overdetermined systemにmldivide
または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))
述べたように、我々は独立変数行列(Ax=b
でA
)に複数の用語を追加することによって、高次の多項式フィッティングを得ることができます。
定数、線形、相互作用、および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));
私はどのようにPythonで同じ種類の操作を行うことができます..!?ビット助けが感謝するだろう... @Amro – diffracteD
@diffracteD:私はPythonにコードを翻訳した:https://gist.github.com/amroamroamro/1db8d69b4b65e8bc66a6 – Amro
あなたの助けに...私は確かにそれを試してみる.. ! – diffracteD