数据挖掘实验(一)数据规范化【最小-最大规范化、零-均值规范化、小数定标规范化】

一、数据规范化的原理

数据规范化处理是数据挖掘的一项基础工作。不同的属性变量往往具有不同的取值范围,数值间的差别可能很大,不进行处理可能会影响到数据分析的结果。为了消除指标之间由于取值范围带来的差异,需要进行标准化处理。将数据按照比例进行缩放,使之落入一个特定的区域,便于进行综合分析。

1.1.最小-最大规范化

Matlab 复制代码
clear;clc;
A = [78 521 602 2863
    144 -600 -521 2245
    95 -457 468 -1283
    69 596 695 1054
    190 527 691 2051
    101 403 470 2487
    146 413 435 2571];

new = input("请输入需要映射到的新区间。输入格式示例:[0,1]\n");
new_mi = new(1);
new_mx = new(2);
% 计算每列的最小值和最大值
min_vals = min(A);
max_vals = max(A);

% 对每个元素进行最小-最大规范化
normalized_A = (A - min_vals) ./ (max_vals - min_vals)* (new_mx - new_mi) + new_mi;;

disp(normalized_A);

MATLAB支持广播机制的,在进行矩阵运算时,可以自动扩展维度较小的矩阵,使其与维度较大的矩阵相匹配,从而实现逐元素的运算。

在MATLAB中,要实现广播机制,需要满足以下条件:

  • 运算的两个矩阵相应维度的大小要么相同,要么其中一个为1。
  • 运算符必须是逐元素的运算符,如.*、./、.\、.^等,不能是矩阵乘法*或矩阵除法/。
  • 如果运算的两个矩阵都是列向量或者行向量,那么它们可以直接进行逐元素运算,无需扩展维度。
    disp函数是MATLAB中用于在命令行窗口中显示输出的函数。它可以显示各种类型的数据,包括数字、字符串、矩阵等。
Matlab 复制代码
A = [78 521 602 2863
    144 -600 -521 2245
    95 -457 468 -1283
    69 596 695 1054
    190 527 691 2051
    101 403 470 2487
    146 413 435 2571];
new = input("请输入需要映射到的新区间。输入格式示例:[0,1]\n");
new_mi = new(1);
new_mx = new(2);
B = mapminmax(A',new_mi ,new_mx)';
fprintf("\n经过最小最大规范化后:\n"); 
disp(B)

Matlab有一个现成的函数可以实现最小-最大规范化,它就是 mapminmax() 函数

Matlab 复制代码
[Y,PS] = mapminmax(X,YMIN,YMAX)

其中X是要规范化的矩阵或向量,YMIN和YMAX是指定的区间端点(默认为-1和1),Y是规范化后的矩阵或向量,PS是一个结构体,包含了规范化所用的参数,如最小值、最大值、缩放因子等。如果要对另一个矩阵或向量应用相同的规范化参数,可以使用 mapminmax('apply',X,PS) 函数。

代码运行结果

输入的新区间范围为[0,1]:

Matlab 复制代码
原数据:
A =

          78         521         602        2863
         144        -600        -521        2245
          95        -457         468       -1283
          69         596         695        1054
         190         527         691        2051
         101         403         470        2487
         146         413         435        2571

请输入需要映射到的新区间。输入格式示例:[0,1]
[0,1]

经过最小最大规范化后:
B =

    0.0744    0.9373    0.9235    1.0000
    0.6198         0         0    0.8509
    0.2149    0.1196    0.8133         0
         0    1.0000    1.0000    0.5637
    1.0000    0.9423    0.9967    0.8041
    0.2645    0.8386    0.8150    0.9093
    0.6364    0.8470    0.7862    0.9296

1.2零-均值规范化

Matlab 复制代码
clear;clc;

%% 数据存入A
A=[78 521 602 2863	
144 -600 -521 2245	
95 -457 468 -1283
69 596 695 1054
190 527 691 2051
101 403 470 2487
146 413 435 2571];

A_mean=mean(A); % mean求的是每列的均值
A_std=std(A); % std求的是每列的标准差
[n,m]=size(A);
B=(A-A_mean)./A_std;

fprintf("原数据:"); 
disp(A);
fprintf("经过零均值规范化后:"); 
disp(B);
代码运行结果
Matlab 复制代码
原数据:
A =

          78         521         602        2863
         144        -600        -521        2245
          95        -457         468       -1283
          69         596         695        1054
         190         527         691        2051
         101         403         470        2487
         146         413         435        2571

经过零均值规范化后:
B =

   -0.9054    0.6359    0.4645    0.7981
    0.6047   -1.5877   -2.1932    0.3694
   -0.5164   -1.3040    0.1474   -2.0783
   -1.1113    0.7846    0.6846   -0.4569
    1.6571    0.6478    0.6752    0.2348
   -0.3791    0.4018    0.1521    0.5373
    0.6504    0.4216    0.0693    0.5956
Matlab 复制代码
clear;clc;

%% 数据存入A
A=[78 521 602 2863	
144 -600 -521 2245	
95 -457 468 -1283
69 596 695 1054
190 527 691 2051
101 403 470 2487
146 413 435 2571];

B = zscore (A); % 沿每列计算标准差

fprintf("原数据:"); 
disp(A);
fprintf("经过零均值规范化后:"); 
disp(B);

Matlab有一个现成的函数可以实现零-均值规范化,它就是 zscore() 函数1。这个函数可以计算一个数组或向量中元素的标准差,并返回每个元素的 z 分数,即对数据进行中心化和缩放处理,使其均值为 0,标准差为 1。

Matlab 复制代码
Z = zscore (X) % 计算X沿第一个非单一维度的标准差
Z = zscore (X,flag) % 指定标准差的类型
Z = zscore (X,flag,'all') % 使用X中所有值的均值和标准差
Z = zscore (X,flag,dim) % 指定沿哪个维度计算
Z = zscore (X,flag,vecdim) % 指定沿多个维度计算
[Z,mu,sigma] = zscore ( ___) % 还返回均值和标准差

1.3小数定标规范化

Matlab 复制代码
clear;clc;

%% 数据存入A
A = [78 521 602 2863
    144 -600 -521 2245
    95 -457 468 -1283
    69 596 695 1054
    190 527 691 2051
    101 403 470 2487
    146 413 435 2571];

mx = max(abs(A)); % 求每列绝对值最大的数mx
len = floor(log10(mx))+1; % 求mx的位数len
B = A ./ (10.^len); % 将A中每个元素除以10^len

fprintf("原数据:\n"); 
disp(A);
fprintf("经过小数定标规范化:\n"); 
disp(B);
代码运行结果
Matlab 复制代码
原数据:
A =

          78         521         602        2863
         144        -600        -521        2245
          95        -457         468       -1283
          69         596         695        1054
         190         527         691        2051
         101         403         470        2487
         146         413         435        2571

经过小数定标规范化后:
B =

    0.0780    0.5210    0.6020    0.2863
    0.1440   -0.6000   -0.5210    0.2245
    0.0950   -0.4570    0.4680   -0.1283
    0.0690    0.5960    0.6950    0.1054
    0.1900    0.5270    0.6910    0.2051
    0.1010    0.4030    0.4700    0.2487
    0.1460    0.4130    0.4350    0.2571
相关推荐
QuantumYou2 分钟前
计算机视觉 对比学习 串烧二
人工智能·学习·计算机视觉
阿利同学2 分钟前
热成像目标检测数据集
人工智能·目标检测·机器学习·目标跟踪·数据集·热成像目标检测数据集·机器学习 深度学习
拥抱AGI17 分钟前
我说大模型微调没啥技术含量,谁赞成谁反对?
人工智能·学习·语言模型·大模型学习·大模型入门·大模型教程
aqymnkstkw19 分钟前
2024年【电气试验】考试题库及电气试验模拟试题
大数据·c语言·人工智能·嵌入式硬件·安全
阡之尘埃26 分钟前
Python数据分析案例59——基于图神经网络的反欺诈交易检测(GCN,GAT,GIN)
python·神经网络·数据挖掘·数据分析·图神经网络·反欺诈·风控大数据
2401_85044049737 分钟前
激发AI创造力:掌握Prompt提示词的高效提问方法
人工智能·prompt
Terry Cao 漕河泾1 小时前
SRT3D: A Sparse Region-Based 3D Object Tracking Approach for the Real World
人工智能·计算机视觉·3d·目标跟踪
多猫家庭2 小时前
宠物毛发对人体有什么危害?宠物空气净化器小米、希喂、352对比实测
人工智能·宠物
AI完全体2 小时前
AI小项目4-用Pytorch从头实现Transformer(详细注解)
人工智能·pytorch·深度学习·机器学习·语言模型·transformer·注意力机制
AI知识分享官2 小时前
智能绘画Midjourney AIGC在设计领域中的应用
人工智能·深度学习·语言模型·chatgpt·aigc·midjourney·llama