數據導入MATLAB之後,通常需要對數據進行一些預處理,例如平滑處理(去噪)、標準化變換和極差歸一化變換等。
1.數據的平滑處理
1.1 smooth函數平滑處理
MATLAB曲線擬合工具箱中提供了smooth函數,用來對數據進行平滑處理,調用格式如下:
(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參數指定移動平均濾波器的窗寬,函數內部會強制將span變為奇數。
(3)yy=smooth(y,method)
method參數指定平滑數據的方法,method是字符串變量,可用的字符串如下表:
method參數值 說明
moving 移動平均法(默認情況)
lowess 局部回歸(加權線性最小二乘和一個一階多項式模型)
loess 局部回歸(加權線性最小二乘和一個二階多項式模型)
sgolay Sacitzky-Golay濾波,一種廣義移動平均濾波法
rlowess lowess方法的穩健形式
rloess loess方法的穩健形式
(4)yy=smooth(y,span,method)
method指定平滑方法,span指定窗寬。
例:產生一正弦信號,加入噪聲信號,調用smooth函數對加入噪聲的正弦波進行平滑處理
t=linspace(0,2*pi,500);%產生一個從0到2*pi的向量,長度為500,(t=0:2*pi/500:2*pi)
y=100*sin(t); %產生正弦波信號
noise=normrnd(0,15,1,500); %產生1行500列的服從N(0,15^2)分布的隨機數,作為噪聲信號
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函數,設置相同的窗寬,用5中方法對加噪聲後信號進行平滑處理,可以發現,這5種方法平滑效果,都比較好的濾除了噪聲,反映了數據的總體規律。實際上隨着窗寬的增大,平滑後的曲線也會越來越平滑,但過於光滑也可能造成失真。
1.2 smoothts函數平滑處理
MATLAB金融工具箱中提供了smoothts函數,也可用來對數據進行平滑處理,調用格式如下:
output=smoothts(input)
output=smoothts(input,‘b’,wsize)
output=smoothts(input,‘g’,wsize,stdev)
output=smoothts(input,‘e’,n)
輸入參數input是輸入數據,‘b’,‘g’,‘e’表示不同的數據平滑方法,‘b’表示盒子法(默認情況),’g’表示高斯窗方法,‘e’表示指數法。wsize指定各種數據平滑方法的窗寬,默認窗寬為5。stdev用來指定高斯方法的標準差,默認為0.65.
例:現有上海股市開盤價、最高價,最低價,收盤價,收益率等數據,共有510組數據,試調用smoothts函數對日收盤價數據進行平滑處理
數據如圖所示:

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




例中,調用smoothts函數,用3種不同的方法(盒子法,高斯窗法,指數法),每種方法設定兩種不同的窗寬,對收盤價數據進行了平滑處理,並做出平滑曲線,原始收盤價曲線比較曲折,不夠光滑,從圖中可以看出,前兩種方法在端點處的平滑效果不是很好,最後一種方法在右尾部的處理有些失真。但在數據的中段,這三種方法的平滑效果比較好,並且隨着窗寬的增大,平滑後的曲線的光滑性也在增強,但光滑度增強的同時也造成了失真。
1.3 medfilt1函數平滑處理
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=length(x)。當x是一個矩陣時,通過循環對x的各列進行一維中值濾波,返回對x的各列進行一維中值濾波,返回與x具有相同行數和列數的矩陣y
(3)y=medfilt1(x,n,blksz,dim)
用dim參數指定沿x的哪個維進行濾波
例:產生一正弦信號,加入噪聲,然後調用medfilt1函數對加入噪聲的正弦波進行平滑處理(濾波)
t=linspace(0,2*pi,500); %產生一個從0到2*pi的向量,長度為500
y=100*sin(t);
noise=normrnd(0,15,1,500); %產生1行500列的服從N(0,15^2)分布的隨機數,作為噪聲信號
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平滑’);


原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/273148.html