学习数据挖掘、机器学习的同学们应该经常碰到数据归一化(也称标准化),数据的不同特征种类(评价指标)的取值范围差别可能很大,如果不做处理会影响数据分析的结果。因此需要把数据进行标准化处理,将数据进行比例缩放,以消除不同特征间量纲和取值范围差异带来的影响。
数据归一化处理对基于距离的数据挖掘算法尤为重要。下面就简要介绍3种常用的数据归一化方法。
1、最大最小归一化
该方法也称离差标准化,其核心思想是把原始数据的数值线性变换到[0,1]之间,公式如下:
其中,max、min分别为样本数据的最大值、最小值。
优点:保留源数据存在的关系,消除取值范围最简单的方法;
缺点:极易受个别离群值影响,如果数据集中某个数值很大,其他各值归一化后会接近0;此外,如果遇到超出[min,max]的值,会出现错误。
2、零-均值归一化
也称标准差归一化,顾名思义,经处理的数据的均值为0,标准差为1,公式如下:
其中,、σ分别为源数据的均值、标准差。
该方法被广泛使用,但均值和标准差也一样易受离群值影响,因此需要进行修正,比如:可用中位数取代均值进行上述计算。
3、小数定标规范化
该方法是通过移动特征数据的小数位数,将其转换到[-1,1]之间,移动的小数位由特征值绝对值的最大值决定,公式如下:
下面来看看3种方法的代码实现:
%读入数据
data='../input/normalizationData.xls';
[data, ~]=xlsread(data);
%方法一:最大最小归一化
data_scatter = mapminmax(data',0,1); %把数据进行转置
data_scatter = data_scatter';
%方法二:零-均值归一化
data_zscore = zscore(data);
%方法三:小数定标归一化
max_ = max(abs(data));
max_ = power(10, ceil(log10(max_)));
cols = size(max_, 2);
data_dot = data;
for i = 1:cols
data_dot(:,i) = data(:,i)/max_(1,i);
end
%打印输出结果
disp('源数据如下:');
disp(data);
disp('最大最小归一化结果如下:');
disp(data_scatter);
disp('零-均值归一化结果如下:');
disp(data_zscore);
disp('小数定标归一化结果如下:');
disp(data_dot);