本文綜合代碼來自文章
異常值與缺失值處理
%% 數(shù)據(jù)修復
% 判斷缺失值和異常值并修復,順便光滑噪音,渡邊筆記
clc,clear;close all;
x = 0:0.06:10;
y = sin(x)+0.2*rand(size(x));
y(22:34) = NaN; % 模擬缺失值
y(89:95) = 50;% 模擬異常值
testdata = [x' y'];
subplot(2,2,1);
plot(testdata(:,1),testdata(:,2)); %subplot在一個圖窗中創(chuàng)建多個子圖,然后使用plot函數(shù)將原始數(shù)據(jù)可視化
title('原始數(shù)據(jù)');
異常值檢驗
作者通常首先判斷是否具有異常值,因為如果有異常值的話,咱們就會剔除異常值,使其變成缺失值,然后再做缺失值處理會好很多。
%% 判斷數(shù)據(jù)中是否存在異常值
% 1.mean 三倍標準差法 2.median 離群值法 3.quartiles 非正態(tài)的離群值法
% 4.grubbs 正態(tài)的離群值法 5.gesd 多離群值相互掩蓋的離群值法
choice_1 = 5;
yichangzhi_fa = char('mean', 'median', 'quartiles', 'grubbs','gesd');
yi_chang = isoutlier(y,strtrim(yichangzhi_fa(choice_1,:))); %選擇的是gesd多離群值……
if sum(yi_chang)
disp('數(shù)據(jù)存在異常值');
else
disp('數(shù)據(jù)不存在異常值');
end
對于上面的異常值檢驗法做講解與擴展:
1. Mean 三倍標準差法(3σ原則)
- 描述:在正態(tài)分布數(shù)據(jù)中,任何一個數(shù)值如果偏離平均值超過3倍的標準差,就被認為是異常值。
- 應用條件:數(shù)據(jù)基本呈正態(tài)分布。(非常重要,需要進行正態(tài)性檢驗)
- 場景:適用于各種連續(xù)數(shù)據(jù)的分析,例如金融、生物統(tǒng)計等領(lǐng)域。
2. Median 離群值法
- 描述:基于中位數(shù)和四分位數(shù)范圍來識別異常值。
- 應用條件:不需要數(shù)據(jù)完全符合正態(tài)分布。
- 場景:適用于偏態(tài)分布或者非正態(tài)分布的數(shù)據(jù)。
3. Quartiles 非正態(tài)的離群值法
- 描述:通過計算數(shù)據(jù)的四分位數(shù)范圍(IQR)和上下四分位數(shù)來檢測異常值。
- 應用條件:適用于非正態(tài)分布的數(shù)據(jù)。
- 場景:在各種非正態(tài)分布的數(shù)據(jù)分析中都可以使用。
4. Grubbs 正態(tài)的離群值法
- 描述:基于正態(tài)分布假設,測試數(shù)據(jù)集中最大或最小值是否顯著偏離其余的觀測值。
- 應用條件:數(shù)據(jù)應該是正態(tài)分布。
- 場景:廣泛應用于各種領(lǐng)域,尤其是實驗數(shù)據(jù)分析。
5. GESD(Generalized Extreme Studentized Deviate)
- 描述:用于檢測多個異常值,即使它們相互掩蓋。
- 應用條件:不特定于某一分布。
- 場景:當異常值可能相互掩蓋時使用,例如在時間序列分析中。
其他方法
Tukey’s Fences:
- 通過四分位數(shù)范圍(IQR)和“fences”(上下界)識別異常值。
- 適用于各種分布的數(shù)據(jù)。
DBSCAN(Density-Based Spatial Clustering of Applications with Noise):
- 一種基于密度的聚類算法,能夠識別簇內(nèi)和簇外點。
- 用于大數(shù)據(jù)集和空間數(shù)據(jù)。
Isolation Forests:
- 用于高維數(shù)據(jù)集的異常檢測。
- 通過隨機分離點來檢測異常值。
正態(tài)性檢驗
讀者不難發(fā)現(xiàn),異常值檢驗通常與數(shù)據(jù)是否符合正態(tài)分布有關(guān),所以,我們一起討論一下如何使用matlab進行正態(tài)性檢驗。
初步判斷
利用圖像進行初步的正態(tài)性判斷,涉及到常見的兩種圖:Q-Q圖和P-P圖。
PP圖:
- PP圖是用于比較兩個數(shù)據(jù)集的累積分布函數(shù)(CDF)。
- 當你有一個樣本數(shù)據(jù)集和一個理論分布(如正態(tài)分布)時,PP圖會比較樣本數(shù)據(jù)的CDF和理論CDF。
- 在正態(tài)PP圖中,如果樣本數(shù)據(jù)來自正態(tài)分布,那么數(shù)據(jù)點應該大致沿著45度線。
QQ圖:
- QQ圖是用于比較兩個數(shù)據(jù)集的分位數(shù)。QQ圖更常用于正態(tài)性檢驗,因為它對尾部的差異更敏感。
- 當你有一個樣本數(shù)據(jù)集和一個理論分布時,QQ圖會比較樣本數(shù)據(jù)的分位數(shù)和理論分布的分位數(shù)。
- 在正態(tài)QQ圖中,如果樣本數(shù)據(jù)來自正態(tài)分布,那么數(shù)據(jù)點應該大致沿著一條直線,這條線不一定是45度線,但是應該是線性的。
其實上面最重要的一點就是,數(shù)據(jù)點在兩個圖中都沿著標準正態(tài)分布直線近似分布的話,我們就可以初步判斷數(shù)據(jù)具有正態(tài)分布性。
% 正態(tài)檢驗
% 生成一些隨機數(shù)據(jù)
data = randn(100, 1);
% 創(chuàng)建一個新的圖形窗口
figure;
% 使用 normplot 創(chuàng)建正態(tài)概率圖 (QQ圖)
subplot(1,2,1);
normplot(data);
title('Normal Q-Q Plot');
% 使用 probplot 創(chuàng)建PP圖
subplot(1,2,2);
probplot('normal', data);
title('Normal P-P Plot');
可以在論文中這樣寫:
為了對數(shù)據(jù)集的分布特性進行深入理解和分析,本文采用了QQ圖和PP圖兩種方法進行了初步的正態(tài)性檢驗,旨在從不同角度全面評估數(shù)據(jù)的分布狀態(tài)。其結(jié)果如圖1所示。

圖1結(jié)果顯示:在QQ圖中,xx數(shù)據(jù)的尾部行為和中心趨勢沒有發(fā)現(xiàn)顯著的異常值或者偏態(tài)現(xiàn)象,表現(xiàn)出良好的正態(tài)分布特征;在PP圖中,xx數(shù)據(jù)的整體分布與正態(tài)分布非常接近,進一步證實了數(shù)據(jù)的正態(tài)性。綜合以上分析結(jié)果可初步得知:xx數(shù)據(jù)集呈現(xiàn)出較強的正態(tài)分布特性。
盡管PP圖和QQ圖都是強大的工具,但它們主要用于探索性數(shù)據(jù)分析,并不能代替更正式的正態(tài)性檢驗方法,如Jarque-Bera測試或Lilliefors測試。
正式判斷
% 正態(tài)檢驗
% 生成一些隨機數(shù)據(jù)
data = randn(100, 1);
% 使用 jbtest 進行 Jarque-Bera 測試
[h_jb, p_jb] = jbtest(data);
% 使用 lillietest 進行 Lilliefors 測試
[h_lil, p_lil] = lillietest(data);
% 顯示測試結(jié)果
fprintf('Jarque-Bera Test: h = %d, p = %f\n', h_jb, p_jb);
fprintf('Lilliefors Test: h = %d, p = %f\n', h_lil, p_lil);
在上述代碼中,h
和 p
分別代表假設檢驗的結(jié)果和 p 值,可以用來判斷數(shù)據(jù)是否符合正態(tài)分布。
?
h = 0
表示在給定的顯著性水平下,不拒絕數(shù)據(jù)來自正態(tài)分布的原假設。即,數(shù)據(jù)可以被認為是正態(tài)分布的。p
值是一個概率值,它表示觀察到的數(shù)據(jù)與正態(tài)分布之間的差異是偶然產(chǎn)生的概率。一般來說,如果p
值大于預定的顯著性水平(例如,0.05),則接受原假設,認為數(shù)據(jù)是正態(tài)分布的。
故對上圖結(jié)果進行數(shù)據(jù)分析(論文中寫的多一點啊,這是簡要版):
Jarque-Bera 測試結(jié)果:
h = 0, p = 0.361618
- 因為
h
為0,并且p
值為0.361618(大于通常的顯著性水平0.05),所以我們接受原假設,認為數(shù)據(jù)是正態(tài)分布的。Lilliefors 測試結(jié)果:
h = 0, p = 0.500000
- 同樣,
h
為0,并且p
值為0.5,這也指示數(shù)據(jù)是正態(tài)分布的。
異常值處理與缺失值判斷
作者所有異常值處理都是先賦空值,不知道還有沒有其他的方法……
%% 對異常值賦空值
F = find(yi_chang == 1);
y(F) = NaN; % 令數(shù)據(jù)點缺失
testdata = [x' y'];
然后就可以和缺失值一起處理了,但是,為了保證文章的嚴謹性,咱還是需要判斷一下是否存在缺失值。并且,不僅僅只判斷,如果題目數(shù)據(jù)特征尤其多,并且有的特征缺失樣本太多了,咱建議還是把這些特征刪了,這就涉及到最省力法則:
% 假設testdata是一個n行m列的矩陣,每一列代表一個特征
[n, m] = size(testdata);
threshold = 0.8 * n; % 設置閾值,80%的總樣本量
% 遍歷每一個特征
for i = 1:m
% 計算每一列(特征)中非缺失值的數(shù)量
nonMissingCount = sum(~isnan(testdata(:, i)));
% 如果非缺失值的數(shù)量少于閾值,則刪除該列(特征)
if nonMissingCount < threshold
testdata(:, i) = []; % 刪除特征
m = m - 1; % 更新特征數(shù)量
i = i - 1; % 更新當前索引
end
end
% 顯示處理后的數(shù)據(jù)
disp('處理后的數(shù)據(jù):');
disp(testdata);
填充缺失值
%% 對數(shù)據(jù)進行補全
% 數(shù)據(jù)補全方法選擇
% 1.線性插值 linear 2.分段三次樣條插值 spline 3.保形分段三次樣條插值 pchip
% 4.移動滑窗插補 movmean
chazhi_fa = char('linear', 'spline', 'pchip', 'movmean');
choice_2 = 3;
if choice_2 ~= 4
testdata_1 = fillmissing(testdata,strtrim(chazhi_fa(choice_2,:))); % strtrim 是為了去除字符串組的空格
else
testdata_1 = fillmissing(testdata,'movmean',10); % 窗口長度為 10 的移動均值
end
subplot(2,2,3);
plot(testdata_1(:,1),testdata_1(:,2));
title('數(shù)據(jù)補全結(jié)果');
作者通常喜歡(讓隊友)使用K最近鄰法填補,而且都是用python搞的,so這里不講。
平滑處理
當然,可以根據(jù)實際情況進行數(shù)據(jù)的平滑處理:
%% 進行數(shù)據(jù)平滑處理
% 濾波器選擇 1.Savitzky-golay 2.rlowess 3.rloess
choice_3 = 2;
lvboqi = char('Savitzky-golay', 'rlowess', 'pchip', 'rloess');
% 通過求 n 元素移動窗口的中位數(shù),來對數(shù)據(jù)進行平滑處理
windows = 8;
testdata_2 = smoothdata(testdata_1(:,2),strtrim(lvboqi(choice_3,:)),windows) ;
那么,實際情況到底是什么?
平滑數(shù)據(jù)對于某些機器學習模型的訓練和性能是有益的,尤其是對于那些對數(shù)據(jù)中的噪聲敏感的模型。下面是一些可能受益于數(shù)據(jù)平滑的算法:
?
?
決定是否進行數(shù)據(jù)平滑應該基于對上述因素的綜合考慮,而不僅僅是基于特征的數(shù)量。在決定平滑之前,最好通過交叉驗證來評估平滑對模型性能的實際影響。屬于錦上添花的作用。
總結(jié)
最終的代碼綜合一下:
% 判斷缺失值和異常值并修復,順便光滑噪音,渡邊筆記
clc,clear;close all;
x = 0:0.06:10;
y = sin(x)+0.2*rand(size(x));
y(22:34) = NaN; % 模擬缺失值
y(89:95) = 50;% 模擬異常值
testdata = [x' y'];
subplot(2,2,1);
plot(testdata(:,1),testdata(:,2)); %subplot在一個圖窗中創(chuàng)建多個子圖,然后使用plot函數(shù)將原始數(shù)據(jù)可視化
title('原始數(shù)據(jù)');
%% 判斷數(shù)據(jù)中是否存在缺失值,并使用最省力法則
% 假設testdata是一個n行m列的矩陣,每一列代表一個特征
[n, m] = size(testdata);
threshold = 0.8 * n; % 設置閾值,80%的總樣本量
% 遍歷每一個特征
for i = 1:m
% 計算每一列(特征)中非缺失值的數(shù)量
nonMissingCount = sum(~isnan(testdata(:, i)));
% 如果非缺失值的數(shù)量少于閾值,則刪除該列(特征)
if nonMissingCount < threshold
testdata(:, i) = []; % 刪除特征
m = m - 1; % 更新特征數(shù)量
i = i - 1; % 更新當前索引
end
end
% 顯示處理后的數(shù)據(jù)
disp('處理后的數(shù)據(jù):');
disp(testdata);
%% 判斷數(shù)據(jù)中是否存在異常值
% 1.mean 三倍標準差法 2.median 離群值法 3.quartiles 非正態(tài)的離群值法
% 4.grubbs 正態(tài)的離群值法 5.gesd 多離群值相互掩蓋的離群值法
choice_1 = 5;
yichangzhi_fa = char('mean', 'median', 'quartiles', 'grubbs','gesd');
yi_chang = isoutlier(y,strtrim(yichangzhi_fa(choice_1,:))); %選擇的是gesd多離群值……
if sum(yi_chang)
disp('數(shù)據(jù)存在異常值');
else
disp('數(shù)據(jù)不存在異常值');
end
%% 對異常值賦空值
F = find(yi_chang == 1);
y(F) = NaN; % 令數(shù)據(jù)點缺失
testdata = [x' y'];
subplot(2,2,2);
plot(testdata(:,1),testdata(:,2));
title('去除差異值');
%% 對數(shù)據(jù)進行補全
% 數(shù)據(jù)補全方法選擇
% 1.線性插值 linear 2.分段三次樣條插值 spline 3.保形分段三次樣條插值 pchip
% 4.移動滑窗插補 movmean
chazhi_fa = char('linear', 'spline', 'pchip', 'movmean');
choice_2 = 3;
if choice_2 ~= 4
testdata_1 = fillmissing(testdata,strtrim(chazhi_fa(choice_2,:))); % strtrim 是為了去除字符串組的空格
else
testdata_1 = fillmissing(testdata,'movmean',10); % 窗口長度為 10 的移動均值
end
subplot(2,2,3);
plot(testdata_1(:,1),testdata_1(:,2));
title('數(shù)據(jù)補全結(jié)果');
%% 進行數(shù)據(jù)平滑處理
% 濾波器選擇 1.Savitzky-golay 2.rlowess 3.rloess
choice_3 = 2;
lvboqi = char('Savitzky-golay', 'rlowess', 'pchip', 'rloess');
% 通過求 n 元素移動窗口的中位數(shù),來對數(shù)據(jù)進行平滑處理
windows = 8;
testdata_2 = smoothdata(testdata_1(:,2),strtrim(lvboqi(choice_3,:)),windows) ;
subplot(2,2,4);
plot(x,testdata_2)
title('數(shù)據(jù)平滑結(jié)果');
?文章來源:http://www.zghlxwxcb.cn/news/detail-721459.html
至此,數(shù)據(jù)預處理完成。文章來源地址http://www.zghlxwxcb.cn/news/detail-721459.html
到了這里,關(guān)于數(shù)學建模Matlab之數(shù)據(jù)預處理方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!