数据导入MATLAB后,通常需要进行一些预处理,如平滑(去噪)、标准化变换、范围归一化变换等。1.数据的平滑处理1.1平滑函数平滑MATLAB的曲线拟合工具箱中提供了平滑函数,用于平滑
数据导入MATLAB后,通常需要进行一些预处理,如平滑(去噪)、标准化变换、范围归一化变换等。
1.数据的平滑处理
1.1平滑函数平滑
MATLAB的曲线拟合工具箱中提供了平滑函数,用于平滑数据。调用格式如下:
(1)YY =平滑(y)
移动平均滤波器用于平滑列向量Y,返回与Y长度相同的列向量yy。移动平均滤波器的默认窗宽为5,yy中元素的计算方法如下:
yy(1)=y(1)
yy(2)=(y(1)+y(2)+y(3))/3
YY(3)=(y(1)+y(2)+y(3)+y(4)+y(5))/5
YY(4)=(y(2)+y(3)+y(4)+y(5)+y(6))/5
……
(2)YY =平滑(y,跨度)
使用span参数指定移动平均滤波器的窗口宽度,该函数将强制span为奇数。
(3)yy=smooth(y,方法)
method参数指定平滑数据的方法。方法是一个字符串变量,可用的字符串如下:
方法参数值描述
移动平均法(默认)
Lowess局部回归(加权线性最小二乘法和一阶多项式模型)
黄土局部回归(加权线性最小二乘法和二阶多项式模型)
Sgolay Sacitzky-Golay滤波,一种广义移动平均滤波方法
鲁棒形式的lowess lowess方法
rloess黄土法的稳健形式
(4)yy=smooth(y,跨度,方法)
方法指定平滑方法,跨度指定窗口宽度。
示例:生成一个正弦信号,加入一个噪声信号,调用smooth函数对加入噪声的正弦波进行平滑处理。
t=linspace(0,2*pi,500);%生成长度为500的从0到2*pi的向量,(t=0:2*pi/500:2*pi)
y = 100 * sin(t);%产生正弦波信号。
噪声=normrnd(0,15,1500);%生成一行500列服从N (0,15 ^ 2)分布的随机数作为噪声信号。
y = y+噪声;%将正弦信号添加到噪声信号中。
图;%创建一个新窗口。
plot(t,y);%绘制噪声波形。
xlabel(‘t & # 8217);
y label(‘Y=sin(t)+噪声’);
标题(‘原始信号’);
%—–移动平均法—–
yy1=smooth(y,30);%使用移动平均法平滑y。
图;
plot(t,y,’k:’);%绘制原始信号,类型为黑色虚线。
坚持住;
plot(t,yy1,’k & # 8217,’线宽’,3);%用黑色和宽度3绘制平滑的波形图。
xlabel(‘t & # 8217);
y label(‘动人’);
图例(‘原始信号’,’平滑波形’);
标题(‘移动平均平滑’);
%—-洛斯法—–
yy2=smooth(y,30,’洛斯’);%用lowess方法平滑Y。
图;%创建一个新的图形窗口。
plot(t,y,’k:’);%绘制原始信号
坚持住;
plot(t,yy2,’k & # 8217,’线宽’,3);%画出平滑的波形图。
xlabel(‘t & # 8217);
y label(‘rlowrss & # 8217);
图例(‘原始信号’,’平滑波形’);
标题(‘洛斯平滑法’);
%—–洛斯平滑法
yy3=smooth(y,30,’洛沃斯’);通过rlowess方法% smooth y。
图;%创建一个新的图形窗口。
plot(t,y,’k:’);%绘制原始信号
坚持住;
plot(t,yy3,’k & # 8217,’线宽’,3);
xlabel(‘t & # 8217);
y label(‘洛沃斯’);
图例(‘原始信号’,’平滑波形’);
标题(‘无线平滑方法’);
%—-黄土平滑法
yy4=smooth(y,30,’黄土’);%用黄土法平滑y轴
图;
plot(t,y,’k:’);%原始信号
坚持住;
plot(t,yy4,’k & # 8217,’线宽’,3);%画出平滑的波形图。
xlabel(‘t & # 8217);
y label(‘黄土’);
图例(‘原始信号’,’平滑波形’);
标题(‘黄土抹平法’);
%—斯戈雷平滑法
yy5=smooth(y,30,’斯戈莱’,3);通过sgolay方法平滑y百分比
图;
plot(t,y,’k:’);
坚持住;
plot(t,yy5,’k & # 8217,’线宽’,3);%画出平滑的波形图。
xlabel(‘t & # 8217);
y label(‘斯戈莱’);
图例(‘原始信号’,’平滑波形’);
标题(‘用斯戈莱方法平滑’);
调用smooth函数,设置相同的窗宽,用5中方法对加噪声后信号进行平滑处理,可以发现,这5种方法平滑效果,都比较好的滤除了噪声,反映了数据的总体规律。实际上随着窗宽的增大,平滑后的曲线也会越来越平滑,但过于光滑也可能造成失真。调用平滑函数,设置相同的窗宽,用五种方法平滑带噪声的信号。可以发现,这五种方法的平滑效果可以很好地滤除噪声,反映了数据的一般规律。事实上,随着窗宽的增加,平滑后的曲线会变得越来越平滑,但过于平滑也可能造成失真。
1.2 smoothts函数的平滑
MATLAB的金融工具箱中提供了smoothts函数,也可以用来平滑数据。呼叫格式如下:
输出=平滑(输入)
output=smoothts(input,' b ',wsize)
output=smoothts(input,' g ',wsize,stdev)
输出=smoothts(输入,' e ',n)
输入参数input是输入数据,' B ',' G ',' E '表示不同的数据平滑方法,' B '表示box方法(默认)。’g & # 8217高斯窗口法和指数法。Wsize指定了各种数据平滑方法的窗口宽度,默认的窗口宽度是5。Stdev用于指定高斯方法的标准差,默认为0.65。
比如沪市的开盘价、最高价、最低价、收盘价、收益率等510组数据。尝试调用smoothts函数平滑每日收盘价数据。
如图所示:
x = xls read(‘c:用户数据分析与统计管理员桌面MATLAB chapter21.xls & # 8217);%读取数据
price=x(:,4)’;%提取矩阵X中的第四列数据,即收盘价数据,转置并替换为一个行向量。
情节(价格,’k & # 8217,’线宽’,2);%绘制收盘价曲线,绘图类型:黑色实线,线宽为2。
xlabel(‘观察序列号’);
y label(‘每日收盘价’);
标题(‘原始数据’);
%—盒子平滑数据
output1=smoothts(price,’b & # 8217,30);%通过框方法平滑数据,窗口宽度为30。
output2=smoothts(price,’b & # 8217,100);% box方法平滑数据,窗口宽度为100。
图;%创建一个新的图形窗口。
情节(价格,’。’);%绘制原始数据
坚持住;
plot(output1,’k & # 8217,’线宽’,2);%绘制平滑曲线,曲线类型:黑色实线,宽度2。
plot(output2,’凯。’,’线宽’,2);%画一条平滑的曲线,曲线类型:黑色虚线,线宽2。
xlabel(‘观察信号’);
y label(‘盒子法’);
图例(‘原始散点数据’,’平滑背部曲线(窗宽30)’,’平滑数据(窗口宽度100)’);
标题(‘方框平滑数据’);
%—–平滑数据的高斯窗方法
output3=smoothts(价格,’g & # 8217,30);%窗口宽度是30,标准偏差是默认值0.65。
output4=smoothts(price,’g & # 8217,100,100);%窗口宽度为100,标准偏差为100。
图;%创建一个新的图形窗口。
情节(价格,’。’);%绘图元素数据
坚持住;
plot(输出3,’k & # 8217,’线宽’,2);%绘制平滑曲线,类型:黑色实线,线宽2。
plot(output4,’凯。’,’线宽’,2);%绘制平滑曲线,类型:黑色虚线,线宽2。
xlabel(‘观察信号’);
y label(‘高斯方法’);
图例(‘原创零散点’,’平滑曲线(窗宽30,标准差0.65)’,’平滑曲线(窗宽100,标准差100)’);
标题(‘高斯平滑法’);
%—-指数平滑数据
output5=smoothts(price,’e & # 8217,30);%用指数法平滑数据,窗宽30。
output6=smoothts(价格,’e & # 8217,100);%用指数法平滑数据,窗宽100。
图;%创建一个新的图形窗口。
情节(价格,’。’);%绘制元素数据的散点图
坚持住;
plot(输出5,’k & # 8217,’线宽’,2);%绘制平滑曲线,曲线类型:黑色实线,线宽2。
plot(输出6,’凯。’,’线宽’,2);%绘制平滑曲线,线型:黑色虚线,线宽2
xlabel(‘观察序列号’);
y label(‘指数法’);
图例(‘原始散点数据’,’平滑曲线(线宽30)’,’平滑曲线(线宽100)’);
标题(‘指数平滑数据’)
例中,调用smoothts函数,用3种不同的方法(盒子法,高斯窗法,指数法),每种方法设定两种不同的窗宽,对收盘价数据进行了平滑处理,并做出平滑曲线,原始收盘价曲线比较曲折,不够光滑,从图中可以看出,前两种方法在端点处的平滑效果不是很好,最后一种方法在右尾部的处理有些失真。但在数据的中段,这三种方法的平滑效果比较好,并且随着窗宽的增大,平滑后的曲线的光滑性也在增强,但光滑度增强的同时也造成了失真。在示例中,调用了Smooths函数,并使用了三种不同的方法(盒方法、高斯窗口方法、指数方法)。每种方法设置两个不同的窗宽,平滑收盘价数据,做出平滑曲线。原来的收盘价曲线比较曲折,不够平滑。从图中可以看出,前两种方法在终点的平滑效果不是很好,右尾最后一种方法的处理有些失真。但在数据中间,这三种方法的平滑效果更好,并且随着窗宽的增加,平滑后的曲线的光滑度也有所增强,但增强的光滑度也造成了失真。
1.3 medfilter 1函数的平滑处理
MATLAB的信号处理工具箱中提供了medfilt1函数,用于信号数据的一维中值滤波。其调用格式如下:
(1)y=medfilt1(x,n);
对向量X进行一维中值滤波,返回与X长度相同的向量Y。其中n是窗口宽度参数。当n为奇数时,y的第k个元素等于x的第k-(n-1)/2个元素对第k+(n-1)/2个元素的中值;当n为偶数时,y的第k个元素等于x的第k-n/2个元素到第k+n/2-1个元素的中值,n的默认值为3。
(2) y=medfilt1(x,n,blksz)
默认情况下,blksz =长度(x)。当X为矩阵时,通过循环对X的每一列进行一维中值滤波,对X的每一列返回一维中值滤波,返回与X相同行数和列数的矩阵Y。
(3)y=medfilt1(x,n,blksz,dim)
使用尺寸参数指定要过滤x轴上的哪个尺寸。
示例:生成一个正弦信号,加入噪声,然后调用medfilt1函数对加入噪声的正弦波进行平滑(滤波)。
t=linspace(0,2*pi,500);%生成长度为500的从0到2*pi的向量
y = 100 * sin(t);
噪声=normrnd(0,15,1500);%生成一行500列服从N (0,15 ^ 2)分布的随机数作为噪声信号。
y = y+噪声;%将正弦波信号添加到噪声信号中。
图;%创建一个新的图形窗口。
plot(t,y);%绘制添加噪声后的波形。
xlabel(‘t & # 8217);
y label(‘y = sin(t)+噪声’);
标题(‘原始信号’);
%调用medfilt1对含噪正弦信号Y进行中值滤波,并绘制波形图。
yy=medfilt1(y,30);%指定窗口为30,y为中值滤波。
图;%创建一个新的图形窗口。
plot(t,y,’k:’);%绘制噪声波形图。
坚持住;
plot(t,yy,’k & # 8217,’线宽’,3);%绘制平滑曲线,线型:黑色实线,线宽为3。
xlabel(‘t & # 8217);
y label(‘中值滤波’);
图例(‘添加噪声波形’,’平滑波形’);
标题(‘Medfilt1平滑’);