插值和拟合区别简述
插值算法是要严格经过样本点,在数据样本点的损失为0,但是对于拟合来说仅仅是在数据样本点中寻找出所存在的规律,用一条和数据样本点相似趋势函数进行表示,具有一定的损失。并不是损失越小效果越好,因为损失过小可能造成过拟合的情况,对于拟合来说,能在一定程度上避免过拟合,但是并不是不存在过拟合。
线性拟合函数
线性函数:
y ˆ i = k x i + b \text{\^{y}}_i=kx_i+b yˆi=kxi+b
线性损失函数通常用均方误差:
k ˆ , b ˆ = a r g m i n k , b ( ∑ i = 1 n ( y i − y ˆ i ) 2 ) \text{\^{k}},\text{\^{b}}=arg~\underset{k,b}{min}(\sum_{i=1}^n(y_i-\text{\^{y}}_i)^2) kˆ,bˆ=arg k,bmin(i=1∑n(yi−yˆi)2)
所以我们的目标函数就是使损失函数尽可能的小,那么就有了:
L = ∑ i = 1 n ( y i − k x i − b ) 2 L=\sum_{i=1}^{n}(y_i-kx_i-b)^2 L=i=1∑n(yi−kxi−b)2
现在要找使
L
L
L最小的
k
,
b
k,b
k,b 我们通常使用最小二乘法,就是求导数的极值点(凸函数)就是最优解:
拟合优度的引入
特别注意只适用于参数线性函数,因为
S
S
T
=
S
S
E
+
S
S
R
SST=SSE+SSR
SST=SSE+SSR证明时需要线性推导依赖于参数线性函数,若不是参数线性函数就一般使用均方误差来衡量拟合程度。若出现
R
2
<
0
R^2<0
R2<0说明模型拟合结果还没有一条平均线效果好
拟合优度的证明
参数线性函数
像
y
=
a
2
x
+
b
,
y
=
a
2
b
x
y=a^2x+b,y=\frac{a^2}{b}x
y=a2x+b,y=ba2x均是非参数线性函数
MATLAB代码模拟
MATLAB验证使用:
load xy.mat
plot(x,y,'o')
xlabel('x的值')
ylabel('y的值')
n = size(x,1);
k = (n*sum(x.*y)-sum(x)*sum(y))/(n*sum(x.*x)-sum(x)*sum(x));
b = (sum(x.*x)*sum(y)-sum(x)*sum(x.*y))/(n*sum(x.*x)-sum(x)*sum(x));
hold on % 继续在之前的图形上来画图形
grid on % 显示网格线
f=@(x) k*x+b;%定义线性函数
plot([2.5,7],[f(2.5),f(7)]);
legend('样本数据','拟合函数','location','SouthEast')
y_hat = k*x+b; % y的拟合值
SSR = sum((y_hat-mean(y)).^2); % 回归平方和
SSE = sum((y_hat-y).^2); % 误差平方和
SST = sum((y-mean(y)).^2); % 总体平方和
SST-SSE-SSR;
R_2 = SSR / SST
xy.mat:
cftool模拟
tool名称:Curvel Fitting
生成代码和保存图像:
不收敛
给出了近2个世纪的美国人口统计数据(单位:百万人)
t = 1790:10:2000;
x =[3.9,5.3,7.2,9.6,12.9,17.1,23.2,31.4,38.6,50.2,62.9,76.0,92.0,106.5,123.2,131.7,150.7,179.3,204.0,226.5,251.4,281.4];
没有收敛:
改变优化算法初始值就可以了(多试试)。
原因:主要是因为模拟的函数并不是凸函数造成在梯度下降算法求最优解的时候陷入了极值点或者陷入了鞍点,但是不是最值点,所以需要调整初始值。