min-max标准化,0均值归一化,L2规范化 c++实现
最小-最大规范化对原始数据进行线性变换,变换到[0,1]区间(也可以是其他固定最小最大值的区间)xnxn−minmax−min。
机器学习中的数据预处理方法
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)/(max−min)
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=(∣x1∣p+∣x2∣p+…+∣xn∣p)1/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=0∑n∣xi∣2
#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;
}
}
}
更多推荐
所有评论(0)