(由于不方便上传公式,有部分直接截图)
2. Polyval函数
对应多项式拟合,多项式求值函数也相当重要,可以通过设定向量,快速定义如下多项式
据此,可以大概猜测到polyval调用的形式了
y = polyval(p,x) |
如上所述 |
[y,delta] = polyval(p,x,S) |
S即为polyfit函数返回的误差估计,具体delta的数学意义本人暂时不清楚 |
y = polyval(p,x,[],mu) |
|
[y,delta] = polyval(p,x,S,mu) |
|
结合polyfit的例子,可以尝试将拟合曲线画出来
x = -10 : 0.2 : 10;
y = 0.59*x.*x + 1.4*x+2+2*(rand(1,length(x))-0.5);
plot(x,y,'.')
[p, S] = polyfit(x,y,2)
yfit = polyval(p,x);
hold on
plot(x,yfit, 'r');
结果如下图
1. Fittype函数:满足自定义复杂的拟合公式
使用fittype函数可以自定义拟合函数,可以满足线性拟合和非线性拟合。Fittype函数具有很灵活的配置,基本满足各种复杂场景,有相应的cftool工具箱。这里简要的介绍一下fittype的使用方式
aFittype = fittype(libraryModelName)
Fittype = fittype(expression)
使用如上两种方式,可以使用MATLAB已经实现的拟合算法或者使用自定义的拟合算法(可以引用.m文件),具体算法有‘poly11’,‘poly2’,‘linearinterp’等,具体详见fittype的文档说明。
Fittype = fittype(expression,Name,Value) constructs the fit type with additional options specified by one or more Name,Value pair arguments.
这是常用公式,使用如下
g = fittype('a*time^2+b*time+c','independent','time','dependent','height');
可以制定拟合公式,变量和因变量,
g =
General model:
g(a,b,c,time) = a*time^2+b*time+c
使用fittype拟合polyfit例子的数据,如下
ftype = fittype('a*x.^2+b*x+c', 'independent', 'x', 'dependent', 'y');
pf = fit(x',y',ftype)
结果如下
>> pf =
General model:
pf(x) = a*x.^2+b*x+c
Coefficients (with 95% confidence bounds):
a = 0.5888 (0.585, 0.5927)
b = 1.398 (1.377, 1.418)
c = 2.04 (1.865, 2.216)
给出95%的置信率。
如果x为行向量,则如下报错
Error using fit>iFit (line 127)
X must be a matrix with one or two columns.
结合上述几个函数,我们做一个逻辑回归的sigmoid函数拟合,具体场景见《分类算法之逻辑回归》
x=2:2:20; %月薪
y=[zeros(1,5) ones(1,5)]; %满意度
%简单的线性拟合
p1=polyfit(x,y,1);
%高阶线性拟合
p5=polyfit(x,y,5);
%sigmoid函数拟合
sf=fittype('1/(1+exp(-a*(x-10)))', 'independent', 'x');
ps=fit(x',y',sf)
%拟合结果展示
figure
plot(x,y,'o')
hold on
xp=linspace(min(x), max(x));
y1=polyval(p1,xp);
y5=polyval(p5,xp);
ys=1./(1+exp(-ps.a*(xp-10)));
plot(xp, y1, 'r');
plot(xp, y5, 'g');
plot(xp, ys, 'k');
hold off