數(shù)據(jù)導入MATLAB之后,通常需要對數(shù)據(jù)進行一些預處理,例如平滑處理(去噪)、標準化變換和極差歸一化變換等。
1.數(shù)據(jù)的平滑處理
1.1 smooth函數(shù)平滑處理
MATLAB曲線擬合工具箱中提供了smooth函數(shù),用來對數(shù)據(jù)進行平滑處理,調用格式如下:
(1)yy=smooth(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=smooth(y,span)
用span參數(shù)指定移動平均濾波器的窗寬,函數(shù)內部會強制將span變?yōu)槠鏀?shù)。
(3)yy=smooth(y,method)
method參數(shù)指定平滑數(shù)據(jù)的方法,method是字符串變量,可用的字符串如下表:
method參數(shù)值 說明
moving 移動平均法(默認情況)
lowess 局部回歸(加權線性最小二乘和一個一階多項式模型)
loess 局部回歸(加權線性最小二乘和一個二階多項式模型)
sgolay Sacitzky-Golay濾波,一種廣義移動平均濾波法
rlowess lowess方法的穩(wěn)健形式
rloess loess方法的穩(wěn)健形式
(4)yy=smooth(y,span,method)
method指定平滑方法,span指定窗寬。
例:產(chǎn)生一正弦信號,加入噪聲信號,調用smooth函數(shù)對加入噪聲的正弦波進行平滑處理
t=linspace(0,2*pi,500);%產(chǎn)生一個從0到2*pi的向量,長度為500,(t=0:2*pi/500:2*pi)
y=100*sin(t); %產(chǎn)生正弦波信號
noise=normrnd(0,15,1,500); %產(chǎn)生1行500列的服從N(0,15^2)分布的隨機數(shù),作為噪聲信號
y=y+noise; %將正弦信號加入噪聲信號
figure; %新建一個窗口
plot(t,y); %繪制加噪聲波形
xlabel(‘t’);
ylabel(‘y=sin(t)+噪聲’);
title(‘原始信號’);
%—–移動平均法—–
yy1=smooth(y,30); %利用移動平均法對y進行平滑處理
figure;
plot(t,y,’k:’); %畫出原始信號,類型為黑色點線化出
hold on;
plot(t,yy1,’k’,’linewidth’,3); %繪制平滑后波形圖,顏色為黑色,寬度為3
xlabel(‘t’);
ylabel(‘moving’);
legend(‘原始信號’,’平滑后波形’);
title(‘移動平均法平滑處理’);
%—-lowess法—–
yy2=smooth(y,30,’lowess’); %利用lowess方法對y進行平滑處理
figure; %新建一個圖形窗口
plot(t,y,’k:’); %繪制原始信號
hold on;
plot(t,yy2,’k’,’linewidth’,3); %繪制平滑后波形圖
xlabel(‘t’);
ylabel(‘rlowrss’);
legend(‘原始信號’,’平滑后波形’);
title(‘lowess方法平滑處理’);
%—–rlowess方法平滑處理
yy3=smooth(y,30,’rlowess’); %利用rlowess方法對y進行平滑處理
figure; %新建一個圖形窗口
plot(t,y,’k:’); %繪制原始信號
hold on;
plot(t,yy3,’k’,’linewidth’,3);
xlabel(‘t’);
ylabel(‘rlowess’);
legend(‘原始信號’,’平滑后波形’);
title(‘rlowess方法平滑處理’);
%—-loess方法平滑處理
yy4=smooth(y,30,’loess’); %用loess方法對y進行平滑處理
figure;
plot(t,y,’k:’); %原始信號
hold on;
plot(t,yy4,’k’,’linewidth’,3); %繪制平滑后波形圖
xlabel(‘t’);
ylabel(‘loess’);
legend(‘原始信號’,’平滑后波形’);
title(‘loess方法平滑處理’);
%—sgolay方法平滑處理
yy5=smooth(y,30,’sgolay’,3); %利用sgolay方法對y進行平滑處理
figure;
plot(t,y,’k:’);
hold on;
plot(t,yy5,’k’,’linewidth’,3); %繪制平滑后的波形圖
xlabel(‘t’);
ylabel(‘sgolay’);
legend(‘原始信號’,’平滑后波形’);
title(‘sgolay方法平滑處理’);






調用smooth函數(shù),設置相同的窗寬,用5中方法對加噪聲后信號進行平滑處理,可以發(fā)現(xiàn),這5種方法平滑效果,都比較好的濾除了噪聲,反映了數(shù)據(jù)的總體規(guī)律。實際上隨著窗寬的增大,平滑后的曲線也會越來越平滑,但過于光滑也可能造成失真。
1.2 smoothts函數(shù)平滑處理
MATLAB金融工具箱中提供了smoothts函數(shù),也可用來對數(shù)據(jù)進行平滑處理,調用格式如下:
output=smoothts(input)
output=smoothts(input,‘b’,wsize)
output=smoothts(input,‘g’,wsize,stdev)
output=smoothts(input,‘e’,n)
輸入?yún)?shù)input是輸入數(shù)據(jù),‘b’,‘g’,‘e’表示不同的數(shù)據(jù)平滑方法,‘b’表示盒子法(默認情況),’g’表示高斯窗方法,‘e’表示指數(shù)法。wsize指定各種數(shù)據(jù)平滑方法的窗寬,默認窗寬為5。stdev用來指定高斯方法的標準差,默認為0.65.
例:現(xiàn)有上海股市開盤價、最高價,最低價,收盤價,收益率等數(shù)據(jù),共有510組數(shù)據(jù),試調用smoothts函數(shù)對日收盤價數(shù)據(jù)進行平滑處理
數(shù)據(jù)如圖所示:

x=xlsread(‘C:UsersAdministratorDesktopMATLABMATLAB數(shù)據(jù)分析與統(tǒng)計chapter21.xls’);%讀取數(shù)據(jù)
price=x(:,4)’; %提取矩陣x中的第4列數(shù)據(jù),即收盤價數(shù)據(jù), 并轉置,裝換為行向量
plot(price,’k’,’LineWidth’,2); %繪制收盤價的曲線,繪制類型:黑色實線,線寬為2
xlabel(‘觀測序號’);
ylabel(‘日收盤價’);
title(‘原始數(shù)據(jù)’);
%—盒子法平滑數(shù)據(jù)
output1=smoothts(price,’b’,30); %用盒子法平滑數(shù)據(jù),窗寬為30
output2=smoothts(price,’b’,100); %盒子法平滑數(shù)據(jù),窗寬為100
figure; %新建一個圖形窗口
plot(price,’.’); %繪制原始數(shù)據(jù)
hold on;
plot(output1,’k’,’LineWidth’,2); %繪制平滑后的曲線,曲線類型:黑色實線,寬度2
plot(output2,’k-.’,’LineWidth’,2); %繪制平滑后的曲線,曲線類型:黑色點畫線,線寬為2
xlabel(‘觀測信號’);
ylabel(‘Box method’);
legend(‘原始散點數(shù)據(jù)’,’平滑后曲線(窗寬30)’,’平滑后數(shù)據(jù)(窗寬100)’);
title(‘盒子法平滑數(shù)據(jù)’);
%—–高斯窗方法平滑數(shù)據(jù)
output3=smoothts(price,’g’,30); %窗寬為30,標準差為默認值0.65
output4=smoothts(price,’g’,100,100); %窗寬為100,標準差為100
figure; %新建一個圖形窗口
plot(price,’.’); %繪制元素數(shù)據(jù)
hold on;
plot(output3,’k’,’LineWidth’,2); %繪制平滑后的曲線,類型:黑色實線,線寬為2
plot(output4,’k-.’,’LineWidth’,2); %繪制平滑后的曲線,類型:黑色點畫線,線寬為2
xlabel(‘觀測信號’);
ylabel(‘Gaussian method’);
legend(‘原始散點’,’平滑曲線(窗寬30,標準差0.65)’,’平滑曲線(窗寬100,標準差100)’);
title(‘高斯窗方法平滑’);
%—-指數(shù)法平滑數(shù)據(jù)
output5=smoothts(price,’e’,30); %用指數(shù)法平滑數(shù)據(jù),窗寬為30
output6=smoothts(price,’e’,100); %用指數(shù)法平滑數(shù)據(jù),窗寬為100
figure; %新建一個圖形窗口
plot(price,’.’); %繪制元素數(shù)據(jù)散點圖
hold on;
plot(output5,’k’,’LineWidth’,2); %繪制平滑后曲線圖,曲線類型:黑色實線,線寬2
plot(output6,’k-.’,’LineWidth’,2); %繪制平滑后曲線圖,線型:黑色點畫線,線寬2
xlabel(‘觀測序號’);
ylabel(‘Exponential method’);
legend(‘原始散點數(shù)據(jù)’,’平滑曲線(線寬30)’,’平滑曲線(線寬100)’);
title(‘指數(shù)法平滑數(shù)據(jù)’)




例中,調用smoothts函數(shù),用3種不同的方法(盒子法,高斯窗法,指數(shù)法),每種方法設定兩種不同的窗寬,對收盤價數(shù)據(jù)進行了平滑處理,并做出平滑曲線,原始收盤價曲線比較曲折,不夠光滑,從圖中可以看出,前兩種方法在端點處的平滑效果不是很好,最后一種方法在右尾部的處理有些失真。但在數(shù)據(jù)的中段,這三種方法的平滑效果比較好,并且隨著窗寬的增大,平滑后的曲線的光滑性也在增強,但光滑度增強的同時也造成了失真。
1.3 medfilt1函數(shù)平滑處理
MATLAB信號處理工具箱中提供了medfilt1函數(shù),用來對信號數(shù)據(jù)進行一維中值濾波,其調用格式如下:
(1)y=medfilt1(x,n);
對向量x進行一維中值濾波,返回與x等長的向量y。這里的n是窗寬參數(shù),當n是奇數(shù)時,y的第k個元素等于x的第k-(n-1)/2個元素至k+(n-1)/2個元素的中位數(shù);當n是偶是,y的第k個元素等于x的第k-n/2個元素至第k+n/2-1個元素的中位數(shù)。n的默認值為3
(2) y=medfilt1(x,n,blksz)
默認情況下,blksz=length(x)。當x是一個矩陣時,通過循環(huán)對x的各列進行一維中值濾波,返回對x的各列進行一維中值濾波,返回與x具有相同行數(shù)和列數(shù)的矩陣y
(3)y=medfilt1(x,n,blksz,dim)
用dim參數(shù)指定沿x的哪個維進行濾波
例:產(chǎn)生一正弦信號,加入噪聲,然后調用medfilt1函數(shù)對加入噪聲的正弦波進行平滑處理(濾波)
t=linspace(0,2*pi,500); %產(chǎn)生一個從0到2*pi的向量,長度為500
y=100*sin(t);
noise=normrnd(0,15,1,500); %產(chǎn)生1行500列的服從N(0,15^2)分布的隨機數(shù),作為噪聲信號
y=y+noise; %將正弦波信號加入噪聲信號
figure; %新建一個圖形窗口
plot(t,y); %繪制加入噪聲后的波形圖
xlabel(‘t’);
ylabel(‘y=sin(t)+noise’);
title(‘原始信號’);
%調用medfilt1對加噪聲正弦信號y進行中值濾波,并繪制波形圖
yy=medfilt1(y,30); %指定窗口為30,對y進行中值濾波
figure; %新建一個圖形窗口
plot(t,y,’k:’); %繪制加噪聲波形圖
hold on;
plot(t,yy,’k’,’LineWidth’,3); %繪制平滑后曲線圖,線型:黑色實線,線寬為3
xlabel(‘t’);
ylabel(‘中值濾波’);
legend(‘加噪波形’,’平滑后波形’);
title(‘medfilt1平滑’);


本文由網(wǎng)上采集發(fā)布,不代表我們立場,轉載聯(lián)系作者并注明出處:http://m.zltfw.cn/shbk/39797.html