S_S*_*S_S 3 matlab curve-fitting data-fitting
我有一组尺寸标注N点,k作为size的矩阵N X k。
如何通过这些点找到最佳拟合线?该线的k尺寸将是一个平面(曲面)。它将具有k系数和一个偏差项。
现有的函数fit似乎仅可用于2维或3维点。
您可以使用主成分分析将超平面(或任何较低维的仿射空间)拟合到一组D维数据。这是将平面拟合到一组3D数据的示例。MATLAB文档中对此进行了更详细的说明,但是我尝试构建最简单的示例。
% generate some random correlated data
D = 3;
mu = zeros(1,D);
sqrt_sig = randn(D);
sigma = sqrt_sig'*sqrt_sig;
% generate 50 points in a D x 50 matrix
X = mvnrnd(mu, sigma, 50)';
% perform PCA
coeff = pca(X');
% The last principal component is normal to the best fit plane and plane goes through mean of X
a = coeff(:,D);
b = -mean(X,2)'*a;
% plane defined by a'*x + b = 0
dist = abs(a'*X+b) / norm(a);
mse = mean(dist.^2)
Run Code Online (Sandbox Code Playgroud)
编辑:添加了D = 3的结果示例图。我在这里利用了其他主要成分的正交性。如果您只是想证明飞机实际上确实适合数据,请忽略代码。
% plot in 3D
X0 = bsxfun(@minus,X,mean(X,2));
b1 = coeff(:,1); b2 = coeff(:,2);
y1 = b1'*X0; y2 = b2'*X0;
y1_min = min(y1); y1_max = max(y1);
y1_span = y1_max - y1_min;
y2_min = min(y2); y2_max = max(y2);
y2_span = y2_max - y2_min;
pad = 0.2;
y1_min = y1_min - pad*y1_span;
y1_max = y1_max + pad*y1_span;
y2_min = y2_min - pad*y2_span;
y2_max = y2_max + pad*y2_span;
[y1_m,y2_m] = meshgrid(linspace(y1_min,y1_max,5), linspace(y2_min,y2_max,5));
grid = bsxfun(@plus, bsxfun(@times,y1_m(:)',b1) + bsxfun(@times,y2_m(:)',b2), mean(X,2));
x = reshape(grid(1,:),size(y1_m));
y = reshape(grid(2,:),size(y1_m));
z = reshape(grid(3,:),size(y1_m));
figure(1); clf(1);
surf(x,y,z,'FaceColor','black','FaceAlpha',0.3,'EdgeAlpha',0.6);
hold on;
plot3(X(1,:),X(2,:),X(3,:),' .');
axis equal;
axis vis3d;
Run Code Online (Sandbox Code Playgroud)
Edit2:当我说“主要组件”时,我的措词有点草率(或者说是完全错误的)。我实际上是指表示主要成分的正交基向量。