聚类算法数据预处理——数据归一化

Posted 雨露笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聚类算法数据预处理——数据归一化相关的知识,希望对你有一定的参考价值。

归一化化定义:

        归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。


归一化处理的目的和意义:

        首先归一化是为了后面数据处理的方便,其次是保证程序运行时收敛加快。归一化的具体作用是归纳统一样本的统计分布性。在统计学中,归一化的具体作用是归纳统一样本的统计分布性。归一化在(0,1)之间是统计的概率分布,归一化在(-1.+1)之间是统计的坐标分布。


归一化的使用场合:

        在量纲不一而对比标准统一的情况下使用,比如含有身高(单位cm)和体重(单位kg)两个属性的人,假设一般情况下体重均值为60kg,身高均值为170cm。

1、两个变量对应的单位不一样,同样是100,对于身高来说很矮,但对于体重来说已经是超重了。

2、单位越小,数值越大,对结果的影响也越大,譬如170cm=1.7m。


以k-means算法举例说明

        标准k-means算法以欧式距离做为样本间相异度的度量规则。假设样本由二维变量(x,y)组成,x分布在(0,1),y分布在(100,1000)。样本间的距离

D = sqrt( (x1-x2)^2 + (y1-y2)^2 )

由于 (x1-x2)^2 远小于 (y1-y2)^2 ,因此D可近似等于 (y1-y2)^2 。这说明样本间的相异度基本取决于y维变量,x维变量对样本的相异度影响不大。因此忽略了x维变量对k-means算法的聚类贡献。在实际情况中,往往需要充分考虑将x维变量对聚类的影响。因此,数据的归一化是很重要的一个步骤。


归一化方法:

1、线性函数转换:  

y=(x-MinValue)/(MaxValue-MinValue)  

说明:x、y分别为转换前、后的值,MaxValue、MinValue分  别为样本的最大值和最小值。

2、对数函数转换:

y=log10(x)  

说明:以10为底的对数函数转换。


3、反余切函数转换:

y=atan(x)*2/PI

4、0均值标准化:

y = (x-mean)/std

其中mean为均值,std为标准差。比较前面3中方法,该方法考虑样本集的分布情况,保留样本集的方差信息,适用于样本集近似服从高斯分布。需要使用距离度量样本相似度时,或者使用PCA技术进行降维时,往往使用0均值标准化。


具体实现:

void MyKMeans::Normalize(vector<Sample>& Samples)

{

assert(Samples.size() > 1);

vector<float> min_elems(Samples[0].data.size(), FLT_MAX); // 样本集每一维度的最小值

vector<float> max_elems(Samples[0].data.size(), FLT_MIN); // 样本集每一维度的最大值

std::for_each(Samples.begin(), Samples.end(), [&](Sample& sample){

int i = 0;

std::for_each(sample.data.begin(), sample.data.end(), [&](float& var){

if (min_elems[i] > var)

min_elems[i] = var;

if (max_elems[i] < var)

max_elems[i] = var;

i++;

});

});

std::for_each(Samples.begin(), Samples.end(), [&](Sample& sample){

int i = 0;

std::for_each(sample.data.begin(), sample.data.end(), [&](float& var){

var = (var - min_elems[i]) / (max_elems[i] - min_elems[i]);  // 方法1

                        //var = log(var) / log(10); 方法2

//var = 2 * atan(var) / PI; 方法3

                        //var = (var - mean(Samples))/stdev(Samples);

i++;

});

});

}



参考资料:

http://blog.csdn.net/zbc1090549839/article/details/44103801

以上是关于聚类算法数据预处理——数据归一化的主要内容,如果未能解决你的问题,请参考以下文章

数据的归一化处理

Python:层次聚类分析——基于基站定位数据商圈分析

特征工程之归一化及标准化

聚类算法数据分析

特征工程2:归一化与标准化

第二节 数值型特征进行归一化或标准化处理