我是靠谱客的博主 醉熏路人,最近开发中收集的这篇文章主要介绍matlab平滑曲线_数据预处理——噪声值平滑处理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

点击上方“蓝字”关注我们 dfbbc05fc571a931a221cdf34a2505fe.png 87eebb21fd8b5d3a114b8bc4be89643f.gif

数据预处理中对于数据清洗的时候对于离群值和噪声值的处理是关键的一环。

灵魂歌手水云天:数据预处理小结

上文对于数据预处理做了一个总结,本文关于噪声值的处理提供下面4个函数来学习。

1、smooth(曲线拟合工具箱)

2、smoothts(金融工具箱)(smoothts will be removed in a future release. Use smoothdata instead.)

由于官方将会将smoothts函数用smoothdata函数替换,因此这里详细介绍smoothdata函数的使用。

3、medfilt1(信号处理工具箱)

一、 smooth 9f6f2427e48d4be7f123c25722522572.gif

yy = smooth(y)

yy = smooth(y,span) 

yy = smooth(y,method)

yy = smooth(y,span,method)

注意:

1、此处span为窗宽,简单理解为用于计算平滑值的数据点数,默认为52、method为平滑方法,具体方法如下:

ffbbb0bc36e25fdd328df2b6d901c886.png

smooth函数具体调用格式请参考官网:

Smooth response data - MATLAB smooth - MathWorks 中国

下面使用正弦波和随机生成的噪声波来显示smooth的平滑处理结果

%% 产生加噪正弦波信号,绘制加噪波形图t = linspace(0,2*pi,500)';      

% 产生一个从0到2*pi的向量,长度为500y = 100*sin(t);                  

% 产生正弦波信号

%%   产生500行1列的服从N(0,152)分布的随机数,作为噪声信号

noise = normrnd(0,15,500,1);

y = y + noise;                   

% 将正弦波信号加入噪声信号

figure;                          

plot(t,y);                      

xlabel('t');                    

ylabel('y = sin(t) + 噪声');  

e108115e64446b3177d54f59e4db20cd.png

首先使用移动平滑法:

%%  移动平滑法
yy1 = smooth(y,30);      % 利用移动平均法对y进行平滑处理
figure;                  
plot(t,y,'k:');        
hold on;
plot(t,yy1,'b','linewidth',3);  
xlabel('t');                  
ylabel('moving');              
legend('加噪波形','平滑后波形');

e01ad752b6cce15b443fde147fe757e4.png

%%  移动平滑法

yy1 = smooth(y,30);      % 利用移动平均法对y进行平滑处理

figure;                  

plot(t,y,'k:');         

hold on;

plot(t,yy1,'b','linewidth',3);  

xlabel('t');                   

ylabel('moving');              

legend('加噪波形','平滑后波形');

%%   利用lowess方法对加噪信号进行平滑处理

yy2 = smooth(y,30,'lowess');  % 利用lowess方法对y进行平滑处理

subplot(221);

plot(t,y,'k:');              

hold on;

plot(t,yy2,'b','linewidth',3); 

xlabel('t');                  

ylabel('lowess');             

 legend('加噪波形','平滑后波形');

%%  利用rlowess方法对加噪信号进行平滑处理

yy3 = smooth(y,30,'rlowess');  % 利用rlowess方法对y进行平滑处理                      

subplot(222);

plot(t,y,'k:');                

hold on;

plot(t,yy3,'b','linewidth',3); 

xlabel('t');                    

ylabel('rlowess');             

legend('加噪波形','平滑后波形');

%% 利用loess方法对加噪信号进行平滑处理

yy4 = smooth(y,30,'loess');  % 利用loess方法对y进行平滑处理               

subplot(223);

plot(t,y,'k:');             

hold on;

plot(t,yy4,'b','linewidth',3);  % 绘制平滑后波形图xlabel('t');       % 为X轴加标签

ylabel('loess');        % 为Y轴加标签

legend('加噪波形','平滑后波形');

%%   利用sgolay方法对加噪信号进行平滑处理

yy5 = smooth(y,30,'sgolay',3);  % 利用sgolay方法对y进行平滑处理

subplot(224);

plot(t,y,'k:');                

hold on;

plot(t,yy5,'b','linewidth',3);  

xlabel('t');                    

ylabel('sgolay');              

legend('加噪波形','平滑后波形');

f8f7f0add9921a64b51fc106d6e0060f.png

二、 smoothdata 9f6f2427e48d4be7f123c25722522572.gif

调用格式:

B = smoothdata(A) 

%使用以启发方式确定的固定窗口长度返回向量元素的移动平均值。

%窗口向下滑动向量的长度,计算每个窗口中的元素的平均值。

%如果 A 为矩阵,smoothdata 计算每列的移动平均值。

%如果 A 是多维数组,则 smoothdata 沿大小不等于 1 的第一个维度进行运算。

%如果 A 是包含数值变量的表或时间表,则 smoothdata 针对每个变量单独执行运算。

B = smoothdata(A,dim)

 %沿 A 的维度 dim 执行运算。例如,如果 A 是一个矩阵,

%则 smoothdata(A,2) 对 A 中的每行数据进行平滑处理。

B = smoothdata(___,method) 

%为上述任一语法指定平滑处理方法。例如,B = smoothdata(A,'sgolay') 

%使用 Savitzky-golay 滤波器对 A 中的数据进行平滑处理。

B = smoothdata(___,method,window) 

%指定平滑处理方法使用的窗口长度。例如,smoothdata(A,'movmedian',5) 

%通过求五元素移动窗口的中位数,来对 A 中的数据进行平滑处理。

注意:smoothdata函数在旧版本中为smooths函数,在后续新版本中将会移除smoothts函数,使用smoothdata替代。

首先将数据文件从当前文件夹导入到MATLAB中,可以使用xlsread等函数导入xls文件可以参考下面这篇文章

灵魂歌手水云天:MATLAB中文件的操作

此处以网上一组数据——某日某城市股市日收盘价来学习smoothdata函数,导入之后的数据为一个向量price,绘制该数据的散点图如下:

e82ca7741177a8a1c8ec86b457941074.png

函数smoothdata共支持八种平滑方法,类似上面的smooth函数,分别是:‘movmean'、'movmedian'、'gaussian'、'lowess'、'loess'、'rlowess'、'rloess' 或 'sgolay'。下面使用'movmean'、'movmedian'、'gaussian'和'sgolay'平滑。

%% 使用movmean法对数据平滑

output1 = smoothdata(price,'movmean',30);     % 用movmean法平滑数据,窗宽为30

output2 = smoothdata(price,'movmean',100);    % 用movmean法平滑数据,窗宽为100                 subplot(221);

plot(price,'.'); 

hold  on

plot(output1,'k','LineWidth',1.5); plot(output2,'k-.','LineWidth',1.5);  

xlabel('观测序号'); ylabel('movmean法'); 

legend('原始散点','平滑曲线(窗宽30)','平滑曲线(窗宽100)','location','northwest');

%----------------------------------------------------------------

%----------------------------------------------------------------

%% 使用movmedian法对数据平滑

output3 = smoothdata(price,'movmedian',30);  % 窗宽为30,标准差为默认值0.65

output4 = smoothdata(price,'movmedian',100);  % 窗宽为100,标准差为100subplot(222);plot(price,'.'); hold on

plot(output3,'k','LineWidth',1.5); plot(output4,'k-.','LineWidth',1.5);  

xlabel('观测序号'); ylabel('movmedian法'); 

legend('原始散点','平滑曲线(窗宽30,标准差0.65)',...

         '平滑曲线(窗宽100,标准差100)','location','northwest');

%----------------------------------------------------------------

%----------------------------------------------------------------

%%  利用指数法对数据进行平滑处理,绘制平滑波形图*

output5 = smoothdata(price,'gaussian',30);  % 用gaussian法平滑数据,窗宽为30

output6 = smoothdata(price,'gaussian',100);  % 用gaussian法平滑数据,窗宽为100subplot(223);plot(price,'.'); 

hold on

plot(output5,'k','LineWidth',1.5); plot(output6,'k-.','LineWidth',1.5); 

xlabel('观测序号'); ylabel('gaussian法'); 

legend('原始散点','平滑曲线(窗宽30)','平滑曲线(窗宽100)','location','northwest');

%----------------------------------------------------------------

%----------------------------------------------------------------

%% 使用sgolay法对数据进行平滑

output7 = smoothdata(price,'sgolay',30);  % 用sgolay法平滑数据,窗宽为30

output8 = smoothdata(price,'sgolay',100);  % 用sgolay法平滑数据,窗宽为100subplot(224);plot(price,'.');  

hold on

plot(output5,'k','LineWidth',1.5); plot(output6,'k-.','LineWidth',1.5);  

xlabel('观测序号'); ylabel('sgolay法');

legend('原始散点','平滑曲线(窗宽30)','平滑曲线(窗宽100)','location','northwest');

运行代码得到图像:

dc17133dd582876cf76f51bfe012307d.png

为了节省进行对比将上述四个方法绘制在一张图中,由于缩小了图幅,窗宽变化显示的对比不太明显,可以分别将四幅图汇出比较。比较之后可以得出窗框越大,曲线越平滑。增加窗宽的同时可能会过度平滑导致数据失真,因此需要选择适度的窗宽。

函数smoothts的调用格式可以参考官网介绍:

ww2.mathworks.cn/help/f

smoothts函数的方法有'b', 'g', or 'e' ,官网解释如下:

Smoothing method (essentially the type of filter used). Can be Exponential (e), Gaussian (g), or Box (b). Default = b.
实际上为指数法,高斯法和盒子法。

三、 medfilt1 9f6f2427e48d4be7f123c25722522572.gif

调用格式:

y = medfilt1(x)

%将三阶一维中值滤波器应用于输入向量  x。该函数认为信号超出端点为0。输出y的长度与相同x。

y = medfilt1(x,n)

%将n阶一维一维中值滤波器应用于  x。

y = medfilt1(x,n,blksz,dim)

%或指定过滤器沿其运行的尺寸。是向后兼容所必需的,将被忽略。y = medfilt1(x,n,[],dim)dimblksz)

y = medfilt1(___,nanflag,padding)

%指定NaN使用先前语法中的任何输入参数,如何在每个段上对待值。

%此语法还指定padding在信号边缘执行的过滤类型。%nanflag并且padding可以出现x在函数调用之后的任何位置。

使用正弦信号,并随机生成噪声波进行平滑

t = linspace(0,2*pi,500)';  % 产生一个从0到2*pi的向量,长度为500

y = 100*sin(t);             % 产生正弦波信号

noise = normrnd(0,15,500,1);

y = y + noise;                  % 将正弦波信号加入噪声信号

plot(t,y);                     

xlabel('t');                   

ylabel('y = sin(t) + 噪声');  

%% 调用medfilt1对加噪正弦波信号y进行中值滤波,并绘制波形图

yy = medfilt1(y,30);  % 指定窗宽为30,对y进行中值滤波

plot(t,y,'k:');  

hold on

plot(t,yy,'k','LineWidth',3); 

xlabel('t'); 

ylabel('中值滤波'); 

legend('加噪波形','平滑后波形');

fed494f4d0bd4a26409336770efcd6e0.png6590fd08bb06fcdea2dbf2efd16c9529.png

421e749807448fffe6151de9aee33f16.gif

下面是MathWorks对数据平滑和离群值检测的介绍:

数据平滑和离群值检测 - MATLAB & Simulink - MathWorks 中国ww2.mathworks.cnfdfcaba422c8a5fef2e5dd140186a689.png

本文部分数据、代码和方法介绍来源于网络。本文仅供大家参考学习,欢迎指正!更多MATLAB学习资源请入QQ群:953314432。

c0c13527cf47a71b702390a391ea1c40.png扫码关注我们 出品:Asoul水云天课堂工作室 367279d83621c72795a536afc438879a.png好看你就 点点我 50127cbc5e47d72e79d775b9dc4013f0.png

最后

以上就是醉熏路人为你收集整理的matlab平滑曲线_数据预处理——噪声值平滑处理的全部内容,希望文章能够帮你解决matlab平滑曲线_数据预处理——噪声值平滑处理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(686)

评论列表共有 0 条评论

立即
投稿
返回
顶部