网站建设结构,珠海网站制作公司,企业网站备案去哪里,如何保存自己做的网站9种缺失值插值算法Matlab代码 含三次样条插值、线性插值、Hermite插值等
使用该程序可以#xff1a;#xff08;1#xff09;实现缺失数据插值#xff1b;#xff08;2#xff09;对定义域外的样本点进行插值#xff1b;#xff08;3#xff09;区分内插和外插#x…9种缺失值插值算法Matlab代码 含三次样条插值、线性插值、Hermite插值等 使用该程序可以1实现缺失数据插值2对定义域外的样本点进行插值3区分内插和外插均可以选择不同的算法 内插策略包括 1线性插值 2最近邻点插值 3下一个邻点插值 4上一个邻点插值 5保形分段三次插值 6三次卷积插值 7修正Akima三次Hermite插值 8三次样条插值 9插入固定值 外插策略包括 1使用与内插所用相同的方法来计算落在定义域范围外的点 2为落在定义域范围外的点返回一个特定常量值 程序纯手写可修改。日常做数据分析总免不了遇到缺失值就像炒菜突然发现盐罐子空了。今天咱们来盘一盘手写实现的九宫格插值工具箱覆盖从基础线性到三次样条的各种骚操作顺便解决外插这个让人头秃的问题。先看核心函数怎么玩转内外插function yi myinterp1(x,y,xi,method,extrap_method,extrap_val) % 输入检查略过...直接上干货 valid_indices ~isnan(y); xv x(valid_indices); yv y(valid_indices); % 内插核心 switch method case 1 % 线性 yi interp1_linear(xv,yv,xi); case 8 % 三次样条 pp spline(xv,yv); yi ppval(pp,xi); % 其他case处理... end % 外拓处理 out_of_range xi min(xv) | xi max(xv); if any(out_of_range) switch extrap_method case 1 % 同内插 yi(out_of_range) interp1_extend(xv,yv,xi(out_of_range),method); case 2 % 固定值 yi(out_of_range) extrap_val; end end end这个函数骨架妙在把内外插策略解耦比如可以内插用三次样条保持曲线顺滑外插直接给固定值防止飞上天。重点看几个特色实现保形分段三次插值PCHIP的微分计算很有意思function slopes pchip_slopes(x,y) h diff(x); delta diff(y)./h; slopes zeros(size(y)); % 端点处理 slopes(1) delta(1); slopes(end) delta(end); % 中间点斜率调和 for k 2:length(x)-1 w1 2*h(k)h(k-1); w2 h(k)2*h(k-1); slopes(k) (w1w2)/(w1/delta(k-1) w2/delta(k)); end end这种加权调和算法既避免三次样条的过度震荡又比单纯的平均值更符合数据趋势。实际测试时发现对股价这类需要保持单调性的数据效果拔群。外插的智能延伸策略有点讲究比如线性外插不是简单延直线function ye linear_extend(x,y,xe) dx x(end)-x(end-1); dy y(end)-y(end-1); k dy/dx; if isinf(k) % 处理垂直情况 ye y(end)*ones(size(xe)); else ye y(end) k*(xe - x(end)); end end这里特意处理了斜率无穷大的极端情况防止出现NaN污染数据。曾经在电梯运行数据中遇到过这种垂直跳变这种防御性编程能救命。实战演示处理带缺口的心电信号t 0:0.1:10; ecg 2*sin(t) 0.5*cos(3*t); ecg(35:45) NaN; % 模拟信号丢失 % 三次样条内插固定外推 filled1 myinterp1(t,ecg,t,8,2,0); % Akima外插延续趋势 filled2 myinterp1(t,ecg,t,7,1,0); subplot(2,1,1); plot(t, filled1); % 缺口处平滑过渡 subplot(2,1,2); plot(t, filled2); % 外沿保持波形走势对比发现三次样条在缺口内部更平滑但Akima在外插时延续波形更自然。这工具箱妙在能像乐高一样组合不同策略比如用保形插值处理陡峭边缘卷积插值处理周期性信号。最后给个忠告别迷信三次样条曾有个项目用样条插值温度数据结果外插时预测出-50℃的极端值实际传感器最高才测到40℃。这种时候设置extrap_method2加个合理阈值比算法自high靠谱多了。