数据挖掘实验(⼀)数据规范化【最⼩-最⼤规范化、零-均值规范化、⼩数定标
规范化】
本⽂代码均已在 MATLAB R2019b 测试通过,如有错误,欢迎指正。
⽂章⽬录
⼀、数据规范化的原理
数据规范化处理是数据挖掘的⼀项基础⼯作。不同的属性变量往往具有不同的取值范围,数值间的差别可能很⼤,不进⾏处理可能会影响到数据分析的结果。为了消除指标之间由于取值范围带来的差异,需要进⾏标准化处理。将数据按照⽐例进⾏缩放,使之落⼊⼀个特定的区域,便于进⾏综合分析。
(1)最⼩-最⼤规范化
假定min和max分别为属性A的最⼩值和最⼤值,则通过下⾯公式将属性A上的值v映射到区间[new_min, new_max]中的v’:
fprintf格式
(2)零-均值规范化
将属性A的值根据其平均值mean和标准差std进⾏规范化:
(3)⼩数定标规范化
通过移动属性A的⼩数点位置进⾏规范化,⼩数点的移动依赖于A的最⼤绝对值:
其中,j是使 Max(| v’ |)<1的最⼩整数。
⼆、Matlab 代码实现
1.最⼩-最⼤规范化Matlab的代码可以写简单⼀点,不⽤像C++那样写两个for循环。
mi=min(A)默认求矩阵A每列的最⼩值,返回⼀个⾏向量mi。
repmat(mi,n,1)重复mi,重复⾏n次,重复列1次,从⽽形成与A相同⼤⼩的矩阵。
./可直接将两个矩阵所有相同位置的元素相除(不⽤写两个for循环)。
v =′(new _max −max −min v −min
new _min )+new _min
v =′
std v −mean
v =′10j
v
%%数据存⼊A
A=[785216022863
144-600-5212245
95-457468-1283
695966951054
1905276912051
1014034702487
1464134352571];
fprintf("原数据:"); A
new=input("请输⼊需要映射到的新区间。输⼊格式⽰例:[0,1]\n");
new_mi=new(1);
new_mx=new(2);
[n,m]=size(A);
mi=min(A);%求出A每列的最⼩值,形成⾏向量mi(不⽤for循环)
mx=max(A);%求出A每列的最⼤值,形成⾏向量mx
mi=repmat(mi,n,1);%将矩阵mi重复,⾏n次,列1次,调整到与A相同⼤⼩(之后就不⽤for循环了)
mx=repmat(mx,n,1);%将矩阵mx重复,⾏n次,列1次,调整到与A相同⼤⼩
B=(A-mi)./(mx-mi)*(new_mx-new_mi)+new_mi;%./的含义是将两个矩阵所有相同位置的元素相除
fprintf("\n经过最⼩最⼤规范化后:"); B
Matlab也有现成的mapminmax()函数直接实现最⼩-最⼤规范化:
B1=mapminmax(A')';%每列规范化到[-1,1]
B2=mapminmax(A',0,1)';%每列规范化到[0,1]
解释⼀下:
mapminmax()函数,默认按⾏最⼩最⼤规范化到[-1,1]。
由于默认是按⾏,如果要按列规范化,传参时需将A进⾏转置,将mapminmax()函数返回的结果再转置⼀下即可。
B2=mapminmax(A',0,1)',后⾯加上两个参数表⽰新区间的左右端点。
代码运⾏结果
输⼊的新区间范围为[0,1]:
95-457468-1283
695966951054
1905276912051
1014034702487
1464134352571
请输⼊需要映射到的新区间。输⼊格式⽰例:[0,1]
[0,1]
经过最⼩最⼤规范化后:
B =
0.07440.93730.9235  1.0000
0.6198000.8509
0.21490.11960.81330
0  1.0000  1.00000.5637
1.00000.94230.99670.8041
0.26450.83860.81500.9093
0.63640.84700.78620.9296
2.零-均值规范化
clear;clc;
%%数据存⼊A
A=[785216022863
144-600-5212245
95-457468-1283
695966951054
1905276912051
1014034702487
1464134352571];
A_mean=mean(A);% mean求的是每列的均值
A_std=std(A);% std求的是每列的标准差
[n,m]=size(A);
B=(A-repmat(A_mean,n,1))./repmat(A_std,n,1);
fprintf("原数据:"); A
fprintf("经过零均值规范化后:"); B
Matlab也有现成的zscore()函数直接实现零-均值规范化:
[B,A_mean,A_std]=zscore(A);%返回按列进⾏零均值规范化后的矩阵、每列均值、每列标准差B=zscore(A);%只返回按列进⾏零均值规范化后的矩阵
代码运⾏结果
95-457468-1283
695966951054
1905276912051
1014034702487
1464134352571
经过零均值规范化后:
B =
-0.90540.63590.46450.7981
0.6047-1.5877-2.19320.3694
-0.5164-1.30400.1474-2.0783
-
1.11130.78460.6846-0.4569
1.65710.64780.67520.2348
-0.37910.40180.15210.5373
0.65040.42160.06930.5956
3.⼩数定标规范化
clear;clc;
%%数据存⼊A
A=[785216022863
144-600-5212245
95-457468-1283
695966951054
1905276912051
1014034702487
1464134352571];
mx=max(abs(A));%求每列绝对值最⼤的数mx
len=floor(log10(mx))+1;%求绝对值最⼤的数的位数len B=A./(10.^len);%按列将A中每个元素除以相同的10^len
fprintf("原数据:"); A
fprintf("经过⼩数定标规范化后:"); B
代码运⾏结果
95-457468-1283
695966951054
1905276912051
1014034702487
1464134352571
经过⼩数定标规范化后:
B =
0.07800.52100.60200.2863 0.1440-0.6000-0.52100.2245 0.0950-0.45700.4680-0.1283 0.06900.59600.69500.1054 0.19000.52700.69100.2051 0.10100.40300.47000.2487 0.14600.41300.43500.2571

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。