matlab把拟合的平面导出来,在MATLAB中将平面拟合到N维点

您可以使用主成分分析将超平面(或任何低维仿射空间)拟合到一组D维数据.这是将平面拟合到一组3D数据的示例.这在

MATLAB documentation中有更详细的解释,但我试图构建我能做的最简单的例子.

% 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)

编辑:添加了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;

uEueZm.png

YybTZm.png

编辑2:当我说“主要成分”时,我的措辞有点草率(或者说是完全错误的).我实际上指的是表达主成分的正交基矢量.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值