本文代碼均已在 MATLAB R2019b 測試通過,如有錯誤,歡迎指正。
一、分箱平滑的原理
(1)分箱方法
在分箱前,一定要先排序數據,再將它們分到等深(等寬)的箱中。
常見的有兩種分箱方法:等深分箱和等寬分箱。
- 等深分箱:按記錄數進行分箱,每箱具有相同的記錄數,每箱的記錄數稱為箱的權重,也稱箱子的深度。
- 等寬分箱:在整個屬性值的區間上平均分布,即每個箱的區間范圍設定為一個常量,稱為箱子的寬度。
(2)數據平滑
將數據划分到不同的箱子之后,可以運用如下三種策略對每個箱子中的數據進行平滑處理:
- 平均值平滑:箱中的每一個值被箱中數值的平均值替換。
- 中值平滑:箱中的每一個值被箱中數值的中值替換。
- 邊界平滑:箱中的最大值和最小值稱為箱子的邊界,箱中的每一個值被最近的邊界值替換。
二、Matlab代碼實現
首先用rand()函數隨機生成20*5的矩陣,其數據范圍為[0,1]。
1.等深分箱
輸入箱子的深度h(1<h<20),將每列按等深分箱,然后用箱均值平滑。
clear;clc;
A=rand(20,5); % 隨機生成20*5的矩陣,其中每個數取值范圍[0,1]
fprintf("當前生成的原數據:"); A
% 排序,參數1表示按列排序,取2為按行排序;'ascend'為升序,'descend'為降序
A=sort(A,1,'ascend');
fprintf("將原數據的每列排序后:"); A
h=input("請輸入等深分箱的深度h(1<h<20):");
%% 對每列進行等深分箱,然后求每個箱子的均值
[n,m]=size(A); % n行m列
for j=1:m % 列j
for i=1:h:n % 行i
% 當前箱子第一個數位置為i,最后一個數位置為min(i+h-1,n)
p1=int64(i); % 轉換成整數(i默認是double類型,但是索引必須要為整數)
p2=int64(min(i+h-1,n));
B(p1:p2,j)=mean(A(p1:p2,j)); % 當前箱子的均值
end
end
fprintf("\n經過等深分箱,用箱均值平滑處理后的數據:"); B
代碼運行結果
輸入的深度為3:
當前生成的原數據:
A =
0.4067 0.4504 0.5747 0.5154 0.9969
0.6669 0.2057 0.3260 0.6575 0.5535
0.9337 0.8997 0.4564 0.9509 0.5155
0.8110 0.7626 0.7138 0.7223 0.3307
0.4845 0.8825 0.8844 0.4001 0.4300
0.7567 0.2850 0.7209 0.8319 0.4918
0.4170 0.6732 0.0186 0.1343 0.0710
0.9718 0.6643 0.6748 0.0605 0.8877
0.9880 0.1228 0.4385 0.0842 0.0646
0.8641 0.4073 0.4378 0.1639 0.4362
0.3889 0.2753 0.1170 0.3242 0.8266
0.4547 0.7167 0.8147 0.3017 0.3945
0.2467 0.2834 0.3249 0.0117 0.6135
0.7844 0.8962 0.2462 0.5399 0.8186
0.8828 0.8266 0.3427 0.0954 0.8862
0.9137 0.3900 0.3757 0.1465 0.9311
0.5583 0.4979 0.5466 0.6311 0.1908
0.5989 0.6948 0.5619 0.8593 0.2586
0.1489 0.8344 0.3958 0.9742 0.8979
0.8997 0.6096 0.3981 0.5708 0.5934
將原數據的每列排序后:
A =
0.1489 0.1228 0.0186 0.0117 0.0646
0.2467 0.2057 0.1170 0.0605 0.0710
0.3889 0.2753 0.2462 0.0842 0.1908
0.4067 0.2834 0.3249 0.0954 0.2586
0.4170 0.2850 0.3260 0.1343 0.3307
0.4547 0.3900 0.3427 0.1465 0.3945
0.4845 0.4073 0.3757 0.1639 0.4300
0.5583 0.4504 0.3958 0.3017 0.4362
0.5989 0.4979 0.3981 0.3242 0.4918
0.6669 0.6096 0.4378 0.4001 0.5155
0.7567 0.6643 0.4385 0.5154 0.5535
0.7844 0.6732 0.4564 0.5399 0.5934
0.8110 0.6948 0.5466 0.5708 0.6135
0.8641 0.7167 0.5619 0.6311 0.8186
0.8828 0.7626 0.5747 0.6575 0.8266
0.8997 0.8266 0.6748 0.7223 0.8862
0.9137 0.8344 0.7138 0.8319 0.8877
0.9337 0.8825 0.7209 0.8593 0.8979
0.9718 0.8962 0.8147 0.9509 0.9311
0.9880 0.8997 0.8844 0.9742 0.9969
請輸入等深分箱的深度h(1<h<20):3
經過等深分箱,用箱均值平滑處理后的數據:
B =
0.2615 0.2013 0.1273 0.0521 0.1088
0.2615 0.2013 0.1273 0.0521 0.1088
0.2615 0.2013 0.1273 0.0521 0.1088
0.4262 0.3195 0.3312 0.1254 0.3279
0.4262 0.3195 0.3312 0.1254 0.3279
0.4262 0.3195 0.3312 0.1254 0.3279
0.5472 0.4519 0.3899 0.2633 0.4527
0.5472 0.4519 0.3899 0.2633 0.4527
0.5472 0.4519 0.3899 0.2633 0.4527
0.7360 0.6490 0.4443 0.4851 0.5541
0.7360 0.6490 0.4443 0.4851 0.5541
0.7360 0.6490 0.4443 0.4851 0.5541
0.8526 0.7247 0.5611 0.6198 0.7529
0.8526 0.7247 0.5611 0.6198 0.7529
0.8526 0.7247 0.5611 0.6198 0.7529
0.9157 0.8478 0.7031 0.8045 0.8906
0.9157 0.8478 0.7031 0.8045 0.8906
0.9157 0.8478 0.7031 0.8045 0.8906
0.9799 0.8979 0.8495 0.9626 0.9640
0.9799 0.8979 0.8495 0.9626 0.9640
2.等寬分箱
輸入箱子的寬度w(0<w<1),將每列按等寬分箱,然后用箱均值平滑。
clear;clc;
A=rand(20,5); % 隨機生成20*5的矩陣,其中每個數取值范圍[0,1]
fprintf("當前生成的原數據:"); A
% 排序,參數1表示按列排序,取2為按行排序;'ascend'為升序,'descend'為降序
A=sort(A,1,'ascend');
fprintf("將原數據的每列排序后:"); A
w=input("請輸入等寬分箱的寬度w(0<w<1):");
%% 對每列進行等寬分箱,然后求每個箱子的均值
[n,m]=size(A); % n行m列
for j=1:m % 列j
pos=1; % 當前箱子第一個數的位置
A(n+1,j)=18e9; % 保證i=n+1時,A(i,j)-A(pos,j)>w一定成立
for i=1:n+1 % 行i
if A(i,j)-A(pos,j)>w % 當前箱子最后一個數的位置為i-1
B(pos:i-1,j)=mean(A(pos:i-1,j)); % 當前箱子的均值
pos=i; % 更新為下一個箱子的第一個數的位置
end
end
end
fprintf("\n經過等寬分箱,用箱均值平滑處理后的數據:"); B
代碼運行結果
輸入的寬度為0.2:
當前生成的原數據:
A =
0.5038 0.3600 0.6690 0.1432 0.9419
0.6128 0.4542 0.5002 0.5594 0.6559
0.8194 0.3864 0.2180 0.0046 0.4519
0.5319 0.7756 0.5716 0.7667 0.8397
0.2021 0.7343 0.1222 0.8487 0.5326
0.4539 0.4303 0.6712 0.9168 0.5539
0.4279 0.6938 0.5996 0.9870 0.6801
0.9661 0.9452 0.0560 0.5051 0.3672
0.6201 0.7842 0.0563 0.2714 0.2393
0.6954 0.7056 0.1525 0.1008 0.5789
0.7202 0.1093 0.0196 0.5078 0.8669
0.3469 0.3899 0.4352 0.5856 0.4068
0.5170 0.5909 0.8322 0.7629 0.1126
0.5567 0.4594 0.6174 0.0830 0.4438
0.1565 0.0503 0.5201 0.6616 0.3002
0.5621 0.2287 0.8639 0.5170 0.4014
0.6948 0.8342 0.0977 0.1710 0.8334
0.4265 0.0156 0.9081 0.9386 0.4036
0.8363 0.8637 0.1080 0.5905 0.3902
0.7314 0.0781 0.5170 0.4406 0.3604
將原數據的每列排序后:
A =
0.1565 0.0156 0.0196 0.0046 0.1126
0.2021 0.0503 0.0560 0.0830 0.2393
0.3469 0.0781 0.0563 0.1008 0.3002
0.4265 0.1093 0.0977 0.1432 0.3604
0.4279 0.2287 0.1080 0.1710 0.3672
0.4539 0.3600 0.1222 0.2714 0.3902
0.5038 0.3864 0.1525 0.4406 0.4014
0.5170 0.3899 0.2180 0.5051 0.4036
0.5319 0.4303 0.4352 0.5078 0.4068
0.5567 0.4542 0.5002 0.5170 0.4438
0.5621 0.4594 0.5170 0.5594 0.4519
0.6128 0.5909 0.5201 0.5856 0.5326
0.6201 0.6938 0.5716 0.5905 0.5539
0.6948 0.7056 0.5996 0.6616 0.5789
0.6954 0.7343 0.6174 0.7629 0.6559
0.7202 0.7756 0.6690 0.7667 0.6801
0.7314 0.7842 0.6712 0.8487 0.8334
0.8194 0.8342 0.8322 0.9168 0.8397
0.8363 0.8637 0.8639 0.9386 0.8669
0.9661 0.9452 0.9081 0.9870 0.9419
請輸入等寬分箱的寬度w(0<w<1):0.2
經過等寬分箱,用箱均值平滑處理后的數據:
B =
0.2352 0.0633 0.1038 0.1005 0.2174
0.2352 0.0633 0.1038 0.1005 0.2174
0.2352 0.0633 0.1038 0.1005 0.2174
0.5213 0.0633 0.1038 0.1005 0.4312
0.5213 0.3413 0.1038 0.1005 0.4312
0.5213 0.3413 0.1038 0.3560 0.4312
0.5213 0.3413 0.1038 0.3560 0.4312
0.5213 0.3413 0.1038 0.5610 0.4312
0.5213 0.4837 0.5373 0.5610 0.4312
0.5213 0.4837 0.5373 0.5610 0.4312
0.5213 0.4837 0.5373 0.5610 0.4312
0.5213 0.4837 0.5373 0.5610 0.4312
0.5213 0.7702 0.5373 0.5610 0.4312
0.7496 0.7702 0.5373 0.5610 0.6383
0.7496 0.7702 0.5373 0.8467 0.6383
0.7496 0.7702 0.7591 0.8467 0.6383
0.7496 0.7702 0.7591 0.8467 0.8705
0.7496 0.7702 0.7591 0.8467 0.8705
0.7496 0.7702 0.7591 0.8467 0.8705
0.9661 0.9452 0.9081 0.9870 0.8705