插值
2的拉格朗日插值用的其实比较少, 可以看一下了解一下插值的原理
主要看看3里的结论和4的实现代码
文章目录
1. 定义
插值和拟合都是通过一组数据点构造一个函数作为近似
- 插值就是要这个函数通过给定的数据点,
- 拟合就是不一定要通过数据点, 但是要反映数据的大体变化趋势,
应用上的区别:
-
插值一般用于样本区间内的插值计算
-
拟合与插值不同的是, 拟合可以用于预测, 从数据中获得一般性经验
-
插值主要侧重点是得到值, 拟合侧重点是得到函数关系
-
如果样本数据为精确数据,适合采用数据插值方法;如果样本数据为统计数据或存在误差,则适合用曲线拟合的方法。
2.拉格朗日插值
一般不用, 因为经常会出现rouge现象, 拟合效果一般
2.1 概念
对每个点弄一个基函数, 再加起来插值函数
举例:
比如对于点x1
-
我弄一个函数使得在x = x1时函数值为1, x取其他样本点(x2, x3)都是0
-
再把这个函数乘y1(样本点x1的y值), 叫这个函数L1, 也就是我们要的基函数
-
那么这个函数L1有以下性质
(1) 有 L1(x1) = y1 也就是必然经过当前想要插入的样本点
(2) L1(x2或者x3) = 0 也就是在后面把这些基函数加起来得到插值函数的时候, 当前基函数不要影响到插值函数经过别的样本点
对其他点都这么做之后, 再把这些基函数都加起来就可以保证最后的插值函数可以经过所有的样本点
3. Rouge现象
3.1 是什么
不要简单的认为次数越高对样本点的拟合越好
(跟深度学习里的过拟合差不多的意思)
不要使用七次以上的函数去插值, 不然最后会得到一个震荡剧烈的函数(x绝对值越大震荡越厉害), 拟合真实函数的效果非常差
3.2 如何避免
将插值函数分成小区间, 用低次函数插值(二次三次)
4. MATLAB实现代码
4.1 一维插值
内置函数
interp1()
> 注: 这里是p1数字1, 不是l
4.2 函数原型
yi = interp1(x, y, xi, 'method')
4.3 参数解释
-
x, y: 插值点, 也就是2.1里说的样本点
-
xi: 被插点横坐标, 就是指定哪些横坐标去生成yi
-
yi: 返回一堆纵坐标, 插值的结果
-
method:
-
'nearest'
最近邻插值 -
'linear'
线性插值(默认) * -
'spline'
三次样条插值 ** -
'cubic'
立方插值
名词不懂的自己搜一下
只解释一下样条, 就是3.2中介绍的方法, 把整个区间分成小区间进行低次插值, 这样能避免Rouge现象
打星号的常用, 星星越多越常用
-
4.4 举例
clc
clear
% 真实函数中采样的用于插值的点
x = rand(10, 1);
x = sort(x);
x = (x - 1)*pi;
y = sin(x);
% 随机的被插点横坐标
xi = rand(5, 1);
xi = (xi - 1).*pi
% 用于画出真实函数sin(x)
x_plot = linspace(-pi./2, pi./2, 100);
y_plot = sin(x_plot)
% MATLAB内置插值函数求解
yi = interp1(x, y, xi);
% 画图
plot(x, y, '*r', xi, yi, 'pb', x_plot, y_plot, '-y');
4.5 二维插值
跟一维插值基本一样, MATLAB内置函数interp2()
函数原型:
zi = interp2(x, y, z, xi, yi, 'method');
参数介绍:
-
x, y: 要求一个是行向量一个是列向量, 只要不是都行或者都列就行
-
method:
'nearest'
最近邻插值'linear'
双线性插值(默认) *'spline'
样条插值'cubic'
双立方插值 **
打星号的常用, 效果一般不错, 星星越多越常用
4.6 散乱点插值
内置函数griddata()
函数原型
zi = griddata(x, y, z, xi, yi, 'method');
4.7 插值方法的选用
上面讲过了, 再提一遍
一维插值用样条
二维插值用立方
5. python实现
用pandas.DataFrame对象的方法interpolate()
注意:
interpolate()只能用在Series
这个方法也可以在数学建模的数据清洗阶段填充缺失值
重要参数:
method指定方法 method='spline’样条 order=3 三次样条
示例:
s1.interpolate()
df[‘col’].interpolate()