• 数据挖掘实验(二)数据预处理【等深分箱与等宽分箱】


    一、分箱平滑的原理

    (1)分箱方法

    在分箱前,一定要先排序数据,再将它们分到等深(等宽)的箱中。
    常见的有两种分箱方法:等深分箱和等宽分箱。

    等深分箱:按记录数进行分箱,每箱具有相同的记录数,每箱的记录数称为箱的权重,也称箱子的深度。
    等宽分箱:在整个属性值的区间上平均分布,即每个箱的区间范围设定为一个常量,称为箱子的宽度。

    (2)数据平滑

    将数据划分到不同的箱子之后,可以运用如下三种策略对每个箱子中的数据进行平滑处理:

    平均值平滑:箱中的每一个值被箱中数值的平均值替换。
    中值平滑:箱中的每一个值被箱中数值的中值替换。
    边界平滑:箱中的最大值和最小值称为箱子的边界,箱中的每一个值被最近的边界值替换。

    二、Matlab代码实现

    首先用rand()函数随机生成20*5的矩阵,其数据范围为[0,1]。

    1.等深分箱

    1. clear;clc; % 清除变量和命令窗口
    2. A=rand(20,5); % 随机生成20*5的矩阵,其中每个数取值范围[0,1]
    3. fprintf("当前生成的原数据:\n");
    4. disp(A);
    5. % 排序,参数1表示按列排序,取2为按行排序;'ascend'为升序,'descend'为降序
    6. A=sort(A,1,'ascend');
    7. fprintf("将原数据的每列排序后:\n");
    8. disp(A);
    9. h=input("请输入等深分箱的深度h(1);
    10. % 检查输入变量h是否有效
    11. if ~isnumeric(h) || ~isscalar(h) || h<=1 || h>=20 || h~=floor(h)
    12. error("输入变量h必须是一个大于1小于20的正整数");
    13. end
    14. %% 对每列进行等深分箱,然后求每个箱子的均值
    15. [n,m]=size(A); % n行m列
    16. B=zeros(n,m); % 预分配输出变量B
    17. for j=1:m % 列j
    18. for i=1:h:n % 行i
    19. % 当前箱子第一个数位置为i,最后一个数位置为min(i+h-1,n)
    20. p1=int64(i); % 转换成整数(i默认是double类型,但是索引必须要为整数)
    21. p2=int64(min(i+h-1,n));
    22. B(p1:p2,j)=mean(A(p1:p2,j)); % 当前箱子的均值
    23. end
    24. end % 结束行循环
    25. fprintf("\n经过等深分箱,用箱均值平滑处理后的数据:\n");
    26. disp(B);

    for i=1:h:n 的含义是:

    • i 是一个循环变量,它的初始值是 1。
    • h 是一个输入变量,它表示等深分箱的深度。
    • n 是一个由 size 函数得到的变量,它表示矩阵 A 的行数。
    • 这个循环的作用是从第一行开始,每隔 h 行取一行作为一个箱子的起始位置,然后计算这个箱子中所有元素的均值,并赋给输出矩阵 B 的相应位置。

    isnumeric 函数是一个用于判断输入是否为数值数组的函数。数值数组是指由数值类型的元素组成的数组,例如整数、浮点数、无穷大或非数字。MATLAB 中的数值类型包括 int8, int16, int32, int64, uint8, uint16, uint32, uint64, single, 和 double。

    isnumeric 函数的语法格式是:

    TF = isnumeric(A)
    

    其中,A 是输入数组,可以是任意维度的;TF 是输出逻辑值,如果 A 是数值数组,则返回 1 (true),否则返回 0 (false)。

    例如,如果 A 是一个包含整数和浮点数的矩阵,那么 isnumeric(A) 将返回 1;如果 A 是一个包含字符串或单元数组的矩阵,那么 isnumeric(A) 将返回 0。

    ~isscalar(h) 函数是一个逻辑表达式,它用于判断 h 是否不是一个标量。标量是一个大小为 1×1 的二维数组,也就是一个单个的数值。如果 h 不是一个标量,那么 ~isscalar(h) 将返回 1 (true),否则返回 0 (false)。 

     python代码为

    1. import numpy as np # 导入 numpy 库
    2. =
    3. A = np.random.rand(20,5) # 随机生成 20*5 的矩阵,其中每个数取值范围 [0,1]
    4. print("当前生成的原数据:")
    5. print(A)
    6. # 排序,参数 0 表示按列排序,取 1 为按行排序;'ascend' 为升序,'descend' 为降序
    7. A = np.sort(A, axis=0, kind='quicksort') # 使用快速排序算法
    8. print("将原数据的每列排序后:")
    9. print(A)
    10. h = int(input("请输入等深分箱的深度 h (1)) # 输入一个整数
    11. # 检查输入变量 h 是否有效
    12. if not isinstance(h, int) or h <= 1 or h >= 20: # 如果 h 不是一个大于 1 小于 20 的整数
    13. raise ValueError("输入变量 h 必须是一个大于 1 小于 20 的正整数") # 抛出异常
    14. # 对每列进行等深分箱,然后求每个箱子的均值
    15. n, m = A.shape # n 行 m 列
    16. B = np.zeros((n,m)) # 预分配输出变量 B
    17. for j in range(m): # 列 j
    18. for i in range(0, n, h): # 行 i
    19. # 当前箱子第一个数位置为 i,最后一个数位置为 min(i+h,n)
    20. p1 = int(i) # 转换成整数 (i 默认是 double 类型,但是索引必须要为整数)
    21. p2 = int(min(i+h,n))
    22. B[p1:p2,j] = np.mean(A[p1:p2,j]) # 当前箱子的均值
    23. print("\n经过等深分箱,用箱均值平滑处理后的数据:")
    24. print(B)
    代码运行结果

    输入的深度为3:

    1. 当前生成的原数据:
    2. A =
    3. 0.4067 0.4504 0.5747 0.5154 0.9969
    4. 0.6669 0.2057 0.3260 0.6575 0.5535
    5. 0.9337 0.8997 0.4564 0.9509 0.5155
    6. 0.8110 0.7626 0.7138 0.7223 0.3307
    7. 0.4845 0.8825 0.8844 0.4001 0.4300
    8. 0.7567 0.2850 0.7209 0.8319 0.4918
    9. 0.4170 0.6732 0.0186 0.1343 0.0710
    10. 0.9718 0.6643 0.6748 0.0605 0.8877
    11. 0.9880 0.1228 0.4385 0.0842 0.0646
    12. 0.8641 0.4073 0.4378 0.1639 0.4362
    13. 0.3889 0.2753 0.1170 0.3242 0.8266
    14. 0.4547 0.7167 0.8147 0.3017 0.3945
    15. 0.2467 0.2834 0.3249 0.0117 0.6135
    16. 0.7844 0.8962 0.2462 0.5399 0.8186
    17. 0.8828 0.8266 0.3427 0.0954 0.8862
    18. 0.9137 0.3900 0.3757 0.1465 0.9311
    19. 0.5583 0.4979 0.5466 0.6311 0.1908
    20. 0.5989 0.6948 0.5619 0.8593 0.2586
    21. 0.1489 0.8344 0.3958 0.9742 0.8979
    22. 0.8997 0.6096 0.3981 0.5708 0.5934
    23. 将原数据的每列排序后:
    24. A =
    25. 0.1489 0.1228 0.0186 0.0117 0.0646
    26. 0.2467 0.2057 0.1170 0.0605 0.0710
    27. 0.3889 0.2753 0.2462 0.0842 0.1908
    28. 0.4067 0.2834 0.3249 0.0954 0.2586
    29. 0.4170 0.2850 0.3260 0.1343 0.3307
    30. 0.4547 0.3900 0.3427 0.1465 0.3945
    31. 0.4845 0.4073 0.3757 0.1639 0.4300
    32. 0.5583 0.4504 0.3958 0.3017 0.4362
    33. 0.5989 0.4979 0.3981 0.3242 0.4918
    34. 0.6669 0.6096 0.4378 0.4001 0.5155
    35. 0.7567 0.6643 0.4385 0.5154 0.5535
    36. 0.7844 0.6732 0.4564 0.5399 0.5934
    37. 0.8110 0.6948 0.5466 0.5708 0.6135
    38. 0.8641 0.7167 0.5619 0.6311 0.8186
    39. 0.8828 0.7626 0.5747 0.6575 0.8266
    40. 0.8997 0.8266 0.6748 0.7223 0.8862
    41. 0.9137 0.8344 0.7138 0.8319 0.8877
    42. 0.9337 0.8825 0.7209 0.8593 0.8979
    43. 0.9718 0.8962 0.8147 0.9509 0.9311
    44. 0.9880 0.8997 0.8844 0.9742 0.9969
    45. 请输入等深分箱的深度h(120):3
    46. 经过等深分箱,用箱均值平滑处理后的数据:
    47. B =
    48. 0.2615 0.2013 0.1273 0.0521 0.1088
    49. 0.2615 0.2013 0.1273 0.0521 0.1088
    50. 0.2615 0.2013 0.1273 0.0521 0.1088
    51. 0.4262 0.3195 0.3312 0.1254 0.3279
    52. 0.4262 0.3195 0.3312 0.1254 0.3279
    53. 0.4262 0.3195 0.3312 0.1254 0.3279
    54. 0.5472 0.4519 0.3899 0.2633 0.4527
    55. 0.5472 0.4519 0.3899 0.2633 0.4527
    56. 0.5472 0.4519 0.3899 0.2633 0.4527
    57. 0.7360 0.6490 0.4443 0.4851 0.5541
    58. 0.7360 0.6490 0.4443 0.4851 0.5541
    59. 0.7360 0.6490 0.4443 0.4851 0.5541
    60. 0.8526 0.7247 0.5611 0.6198 0.7529
    61. 0.8526 0.7247 0.5611 0.6198 0.7529
    62. 0.8526 0.7247 0.5611 0.6198 0.7529
    63. 0.9157 0.8478 0.7031 0.8045 0.8906
    64. 0.9157 0.8478 0.7031 0.8045 0.8906
    65. 0.9157 0.8478 0.7031 0.8045 0.8906
    66. 0.9799 0.8979 0.8495 0.9626 0.9640
    67. 0.9799 0.8979 0.8495 0.9626 0.9640

    2.等宽分箱

    输入箱子的宽度w(0

    1. clear;clc; % 清除变量和命令窗口
    2. %A=rand(20,5); % 随机生成20*5的矩阵,其中每个数取值范围[0,1]
    3. A=[ 0.5038 0.3600 0.6690 0.1432 0.9419
    4. 0.6128 0.4542 0.5002 0.5594 0.6559
    5. 0.8194 0.3864 0.2180 0.0046 0.4519
    6. 0.5319 0.7756 0.5716 0.7667 0.8397
    7. 0.2021 0.7343 0.1222 0.8487 0.5326
    8. 0.4539 0.4303 0.6712 0.9168 0.5539
    9. 0.4279 0.6938 0.5996 0.9870 0.6801
    10. 0.9661 0.9452 0.0560 0.5051 0.3672
    11. 0.6201 0.7842 0.0563 0.2714 0.2393
    12. 0.6954 0.7056 0.1525 0.1008 0.5789
    13. 0.7202 0.1093 0.0196 0.5078 0.8669
    14. 0.3469 0.3899 0.4352 0.5856 0.4068
    15. 0.5170 0.5909 0.8322 0.7629 0.1126
    16. 0.5567 0.4594 0.6174 0.0830 0.4438
    17. 0.1565 0.0503 0.5201 0.6616 0.3002
    18. 0.5621 0.2287 0.8639 0.5170 0.4014
    19. 0.6948 0.8342 0.0977 0.1710 0.8334
    20. 0.4265 0.0156 0.9081 0.9386 0.4036
    21. 0.8363 0.8637 0.1080 0.5905 0.3902
    22. 0.7314 0.0781 0.5170 0.4406 0.3604];
    23. fprintf("当前生成的原数据:\n");
    24. disp(A);
    25. % 排序,参数1表示按列排序,取2为按行排序;'ascend'为升序,'descend'为降序
    26. A=sort(A,1,'ascend');
    27. fprintf("将原数据的每列排序后:\n");
    28. disp(A);
    29. w=input("请输入等宽分箱的宽度w(0);
    30. % 检查输入变量w是否有效
    31. if ~isnumeric(w) || ~isscalar(w) || w<=0
    32. error("输入变量w必须是一个大于0小于1的正数");
    33. end
    34. %% 对每列进行等宽分箱,然后求每个箱子的均值
    35. [n,m]=size(A); % n行m列
    36. B=zeros(n,m); % 预分配输出变量B
    37. for j=1:m % 列j
    38. pos=1; % 当前箱子第一个数的位置
    39. A(n+1,j)=18e9; % 保证i=n+1时,A(i,j)-A(pos,j)>w一定成立
    40. for i=1:n+1 % 行i
    41. if A(i,j)-A(pos,j)>w % 当前箱子最后一个数的位置为i-1
    42. B(pos:i-1,j)=mean(A(pos:i-1,j)); % 当前箱子的均值
    43. pos=i; % 更新为下一个箱子的第一个数的位置
    44. end
    45. end
    46. end
    47. fprintf("\n经过等宽分箱,用箱均值平滑处理后的数据:\n");
    48. disp(B);

    if A(i,j)-A(pos,j)>w

    这段代码的作用是判断当前元素是否属于当前箱子。如果当前元素与当前箱子的第一个元素的差大于 w,那么说明当前元素已经超出了当前箱子的范围,需要开始新的一个箱子;如果不大于 w,那么说明当前元素还在当前箱子内,继续循环。

    代码运行结果

    输入的宽度为0.2:

    1. 当前生成的原数据:
    2. A =
    3. 0.5038 0.3600 0.6690 0.1432 0.9419
    4. 0.6128 0.4542 0.5002 0.5594 0.6559
    5. 0.8194 0.3864 0.2180 0.0046 0.4519
    6. 0.5319 0.7756 0.5716 0.7667 0.8397
    7. 0.2021 0.7343 0.1222 0.8487 0.5326
    8. 0.4539 0.4303 0.6712 0.9168 0.5539
    9. 0.4279 0.6938 0.5996 0.9870 0.6801
    10. 0.9661 0.9452 0.0560 0.5051 0.3672
    11. 0.6201 0.7842 0.0563 0.2714 0.2393
    12. 0.6954 0.7056 0.1525 0.1008 0.5789
    13. 0.7202 0.1093 0.0196 0.5078 0.8669
    14. 0.3469 0.3899 0.4352 0.5856 0.4068
    15. 0.5170 0.5909 0.8322 0.7629 0.1126
    16. 0.5567 0.4594 0.6174 0.0830 0.4438
    17. 0.1565 0.0503 0.5201 0.6616 0.3002
    18. 0.5621 0.2287 0.8639 0.5170 0.4014
    19. 0.6948 0.8342 0.0977 0.1710 0.8334
    20. 0.4265 0.0156 0.9081 0.9386 0.4036
    21. 0.8363 0.8637 0.1080 0.5905 0.3902
    22. 0.7314 0.0781 0.5170 0.4406 0.3604
    23. 将原数据的每列排序后:
    24. A =
    25. 0.1565 0.0156 0.0196 0.0046 0.1126
    26. 0.2021 0.0503 0.0560 0.0830 0.2393
    27. 0.3469 0.0781 0.0563 0.1008 0.3002
    28. 0.4265 0.1093 0.0977 0.1432 0.3604
    29. 0.4279 0.2287 0.1080 0.1710 0.3672
    30. 0.4539 0.3600 0.1222 0.2714 0.3902
    31. 0.5038 0.3864 0.1525 0.4406 0.4014
    32. 0.5170 0.3899 0.2180 0.5051 0.4036
    33. 0.5319 0.4303 0.4352 0.5078 0.4068
    34. 0.5567 0.4542 0.5002 0.5170 0.4438
    35. 0.5621 0.4594 0.5170 0.5594 0.4519
    36. 0.6128 0.5909 0.5201 0.5856 0.5326
    37. 0.6201 0.6938 0.5716 0.5905 0.5539
    38. 0.6948 0.7056 0.5996 0.6616 0.5789
    39. 0.6954 0.7343 0.6174 0.7629 0.6559
    40. 0.7202 0.7756 0.6690 0.7667 0.6801
    41. 0.7314 0.7842 0.6712 0.8487 0.8334
    42. 0.8194 0.8342 0.8322 0.9168 0.8397
    43. 0.8363 0.8637 0.8639 0.9386 0.8669
    44. 0.9661 0.9452 0.9081 0.9870 0.9419
    45. 请输入等宽分箱的宽度w(01):0.2
    46. 经过等宽分箱,用箱均值平滑处理后的数据:
    47. B =
    48. 0.2352 0.0633 0.1038 0.1005 0.2174
    49. 0.2352 0.0633 0.1038 0.1005 0.2174
    50. 0.2352 0.0633 0.1038 0.1005 0.2174
    51. 0.5213 0.0633 0.1038 0.1005 0.4312
    52. 0.5213 0.3413 0.1038 0.1005 0.4312
    53. 0.5213 0.3413 0.1038 0.3560 0.4312
    54. 0.5213 0.3413 0.1038 0.3560 0.4312
    55. 0.5213 0.3413 0.1038 0.5610 0.4312
    56. 0.5213 0.4837 0.5373 0.5610 0.4312
    57. 0.5213 0.4837 0.5373 0.5610 0.4312
    58. 0.5213 0.4837 0.5373 0.5610 0.4312
    59. 0.5213 0.4837 0.5373 0.5610 0.4312
    60. 0.5213 0.7702 0.5373 0.5610 0.4312
    61. 0.7496 0.7702 0.5373 0.5610 0.6383
    62. 0.7496 0.7702 0.5373 0.8467 0.6383
    63. 0.7496 0.7702 0.7591 0.8467 0.6383
    64. 0.7496 0.7702 0.7591 0.8467 0.8705
    65. 0.7496 0.7702 0.7591 0.8467 0.8705
    66. 0.7496 0.7702 0.7591 0.8467 0.8705
    67. 0.9661 0.9452 0.9081 0.9870 0.8705

  • 相关阅读:
    python3.10.10安装
    C#为什么非要把函数叫方法?
    《痞子衡嵌入式半月刊》 第 60 期
    WPF/C#:数据绑定到方法
    整理完这篇代码,我哭了~原来我的钱是这样子消失的~~痛~太痛了~~
    数字化工厂建设方案探讨
    PLC相关概念
    匿名类型与元组(ValueTuple)
    虎牙、斗鱼同道同命:共同御寒
    Mysql数据库 9.SQL语言 查询语句 连接查询、子查询
  • 原文地址:https://blog.csdn.net/qq_62377885/article/details/133545512