?? 文章首發(fā)于我的個(gè)人博客:歡迎大佬們來逛逛
數(shù)據(jù)預(yù)處理
數(shù)據(jù)變換
常見的數(shù)據(jù)變換的方式:通過某些簡單的函數(shù)進(jìn)行數(shù)據(jù)變換。
x ′ = x 2 x ′ = x x ′ = log ? ( x ) ? f ( x k ) = f ( x k + 1 ) ? f ( x k ) \begin{aligned}&x^{\prime}=x^2 \\&\begin{aligned}x^{\prime}=\sqrt{x}\end{aligned} \\&x'=\log(x) \\\nabla f\left(x_{k})\right.&=f(x_{k+1})-f(x_k) \end{aligned} ?f(xk?)?x′=x2x′=x??x′=log(x)=f(xk+1?)?f(xk?)?
-
數(shù)據(jù)指標(biāo)的一致化處理:
- 極小型
- 極大型
- 中間型
- 區(qū)間型
-
數(shù)據(jù)指標(biāo)的無量綱化處理:
-
零 - 均值規(guī)范化:也叫做標(biāo)準(zhǔn)差規(guī)范化,經(jīng)過處理后的數(shù)據(jù)平均值為 0,標(biāo)準(zhǔn)差為1。 x  ̄ \overline x x 為原數(shù)據(jù)的均值, σ \sigma σ 為標(biāo)準(zhǔn)差。
x ? = x ? x  ̄ σ x^*=\frac{x-\overline{x}}\sigma x?=σx?x?
-
極值差法:又叫最小 - 最大規(guī)范化,離差標(biāo)準(zhǔn)化,將數(shù)據(jù)映射到 [ 0 , 1 ] [0,1] [0,1] 之間。
x ? = x ? m i n m a x ? m i n x^*=\frac{x-min}{max-min} x?=max?minx?min?
-
功效系數(shù)法:就是上一步極值差法然后加了一個(gè)偏移量: c c c ,使得最后結(jié)果落于 [ c , c + n ] [c,c+n] [c,c+n] 中
-
數(shù)據(jù)變換的應(yīng)用方式:數(shù)據(jù)的標(biāo)準(zhǔn)化,目的是為了消除指標(biāo)之間的量綱和大小不一的影響,需要進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化處理。
因此可以將數(shù)據(jù)按照比例進(jìn)行縮放,使之落入一個(gè)據(jù)標(biāo)準(zhǔn)化處理,將數(shù)據(jù)按照比例進(jìn)行縮放,使之落入一個(gè)特定的區(qū)域,從而進(jìn)行綜合分析。如將工資收入屬性值映射到[-1,1]或者[0,1]之間。
function data1=mfunc_calculate(data,zhibiao_label)
% 指標(biāo)的正向化處理 1 2 極大型;3 4 5 極小型;6 單點(diǎn)最優(yōu);7 區(qū)間最優(yōu)
if isa(data,'double')
for i=1:length(zhibiao_label)
if (zhibiao_label(i)==1)
data1(:,i)=zheng1(data(:,i));
elseif (zhibiao_label(i)==2)
data1(:,i)=zheng2(data(:,i));
elseif (zhibiao_label(i)==3)
data1(:,i)=fu3(data(:,i));
elseif (zhibiao_label(i)==4)
data1(:,i)=fu4(data(:,i));
elseif (zhibiao_label(i)==5)
data1(:,i)=fu5(data(:,i));
elseif (zhibiao_label(i)==6)
prompt = '這是單點(diǎn)最優(yōu),請輸入單點(diǎn)最優(yōu)值 ';
a = input(prompt);
data1(:,i)=qu6(data(:,i),a);
elseif (zhibiao_label(i)==7)
prompt = '這是區(qū)間最優(yōu),請輸入單點(diǎn)最區(qū)間如[5,10] ';
aa=input(prompt);
data1(:,i)=qu7(data(:,i),aa(1),aa(2));
end
end
elseif isa(data,'cell')
% data2=data;
for j=1:length(data)
data2=data{j};
if size(zhibiao_label,1)==1
zhibiao_label1=repmat(zhibiao_label,3,1);
else
zhibiao_label1=zhibiao_label;
end
for i=1:length(zhibiao_label1(j,:))
if (zhibiao_label(i)==1)
data1{j}(:,i)=zheng1(data2(:,i));
elseif (zhibiao_label(i)==2)
data1{j}(:,i)=zheng2(data2(:,i));
elseif (zhibiao_label(i)==3)
data1{j}(:,i)=fu3(data2(:,i));
elseif (zhibiao_label(i)==4)
data1{j}(:,i)=fu4(data2(:,i));
elseif (zhibiao_label(i)==5)
data1{j}(:,i)=fu5(data2(:,i));
elseif (zhibiao_label(i)==6)
prompt = '這是單點(diǎn)最優(yōu),請輸入單點(diǎn)最優(yōu)值 ';
a = input(prompt);
data1{j}(:,i)=qu6(data2(:,i),a);
elseif (zhibiao_label(i)==7)
prompt = '這是區(qū)間最優(yōu),請輸入單點(diǎn)最區(qū)間如[5,10] ';
aa=input(prompt);
data1{j}(:,i)=qu7(data2(:,i),aa(1),aa(2));
end
end
end
end
end
function data=zheng1(data1)
%正向指標(biāo)1
% 填1的時(shí)候選擇
data=(data1-min(data1))./(max(data1)-min(data1));
end
function data=zheng2(data1)
%正向指標(biāo)2
% 填2的時(shí)候選擇
data=data1;
end
function data=fu3(data1)
%負(fù)向指標(biāo)1
% 填3的時(shí)候選擇
data=(max(data1)-data1)./(max(data1)-min(data1));
end
function data=fu4(data1)
%負(fù)向指標(biāo)2
% 填4的時(shí)候選擇
data=(max(data1)-data1);
end
function data=fu5(data1)
%負(fù)向指標(biāo)3
% 填5的時(shí)候選擇
data=1./(max(abs(data1))+data1);
end
function data=qu6(data1,a)
%某點(diǎn)最優(yōu)
% 填6的時(shí)候選擇
data=1./(abs(data1-a)/max(abs(data1-a)));
end
function data=qu7(data1,a,b)
%區(qū)間指標(biāo)1
% 填7的時(shí)候選擇
for i=1:length(data1)
if(data1(i)>a)&&(data1(i)<b)
data(i)=1;
elseif (data1(i)<a)
data(i)=data1(i)/a;
elseif (data1(i)>b)
data(i)=b/data1(i);
end
end
end
數(shù)據(jù)清洗
缺失值處理
對于缺失值的三種處理方法:不處理,刪除數(shù)據(jù),數(shù)據(jù)插補(bǔ)。
數(shù)據(jù)插補(bǔ)的方法:
- 均值/中位數(shù)/眾數(shù)插補(bǔ)
- 使用固定值插補(bǔ)
- 最近鄰插補(bǔ):即在記錄中找到與缺失樣本最接近的樣本的該屬性插補(bǔ),可以通過計(jì)算對象間的歐式距離衡量。
- 回歸方法插補(bǔ):根據(jù)已有數(shù)據(jù)和與其有關(guān)的其他變量的數(shù)據(jù)建立擬合模型來預(yù)測缺失值
- 插值法插補(bǔ)(推薦):常用的插值法有很多,主要有拉格朗日插值法、牛頓插值法。
對于缺失值處理,我們需要分情況討論。
如果某個(gè)變量或某個(gè)樣本缺失了 70%以上的數(shù)據(jù),那么此時(shí)對數(shù)據(jù)進(jìn)行填補(bǔ)的話,會引入更多的噪聲,反而會降低模型的性能,故此時(shí)一般直接將該變量或樣本刪除;
如果缺失的不多,我們可以考慮對缺失值進(jìn)行填補(bǔ)。
matlab
API:
- ismissing 或者 isnan :返回一個(gè)與輸入矩陣同形狀的01矩陣,1表示此位置是缺失值。
- rmmissing:直接刪除缺失值所在的行列,第二個(gè)參數(shù) 1 表示行,2表示列。
-
fillmissing:填補(bǔ)缺失值。
-
常數(shù)填充:constant
- 插值法,常見的插值方法如下:
-
移動窗口填充法:該方法的思想是在缺失值前后開一個(gè)“窗口”,用“窗口”內(nèi) 的數(shù)據(jù)的均值或中位數(shù)進(jìn)行填充。文章來源:http://www.zghlxwxcb.cn/news/detail-681482.html
-
代碼實(shí)現(xiàn):文章來源地址http://www.zghlxwxcb.cn/news/detail-681482.html
clc;clear;
% 數(shù)據(jù)的預(yù)處理
load("帶缺少數(shù)據(jù).mat");
data = data_nan;
%% 缺失值處理
% 判斷矩陣中是否存在nan值,返回一個(gè)同形狀的0-1矩陣,1表示此位置是nan
nan_mat = isnan(data);
%% 直接刪除空值所在的行:1
data1 = rmmissing(data); %默認(rèn)為1行
%% 直接刪除空值所在的列:2
data2 = rmmissing(data,2);
%% 填充缺失值,插值
% 1. 常量填充缺失值
data3 = fillmissing(data,"constant",999);
%% 2. 上一個(gè)或者下一個(gè)非空值
data4 = fillmissing(data,'previous'); % next 表示以下一個(gè)非空值填充
%% 3. 最鄰近的非空值
data5 = fillmissing(data,'nearest');
%% 4. 三次樣條插值
data6 = fillmissing(data,'spline'); % phcip 保持三次樣條插值
%% 5. 窗口填補(bǔ)法
data7 = fillmissing(data,'movmean',8,1); % movean 窗口長度為 window 的移動均值; movmedian:移動中位數(shù)
異常值處理
- 正態(tài)分布3σ原則:總體符合正態(tài)分布,例如人口數(shù)據(jù)、測量誤差、生產(chǎn)加工質(zhì)量、考試成績等。
- 計(jì)算均值 μ 和標(biāo)準(zhǔn)差 σ 。
- 判斷每個(gè)數(shù)據(jù)值是否在(μ-3σ,μ+3σ) 內(nèi),不在則為異常值.
- 異常值可以轉(zhuǎn)換為
nan
值,然后再進(jìn)行上一步的缺失值處理。
- 畫箱線圖:下四分位數(shù)Q1是排第25%的數(shù)值,上四分位數(shù)Q3是排第75%的數(shù)值。四分位距IQR= Q3-Q1,也就是排名第75%的減去第25%的數(shù)值正態(tài)分布類似,設(shè)置個(gè)合理區(qū)間,在區(qū)間外的就是異常值。一般設(shè)[Q1?1.5IQR, Q3+1.5IQR]內(nèi)為正常值。
到了這里,關(guān)于數(shù)學(xué)建模:數(shù)據(jù)的預(yù)處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!