Matlab 实现简单RBF曲面拟合
先看看RBF拟合的效果
拟合好的,数据间隔1,验证间隔0.5,Sigma4
拟合好的,数据间隔2,验证间隔0.1,Sigma=4
RBf拟合全代码
% 清空
clc;
clear all;
%生成训练数据
R = 500;
x = -sqrt(R):1:sqrt(R);
y = -sqrt(R):1:sqrt(R);
[ Row Col ] = size(x);
cnt = 1;
for i=1:1:Col
for j=1:1:Col
xt(cnt) = x(i);
yt(cnt) = y(j);
zt(cnt) = sqrt(R^2-x(i)^2-y(j)^2);
cnt = cnt + 1;
end
end
Sigma = 10;
weight = calculate_weights(xt,yt,zt,Sigma);
% 生成数据验证RBF网络计算结果
xS = -sqrt(R):0.5:sqrt(R);
yS = -sqrt(R):0.5:sqrt(R);
cnt = 1;
[ Row Col ] = size(yS);
for i=1:1:Col
for j=1:1:Col
xt1(cnt) = xS(i);
yt1(cnt) = yS(j);
zt1(cnt) = sqrt(R^2-xS(i)^2-yS(j)^2);
cnt = cnt + 1;
end
end
% 根据RBF计算的验证位置的Z数据
zpre = calculate_rbf_value(weight,Sigma,xt1,yt1,xt,yt);
plot3(xt,yt,zt,'g*');
hold on;
plot3(xt1,yt1,zpre,'ro');
hold off;
calculate_weights计算函数
function [ Weight ] = calculate_weights( X,Y,Z,Sigma )
%UNTITLED3 此处显示有关此函数的摘要
% 此处显示详细说明
[ Row Col ] = size(X);
if Row > Col
Size = Row;
else
Size = Col;
end
for i= 1:Size
for j = 1:Size
Mat(i,j) = Gaussian(X(j),Y(j),X(i),Y(i),Sigma);
end
end
[ Row Col ] = size(Z);
if Row < Col
Z = Z';
end
% Weight = inv(Mat) * Z;
Weight = Mat\Z;
end
高斯核函数
function [ Fg ] = Gaussian( X,Y,Xc,Yc,Sigma )
%UNTITLED2 此处显示有关此函数的摘要
% 此处显示详细说明
Fg = exp(-((X-Xc)^2+(Y-Yc)^2)/(2*Sigma^2));
end
根据RBf值计算任意位置的数据
function [ Z ] = calculate_rbf_value( Wight,Sigma,X,Y,Xc,Yc )
%UNTITLED4 此处显示有关此函数的摘要
% 此处显示详细说明
[ Row Col ] = size(X);
if Row > Col
Size1 = Row;
else
Size1 = Col;
end
[ Row Col ] = size(Xc);
if Row > Col
Size2 = Row;
else
Size2 = Col;
end
%通过RBF网络计算值
for i = 1:Size1
Z(i) = 0;
for j=1:Size2
Z(i) = Z(i) + Wight(j) * Gaussian(X(i),Y(i),Xc(j),Yc(j),Sigma);
end
end
end
问题
- 如何快速计算矩阵的逆;
- 如何自动决策数据点采样间隔问题;
- 如何加入平滑项在忠实数据和平滑之间做出取舍;
- Sigma值如何自动决策取值,同样的数据不同的Sigma拟合效果并不好,Sigma过小拟合效果很差,比如说1;