机器学习常见归一化方法及实现
原文: https://www.likecs.com/show-204855397.html
归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为标量。 在多种计算中都经常用到这种方法。在对数据进行算法训练时,由于数据的问题可能导致算法的效果并不理想,这时候可以考虑一下对数据进行归一化方法。
比较常用的又线性归一化,0 均值归一化,以及其他数学函数演变而来的归一化方法。下面列出我所用过的归一化方法。
- 线性归一化—Min-Max 归一化。公式如下
Xnorm 是归一化后的值,Xmax,Xmin 为归一化前数据的最大值和最小值。该方法把数据压缩到区间 [0, 1] 之间,是原数据的等比缩放。如果最大值和最小值相等需要注意是没法归一化的。所有的值相等没有区别。
例子:元数据:DataFrame
归一化代码:
def my_max_min(x):
return (x-min(x))/(max(x)-min(x))
df = df.agg(my_max_min)
Sklearn 库实现 Max-Min 归一化:
from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()
Xnorm = min_max_scaler.fit_transform(df)
print(Xnorm)# <class 'numpy.ndarray'>
可以看到和上面自己写的函数一模一样,只是输出的格式是 ndarray 格式。
注:在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以尝试这种归一化方法。
- 0 均值归一化:公式如下
x 是原始数据, u 是原始数据的均值,σ原始数据的标准差。0 均值归一化方法将原始数据集归一化为均值为 0、方差 1 的数据集.
例子:
def my_mean_norm(x):
return (x-np.mean(x))/np.std(x)
df = df.agg(my_mean_norm)
print(df)
min_max_scaler = preprocessing.StandardScaler()
Xnorm = min_max_scaler.fit_transform(df)
print(Xnorm)
注:在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用 PCA 技术进行降维的时候,第二种方法 (Z-score standardization) 表现更好。
- Atan() 归一化:公式如下:
*y=atan(x)2/PI
画出曲线如下图:
X = np.linspace(-10, 10, 100)
y = [math.atan(x)*2/math.pi for x in X]# math.atan(x) x 不能是数组只能是一个值
plt.plot(X, y)
plt.show()
可以看到此函数把数据压缩有 (-1, 1) 之内了。
- Log10() 压缩数据,公式如下:(或者对应其他数为底的数据压缩都可以)
def my_log(x):
return np.log10(x) / np.log10(max(x))
df = df.agg(my_log)
print(df)
注意:除以 log10(max)****,max 为样本数据最大值,并且所有的数据都要大于等于 1**,这样才能保证归一化后的数据在 [0-1]** 之间,适用范围有限。
- 模糊量化模式,公式如下:
1/2+1/2sin(pi/(max-min)(x-(max-min)/2))
归一化:
def my_mohu(x):
return 1/2.0+np.sin((math.pi**(x-(max(x)-min(x))/2.0))/(max(x)-min(x)))/2.0
df = df.agg(my_mohu)
print(df)
下面几个在神经网络里面用的 ** 函数,是为了增加非线性因素,有时候也可以考虑一下对数据的压缩转换。
- Logistics 转换,也就是 sigmoid 函数。
函数图形:
- tanh 函数
公式如下:
函数图形:
- ReLU 函数,公式如下:
函数图形:
原文链接:来源网络,如有侵犯到您的权益请联系 zengyin969@gmail.com 进行下架处理