假若现在我们有如下的二维散点:
x=1:10;
y=[99.999 50.499 20.333 10.788 4.8111 2.7500
1.2322 0.4861 0.29501 0.1113498];
在了解这些散点的大致分布之后,我们可以自己定义和其有相同单调性的函数来对散点进行拟合。
看其分布有点像对数函数,也有点像反函数,我们可以自定义函数:
y = a*log(x)+b/x+c;
两个在(0,+∞)递减的函数加上一个常数,其中散点在x较小的时候比较像对数log,x较大的时候比较像1/x。对于两个函数的系数(即权重),可以通过代码运行得到。
以下为拟合散点的步骤:
①
函数文件:(beta为三个需要拟合的系数)
function y = volum(beta,x)
y = beta(1)*log(x)+beta(2)./x+beta(3);
end
m文件:
clc;clear
x=1:10;
y=[99.999 50.499 20.333 10.788 4.8111 2.7500 1.2322 0.4861 0.29501 0.1113498];
beta=nlinfit(x,y,'volum',[0,0,0])
m文件生成了三个数,就是对应的beta的值
我们尝试一下把生成的自定义函数和散点画到一个图,看看拟合效果
clc;clear
x=1:10;
y=[99.999 50.499 20.333 10.788 4.8111 2.7500 1.2322 0.4861 0.29501 0.1113498];
beta=nlinfit(x,y,'volum',[0,0,0])
x0 = 0:0.1:10;
y0 = 3.1053*exp(-x0)+123.9659./x0-21.8691;
plot(x0,y0,'b')
hold on
plot(x,y,'*')
xlabel('x')
ylabel('y')
拟合效果看起来还不错(由于数值太大,容易过拟合)
以上是我所举的一个小例子,介绍了自定义函数拟合有分布规律的离散点的方法