min-max标准化,0均值归一化,L2规范化 c++实现

机器学习中的数据预处理方法

1.最小-最大规范化

最小-最大规范化对原始数据进行线性变换,变换到[0,1]区间(也可以是其他固定最小最大值的区间)
x [ n ] = ( x [ n ] − m i n ) / ( m a x − m i n ) x[n] = (x[n]-min)/(max-min) x[n]=(x[n]min)/(maxmin)

2. 标准化(Standardization or Mean Removal and Variance Scaling)

变换后各维特征有0均值,单位方差。也叫z-score规范化(零均值规范化)。计算方式是将特征值减去均值,除以标准差。
x [ n ] = ( x [ n ] − m e a n ) / s t d e v x[n] = (x[n]-mean)/stdev x[n]=(x[n]mean)/stdev

3. L2-Normalization ( 人脸识别中会用到 )

Normalization主要思想是对每个样本计算其p-范数,然后对该样本中每个元素除以该范数,这样处理的结果是使得每个处理后样本的p-范数(l1-norm,l2-norm)等于1。
p-范数的计算公式: ∣ ∣ X ∣ ∣ p = ( ∣ x 1 ∣ p + ∣ x 2 ∣ p + … + ∣ x n ∣ p ) 1 / p ||X||p = ( |x1|^p + |x2|^p +…+ |xn|^p )^1/p ∣∣X∣∣p=(x1p+x2p++xnp1/p
该方法主要应用于文本分类和聚类中。例如,对于两个TF-IDF向量的l2-norm进行点积,就可以得到这两个向量的余弦相似性。

L2的计算公式为: ∣ ∣ X ∣ ∣ p = ∑ i = 0 n ∣ x i ∣ 2 ||X||p = \sqrt{\sum_{i=0}^n|x_i|^2} ∣∣X∣∣p=i=0nxi2

#include <iostream>
#include <vector>
#include <algorithm>

//
//常用的标准化方法:min-max标准化、 0均值归一化、 L2规范化
enum NormalizationFlag {
	MIN_MAX = 0,
	Z_SCORE = 1,
	L2 = 2
};
template<typename _Tp> void normalization(_Tp* src, int length, int normalizationFlag = Z_SCORE)
{
	if (normalizationFlag == MIN_MAX) {
		const _Tp min = *std::min_element(src, src + length);
		const _Tp max = *std::max_element(src, src + length);
		for (int i = 0; i < length; ++i)
		{
			src[i] = (src[i] - min) / (max - min);
		}
	}
	else if (normalizationFlag == Z_SCORE) {
		_Tp mean = 0;
		for (int i = 0; i < length; ++i) {
			mean += src[i];
		}
		mean = mean / length;	//均值
		_Tp stdev = 0;
		for (int i = 0; i < length; ++i) {
			stdev += (src[i] - mean) * (src[i] - mean);
		}
		stdev = stdev / (length - 1);
		stdev = sqrt(stdev);	//标准差
		for (int i = 0; i < length; ++i) {
			src[i] = (src[i] - mean) / stdev;
		}
	}
	else if (normalizationFlag == L2) {
		_Tp src_p = 0;
		for (int i = 0; i < length; ++i) {
			src_p += src[i] * src[i];
		}
		src_p = sqrt(src_p);	//L2范数
		for (int i = 0; i < length; ++i) {
			src[i] = src[i] / src_p;
		}
	}
}
  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值