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