一、分箱平滑的原理
(1)分箱方法
在分箱前,一定要先排序數(shù)據(jù),再將它們分到等深(等寬)的箱中。
常見(jiàn)的有兩種分箱方法:等深分箱和等寬分箱。
等深分箱:按記錄數(shù)進(jìn)行分箱,每箱具有相同的記錄數(shù),每箱的記錄數(shù)稱(chēng)為箱的權(quán)重,也稱(chēng)箱子的深度。
等寬分箱:在整個(gè)屬性值的區(qū)間上平均分布,即每個(gè)箱的區(qū)間范圍設(shè)定為一個(gè)常量,稱(chēng)為箱子的寬度。
(2)數(shù)據(jù)平滑
將數(shù)據(jù)劃分到不同的箱子之后,可以運(yùn)用如下三種策略對(duì)每個(gè)箱子中的數(shù)據(jù)進(jìn)行平滑處理:
平均值平滑:箱中的每一個(gè)值被箱中數(shù)值的平均值替換。
中值平滑:箱中的每一個(gè)值被箱中數(shù)值的中值替換。
邊界平滑:箱中的最大值和最小值稱(chēng)為箱子的邊界,箱中的每一個(gè)值被最近的邊界值替換。
二、Matlab代碼實(shí)現(xiàn)
首先用rand()函數(shù)隨機(jī)生成20*5的矩陣,其數(shù)據(jù)范圍為[0,1]。
1.等深分箱
clear;clc; % 清除變量和命令窗口
A=rand(20,5); % 隨機(jī)生成20*5的矩陣,其中每個(gè)數(shù)取值范圍[0,1]
fprintf("當(dāng)前生成的原數(shù)據(jù):\n");
disp(A);
% 排序,參數(shù)1表示按列排序,取2為按行排序;'ascend'為升序,'descend'為降序
A=sort(A,1,'ascend');
fprintf("將原數(shù)據(jù)的每列排序后:\n");
disp(A);
h=input("請(qǐng)輸入等深分箱的深度h(1<h<20):");
% 檢查輸入變量h是否有效
if ~isnumeric(h) || ~isscalar(h) || h<=1 || h>=20 || h~=floor(h)
error("輸入變量h必須是一個(gè)大于1小于20的正整數(shù)");
end
%% 對(duì)每列進(jìn)行等深分箱,然后求每個(gè)箱子的均值
[n,m]=size(A); % n行m列
B=zeros(n,m); % 預(yù)分配輸出變量B
for j=1:m % 列j
for i=1:h:n % 行i
% 當(dāng)前箱子第一個(gè)數(shù)位置為i,最后一個(gè)數(shù)位置為min(i+h-1,n)
p1=int64(i); % 轉(zhuǎn)換成整數(shù)(i默認(rèn)是double類(lèi)型,但是索引必須要為整數(shù))
p2=int64(min(i+h-1,n));
B(p1:p2,j)=mean(A(p1:p2,j)); % 當(dāng)前箱子的均值
end
end % 結(jié)束行循環(huán)
fprintf("\n經(jīng)過(guò)等深分箱,用箱均值平滑處理后的數(shù)據(jù):\n");
disp(B);
for i=1:h:n 的含義是:
- i 是一個(gè)循環(huán)變量,它的初始值是 1。
- h 是一個(gè)輸入變量,它表示等深分箱的深度。
- n 是一個(gè)由 size 函數(shù)得到的變量,它表示矩陣 A 的行數(shù)。
- 這個(gè)循環(huán)的作用是從第一行開(kāi)始,每隔 h 行取一行作為一個(gè)箱子的起始位置,然后計(jì)算這個(gè)箱子中所有元素的均值,并賦給輸出矩陣 B 的相應(yīng)位置。
isnumeric 函數(shù)是一個(gè)用于判斷輸入是否為數(shù)值數(shù)組的函數(shù)。數(shù)值數(shù)組是指由數(shù)值類(lèi)型的元素組成的數(shù)組,例如整數(shù)、浮點(diǎn)數(shù)、無(wú)窮大或非數(shù)字。MATLAB 中的數(shù)值類(lèi)型包括 int8, int16, int32, int64, uint8, uint16, uint32, uint64, single, 和 double。
isnumeric 函數(shù)的語(yǔ)法格式是:
TF = isnumeric(A)
其中,A 是輸入數(shù)組,可以是任意維度的;TF 是輸出邏輯值,如果 A 是數(shù)值數(shù)組,則返回 1 (true),否則返回 0 (false)。
例如,如果 A 是一個(gè)包含整數(shù)和浮點(diǎn)數(shù)的矩陣,那么 isnumeric(A) 將返回 1;如果 A 是一個(gè)包含字符串或單元數(shù)組的矩陣,那么 isnumeric(A) 將返回 0。
~isscalar(h) 函數(shù)是一個(gè)邏輯表達(dá)式,它用于判斷 h 是否不是一個(gè)標(biāo)量。標(biāo)量是一個(gè)大小為 1×1 的二維數(shù)組,也就是一個(gè)單個(gè)的數(shù)值。如果 h 不是一個(gè)標(biāo)量,那么 ~isscalar(h) 將返回 1 (true),否則返回 0 (false)。?
?python代碼為
import numpy as np # 導(dǎo)入 numpy 庫(kù)
=
A = np.random.rand(20,5) # 隨機(jī)生成 20*5 的矩陣,其中每個(gè)數(shù)取值范圍 [0,1]
print("當(dāng)前生成的原數(shù)據(jù):")
print(A)
# 排序,參數(shù) 0 表示按列排序,取 1 為按行排序;'ascend' 為升序,'descend' 為降序
A = np.sort(A, axis=0, kind='quicksort') # 使用快速排序算法
print("將原數(shù)據(jù)的每列排序后:")
print(A)
h = int(input("請(qǐng)輸入等深分箱的深度 h (1<h<20):")) # 輸入一個(gè)整數(shù)
# 檢查輸入變量 h 是否有效
if not isinstance(h, int) or h <= 1 or h >= 20: # 如果 h 不是一個(gè)大于 1 小于 20 的整數(shù)
raise ValueError("輸入變量 h 必須是一個(gè)大于 1 小于 20 的正整數(shù)") # 拋出異常
# 對(duì)每列進(jìn)行等深分箱,然后求每個(gè)箱子的均值
n, m = A.shape # n 行 m 列
B = np.zeros((n,m)) # 預(yù)分配輸出變量 B
for j in range(m): # 列 j
for i in range(0, n, h): # 行 i
# 當(dāng)前箱子第一個(gè)數(shù)位置為 i,最后一個(gè)數(shù)位置為 min(i+h,n)
p1 = int(i) # 轉(zhuǎn)換成整數(shù) (i 默認(rèn)是 double 類(lèi)型,但是索引必須要為整數(shù))
p2 = int(min(i+h,n))
B[p1:p2,j] = np.mean(A[p1:p2,j]) # 當(dāng)前箱子的均值
print("\n經(jīng)過(guò)等深分箱,用箱均值平滑處理后的數(shù)據(jù):")
print(B)
代碼運(yùn)行結(jié)果
輸入的深度為3:
當(dāng)前生成的原數(shù)據(jù):
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
將原數(shù)據(jù)的每列排序后:
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
請(qǐng)輸入等深分箱的深度h(1<h<20):3
經(jīng)過(guò)等深分箱,用箱均值平滑處理后的數(shù)據(jù):
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); % 隨機(jī)生成20*5的矩陣,其中每個(gè)數(shù)取值范圍[0,1]
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];
fprintf("當(dāng)前生成的原數(shù)據(jù):\n");
disp(A);
% 排序,參數(shù)1表示按列排序,取2為按行排序;'ascend'為升序,'descend'為降序
A=sort(A,1,'ascend');
fprintf("將原數(shù)據(jù)的每列排序后:\n");
disp(A);
w=input("請(qǐng)輸入等寬分箱的寬度w(0<w<1):");
% 檢查輸入變量w是否有效
if ~isnumeric(w) || ~isscalar(w) || w<=0
error("輸入變量w必須是一個(gè)大于0小于1的正數(shù)");
end
%% 對(duì)每列進(jìn)行等寬分箱,然后求每個(gè)箱子的均值
[n,m]=size(A); % n行m列
B=zeros(n,m); % 預(yù)分配輸出變量B
for j=1:m % 列j
pos=1; % 當(dāng)前箱子第一個(gè)數(shù)的位置
A(n+1,j)=18e9; % 保證i=n+1時(shí),A(i,j)-A(pos,j)>w一定成立
for i=1:n+1 % 行i
if A(i,j)-A(pos,j)>w % 當(dāng)前箱子最后一個(gè)數(shù)的位置為i-1
B(pos:i-1,j)=mean(A(pos:i-1,j)); % 當(dāng)前箱子的均值
pos=i; % 更新為下一個(gè)箱子的第一個(gè)數(shù)的位置
end
end
end
fprintf("\n經(jīng)過(guò)等寬分箱,用箱均值平滑處理后的數(shù)據(jù):\n");
disp(B);
if A(i,j)-A(pos,j)>w
這段代碼的作用是判斷當(dāng)前元素是否屬于當(dāng)前箱子。如果當(dāng)前元素與當(dāng)前箱子的第一個(gè)元素的差大于 w,那么說(shuō)明當(dāng)前元素已經(jīng)超出了當(dāng)前箱子的范圍,需要開(kāi)始新的一個(gè)箱子;如果不大于 w,那么說(shuō)明當(dāng)前元素還在當(dāng)前箱子內(nèi),繼續(xù)循環(huán)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-727494.html
代碼運(yùn)行結(jié)果
輸入的寬度為0.2:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-727494.html
當(dāng)前生成的原數(shù)據(jù):
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
將原數(shù)據(jù)的每列排序后:
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
請(qǐng)輸入等寬分箱的寬度w(0<w<1):0.2
經(jīng)過(guò)等寬分箱,用箱均值平滑處理后的數(shù)據(jù):
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
到了這里,關(guān)于數(shù)據(jù)挖掘?qū)嶒?yàn)(二)數(shù)據(jù)預(yù)處理【等深分箱與等寬分箱】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!