【MATLAB第75期】#源码分享 | 基于MATLAB的不规则数据插值实现时间序列数据扩充
如时间数据以单位1为间隔排序, 可插间隔为0.5的数据 。
一、实现效果
1.规则间隔数据
2.非规则间隔数据
二、主程序代码
1.插值测试效果
%% 清空环境变量
warning off % 关闭报警信息
close all % 关闭开启的图窗
clear % 清空变量
clc % 清空命令行
%% 导入数据(时间序列的单列数据)
y= xlsread('数据集.xlsx');
N=size(y,1);
x=1:1:N; % x也可以为不规则间隔插值 , 如x=sort(rand(N,1))
d=0.5;%间隔设置 ,根据x变量的间隔设置
p=0.01;%插值密度大于0,p值越小精度越高。
%% 测试插值效果
xt1=(x)';%测试样本 插值扩充后的x轴
xt2=xt1+p;%测试样本 插值偏移位置为 xt1和xt2坐标的中点
yti=cuts(x,y,xt2,xt1);%测试样本 插值结果
error = sqrt(sum((yti -y ).^2) ./ N);
%绘图
figure()
plot(x,y,'b-x',reshape([xt1 xt2]',[],1),reshape([yti yti]',[],1),'ro',mean([xt1 xt2],2),yti,'ro', 'LineWidth', 2)
legend('实际值','插值')
xlabel('x')
ylabel('y')
string = {'测试集插值误差';['RMSE=' num2str(error)]};
title(string)
grid
2.正式插值
%% 正式插值
x1=(0.5:1:N-0.5)';%测试样本 插值扩充后的x轴
x2=x1+p;%测试样本 插值偏移位置为 xt1和xt2坐标的中点
yi=cuts(x,y,x2,x1);%测试样本 插值结果
%绘图
figure()
plot(x,y,'b-x',reshape([x1 x2]',[],1),reshape([yi yi]',[],1),'ro',mean([x1 x2],2),yi,'ro', 'LineWidth', 2)
legend('实际值','插值')
xlabel('x')
ylabel('y')
string2 = {'插值效果'};
title(string2)
grid
3.非规则数据插值
自定义x区间范围,比如同样是100个样本,x轴编号通过随机在1:500中抽取100个数字作为x轴,y不变。也可以包含小数 ,或者自己随机定义。
xx = randperm(500); %
x=sort(xx(1:N)); % x也可以为不规则间隔插值
正式插值时x1改为:
x1=(1:10:500)';%测试样本 插值扩充后的x轴
三、代码获取
CSDN后台私信回复“75期”即可。