写在前面的话:拿到每一份数据时请认真思考我们应该做些什么怎么做?
在真实数据中,我们拿到的数据可能包含了大量的缺失值,可能包含大量的噪音,也可能因为人工录入错误导致有异常点存在,非常不利于算法模型的训练。因此数据的预处理也就变得格外重要!
首先,需要明白插值问题和拟合的区别和联系
- 联系
虽然两者都是根据实际中一组已知数据来构造一个能够反映数据变化规律的近似函数的方法。 - 区别
拟合需要得到近似函数表达式,而插值问题仅需要通过插值方法找到未知点的对应值。
一维插值
例 1 :通过温度计我们测得大连某天01:00至12:00温度如下表(一小时一测);试估计每隔15分钟的温度值。
Matlab代码:
hours=1:12;
temps=[28 27 26 26 25 27 28 28 30 30 32 34];
h=1:0.25:12;
%插值(插值方法有:'nearest'最近邻插值;'linear'线性插值;
%'spline'三次样条插值;'cubic'立方插值);缺省时 分段线性插值
t=interp1(hours,temps,h,'spline');
%作图
plot(hours,temps,'+',h,t,hours,temps,'r:');
xlabel('Hour'),ylabel('Degrees Celslus');
网格节点数据的插值
我们测得一4x5网格点处水域水深情况如下表(单位:英尺),试作出区域内水深的分布曲面 H=f(x,y) 的图形。注:1 英尺 = 0.3048 米
Matlab 代码:
x=1:5;
y=1:4;
depth=[68 89 67 79 67
57 71 86 77 63
76 69 78 70 78
69 79 85 65 81];
mesh(x,y,depth)
%[xi,yi] = meshgrid(0:0.1:5);%注意使用meshgrid时要矩阵输入
%surf要求维度一致
xi=1:0.2:5;
yi=1:0.2:4;
[xi,yi]=meshgrid(xi,yi);
Hi=interp2(x,y,depth,xi,yi,'cubic');%插值方法有:‘nearest’最邻近插值 ‘linear’双线性插值 ‘cubic’双三次插值 注:缺省时 双线性插值
mesh(Hi,yi,zi);
结果:
散点数据的插值计算
我国东部和南部大陆海岸线1.8万多千米,拥有丰富的海洋资源和便利的海运条件;在某海域测得一些点(x,y)处的水深z由下表给出,船的吃水深度为5英尺,在矩形区域(-75,175)×(-50,150)里的哪些地方船要避免进入。
Matlab 代码
x=[ 140 103.5 88 185.5 195 105 157.5 107.5 77 81 162 162 117.5];
y=[7.5 141.5 23 147 22.5 137.5 85.5 -6.5 -81 3 56.5 -66.5 84 -33.5];
z=[4 8 6 8 6 8 8 9 9 8 8 9 4 9];
x1=75:1:200;
y1=-50:1:150;
[x1,y1]=meshgrid(x1,y1);
z1=griddata(x,y,z,x1,y1,'v4');%插值方法:‘nearest’最邻近插值 ‘linear’双线性插值 ‘cubic’双三此插值 ‘v4’Matlab提供的插值方法
subplot(121);
meshc(x1,y1,z1);
%set(gca,'zdir','reverse');% set 的使用是为了调整坐标轴,以便于我们更好的进行分析
%筛选出需要规避的范围范围
z1(z1>=5)=nan;
subplot(122);
meshc(x1,y1,z1);
%set(gca,'zdir','reverse');%
结果
若使用 set 结果如下:
最后 给出Matlab对set的使用介绍!
希望大家有所收获!