前言
归一化函数是指将一组数据映射到某个特定区间内的函数。常见的归一化函数有最小-最大归一化、z-score归一化、基于平均值的归一化等。其目的是将各种不同规模、不同单位的数据统一在一个相同的区间内进行比较和处理,避免数据的规模和单位对分析结果造成影响。常见的特定区间包括[0,1]、[-1,1]等。
一、归一化函数
1.推导过程
下面以最小-最大归一化为例,推导归一化的过程:
最小-最大归一化将样本数据映射到[0,1]的范围内,具体步骤如下:
- 确定样本数据的最大值(max)和最小值(min);
- 对于每个数据点x,将其归一化为(x-min)/(max-min)的值;
- 得到的结果在[0,1]范围内。
假设有如下的样本数据:
数据编号 | 数据值 |
---|---|
1 | 3 |
2 | 5 |
3 | 7 |
4 | 9 |
-
确定样本数据的最大值和最小值:
max = 9
min = 3
-
对于每个数据点x,将其归一化为(x-min)/(max-min)的值:
数据编号1的归一化结果为(3-3)/(9-3)=0
数据编号2的归一化结果为(5-3)/(9-3)=0.33
数据编号3的归一化结果为(7-3)/(9-3)=0.66
数据编号4的归一化结果为(9-3)/(9-3)=1
-
得到的结果在[0,1]范围内,最终的归一化结果如下:
数据编号 | 数据值 | 归一化结果 |
---|---|---|
1 | 3 | 0 |
2 | 5 | 0.33 |
3 | 7 | 0.66 |
4 | 9 | 1 |
这样,我们就将不同规模的数据映射到了相同的区间范围内,方便后续的数据处理和分析。
2.应用场景
归一化函数在数据预处理中被广泛应用,以下是一些归一化函数的应用场景:
- 特征缩放
在机器学习中,特征缩放是一种预处理技术,它可以将不同的特征放入同一规模的区间内,避免不同特征的取值范围相差过大而对模型的训练和预测造成影响。归一化函数是一种特征缩放的方法,能够将数据缩放到[0,1]或者[-1,1]之间。
- 图像处理
在图像处理中,归一化函数常用于将图像的像素值缩放到[0,1]或者[-1,1]之间,以便进行更好的图像处理和分析。
- 数据可视化
在数据可视化中,归一化函数可以将不同属性或方向的数据映射到同一规模的区间内,从而使得不同数据之间的比较更加直观和准确。
- 数据挖掘
在数据挖掘中,常常需要对原始数据进行预处理,以便更好地进行模型训练和预测。归一化函数能够将数据缩放到同一区间内,避免不同的规模对模型造成干扰。
归一化函数是数据处理中的一种常用技术,能够使得数据更易于处理和分析,对于模型的训练和预测也有很大的作用。
3.案例
假设有一个数据集包含了一个人的年龄、性别、身高、体重四个特征。其中,年龄的范围为18到80,性别仅有男和女两个类别,身高的范围为150厘米到200厘米,体重的范围为50千克到200千克。
如果直接使用这些特征进行机器学习模型的训练,不同特征之间的范围和单位不同,可能会对模型的训练和预测结果造成一定的影响。因此,需要将这些特征进行归一化处理,使它们具有相同的范围和单位,并且避免极端值对模型的影响。
一种常用的归一化函数是Min-Max归一化函数。假设一个特征的取值范围为[a,b],则该特征的Min-Max归一化函数为:
x n o r m = x − a b − a x_{norm} = \frac{x - a}{b - a} xnorm=b−ax−a
其中,x为特征的原始取值, x n o r m x_{norm} xnorm为经过归一化后的取值。该函数将原始值映射到了[0,1]的范围之内。
在这个案例中,可以将年龄、身高和体重这三个特征使用Min-Max归一化函数进行归一化处理,代码如下:
import pandas as pd
data = pd.read_csv('data.csv') # 读取数据集
# 定义Min-Max归一化函数
def min_max_scaler(x, a, b):
return (x - a) / (b - a)
# 对年龄、身高和体重进行归一化处理
data['age_norm'] = data['age'].apply(min_max_scaler, args=(18, 80))
data['height_norm'] = data['height'].apply(min_max_scaler, args=(150, 200))
data['weight_norm'] = data['weight'].apply(min_max_scaler, args=(50, 200))
# 查看归一化后的数据集
print(data.head())
输出结果:
age gender height weight age_norm height_norm weight_norm
0 23 M 170 60 0.089552 0.375000 0.111111
1 28 F 165 65 0.149254 0.291667 0.177778
2 33 M 180 75 0.208955 0.541667 0.333333
3 45 F 155 40 0.462687 0.166667 0.000000
4 50 M 190 100 0.537313 0.708333 0.666667
可以看到,经过归一化处理后,年龄、身高和体重的取值范围都被映射到了[0,1]之内,使得这些特征可以同时用于机器学习模型的训练。
二、归一化函数封装
1.归一化方法
常见的归一化方法包括:
-
Min-Max归一化:将数据线性映射到[0,1]区间内,公式为: X n o r m = X − X m i n X m a x − X m i n X_{norm} = \frac{X-X_{min}}{X_{max}-X_{min}} Xnorm=Xmax−XminX−Xmin
-
Z-Score归一化:将数据映射到均值为0,标准差为1的正态分布中,公式为: X n o r m = X − μ σ X_{norm} = \frac{X-\mu}{\sigma} Xnorm=σX−μ
-
Decimal Scaling归一化:通过移动小数点的位置将数据线性映射到[-1,1]区间内,公式为: X n o r m = X 1 0 j X_{norm} = \frac{X}{10^j} Xnorm=10jX其中,j为使得所有数据的绝对值均小于1的位数。
-
Logarithmic归一化:将数据取对数,再进行归一化处理。
需要根据具体情况选择合适的归一化方法。例如,对于离散型数据,一般使用独热编码或二进制编码等方法。
2.Min-Max归一化
归一化(Normalization)是指将输入数据(也称为特征)缩放到相同的范围或比例,以便于机器学习算法更好地学习特征之间的关系。常见的归一化方法包括最小-最大归一化(Min-Max Normalization)和标准化(Standardization)。
下面是一个简单的Javascript函数,用于对数据进行最小-最大归一化处理:
function normalize(data) {
var min = Math.min(...data);
var max = Math.max(...data);
var result = data.map(function(x) {
return (x - min) / (max - min);
});
return result;
}
函数接受一个数组作为输入,返回一个经过最小-最大归一化处理后的数组。具体步骤如下:
- 使用
Math.min
和Math.max
方法计算输入数组的最小值和最大值。 - 使用
Array.prototype.map
方法将数组的每个元素映射到其归一化值。 - 计算公式为:归一化值 = (原始值 - 最小值) / (最大值 - 最小值)。
使用示例:
var data = [1, 2, 3, 4, 5];
var normalizedData = normalize(data);
console.log(normalizedData); // [0, 0.25, 0.5, 0.75, 1]
这个函数仅仅是一个最基本的实现,可以根据需要进行修改和扩展。例如,可以添加参数来控制归一化范围。
其他归一化函数如下:
// 归一化函数
function normalized(arr) {
let sum = 0;
for (let i = 0; i < arr.length; i++) {
sum += arr[i] * arr[i]
}
const middle = Math.sqrt(sum);
for (let i = 0; i < arr.length; i++) {
arr[i] = arr[i] / middle;
}
}