一、前言
大家在学习人工智能模型的时候有木有想过这样一个问题,都知道我们送入算法模型进行训练的数据量非常大,那么这么多这么大的数据,必然会导致算法模型的计算速度和计算效率越来越慢,越来越低,那么有没有一种方法,能够灵活地控制我们输入训练的数据样本的大小呢 ? 哎,归一化,这不就来了嘛
二、定义与介绍
在人工智能(AI)和机器学习(ML)算法中,数据归一化是一个重要的预处理步骤。目的是将数据的数值范围调整到一个特定的区间,以便于不同特征之间的比较和计算。它有助于确保不同特征在模型训练过程中具有相同的重要性,并且可以提高算法的收敛速度和性能。
为什么需要数据归一化?
-
特征尺度差异:在现实世界的数据集中,不同的特征可能具有不同的量纲和尺度。例如,一个人的身高可能以厘米为单位,而体重可能以千克为单位。如果这些特征直接用于训练模型,那么尺度较大的特征可能会对模型的结果产生不成比例的影响。
-
算法性能:某些机器学习算法(如梯度下降)对特征的尺度非常敏感。如果特征没有被归一化,算法可能需要更多的迭代次数来收敛,或者可能无法收敛到合适的解。
-
数值稳定性:在计算过程中,如果数据的数值范围很大,可能会导致数值稳定性问题,例如在浮点数运算中的溢出或下溢。
数据归一化的方法:
-
最小-最大归一化(Min-Max Scaling):
- 这种方法将特征的值缩放到给定的最小值和最大值之间,通常是0和1。
- 公式:
- 优点:保留数据的原始分布。
- 缺点:对异常值敏感。
-
Z得分归一化(Z-Score Normalization):
- 这种方法将数据转换为具有均值为0和标准差为1的标准正态分布。
- 公式:
- 优点:对异常值不敏感,转换后的数据具有统一的标准差。
- 缺点:改变了数据的原始分布。
-
小数定标归一化(Decimal Scaling):
- 将数据除以一个特定的数(通常是最大绝对值),然后移动小数点的位置。具体移动多少位取决于数据的最大绝对值。
- 公式:
- 优点:简单易行。
- 缺点:需要选择合适的小数点移动位数。
-
最大值归一化(Max-Value Normalization):
- 这种方法将所有数据缩放到-1和1之间,通过除以数据集中的最大绝对值来实现。
- 公式:
- 优点:简单,对异常值不敏感。
- 缺点:如果数据集中的最大值变化很大,可能会导致数值不稳定。
-
L1/L2范数归一化:
- 将数据向量的长度缩放到1。这种方法通过乘以对数函数来减少数据的偏斜。这在处理具有幂律分布的数据时特别有用。
- L1范数:
- L2范数(欧几里得范数):
- 优点:使数据向量具有统一的长度。
- 缺点:对特征的尺度敏感。
-
归一化到特定区间:
- 将数据缩放到任意指定的区间,如。
- 公式:
应用场景
- 机器学习:在训练模型之前对特征进行归一化,以提高模型的性能和稳定性。
- 深度学习:在使用神经网络时,归一化可以加速权重的收敛。
- 数据可视化:在绘制图表时,归一化可以使得不同特征的尺度一致。
注意事项
- 在归一化之前,应该先对数据进行探索性分析,了解数据的分布和特点。
- 在归一化后,需要保留归一化参数(如最小值、最大值、均值、标准差等),以便在模型训练完成后对新数据进行相同的归一化处理。
- 归一化方法的选择应该根据数据的特点和算法的需求来决定。
数据归一化是数据预处理的重要步骤,正确地归一化数据可以显著提高机器学习模型的性能和鲁棒性。
三、归一化步骤
-
选择归一化方法:根据数据的特性和所使用的算法,选择最合适的归一化方法。
-
计算归一化参数:根据所选方法,计算所需的参数,如最小值、最大值、均值和标准差。
-
应用归一化:将归一化公式应用于数据集中的每个特征。
-
反向归一化:在某些情况下,如在模型预测后需要将结果转换回原始尺度,可能需要进行反向归一化。
-
验证:在归一化后,检查数据的分布和尺度,确保归一化过程没有引入新的问题。
数据归一化是机器学习工作流程中的一个关键步骤,正确地执行这一步骤可以显著提高模型的性能和泛化能力。
OK , 老粉都知道,笔者姜某总是会在大概念的提出后来举一些通俗易懂又有趣的例子来帮助一些仍旧不太理解的同学加深理解,理清概念和前后逻辑,那么就废话少说,我们直接上具体的例子!!!
四、具体数据案例演示各归一化方法
假设我们有一个简单的数据集,包含三个特征和它们对应的四个数据点。原始数据如下:
| 数据点 | |||
|---|---|---|---|
| 1 | 100 | 200 | 300 |
| 2 | 150 | 250 | 350 |
| 3 | 200 | 300 | 400 |
| 4 | 250 | 350 | 450 |
1. 最小-最大归一化
首先,我们需要找出每个特征的最小值和最大值:
- : 最小值 = 100, 最大值 = 250
- : 最小值 = 200, 最大值 = 350
- : 最小值 = 300, 最大值 = 450
然后,应用最小-最大归一化公式:
归一化后的数据集如下:
| 数据点 | (归一化) | (归一化) | (归一化) |
|---|---|---|---|
| 1 | 0 | 0 | 0 |
| 2 | 0.25 | 0.25 | 0.25 |
| 3 | 0.5 | 0.5 | 0.5 |
| 4 | 1 | 1 | 1 |
2. Z 得分归一化(Z-score Normalization)
首先,计算每个特征的均值()和标准差():
- Feature A: ,
- Feature B: ,
- Feature C: ,
然后,应用Z得分归一化公式:
归一化后的数据集如下:
| 数据点 | |||
|---|---|---|---|
| 1 | -1.47 | -1.47 | -1.47 |
| 2 | -0.74 | -0.74 | -0.74 |
| 3 | 0 | 0 | 0 |
| 4 | 1.47 | 1.47 | 1.47 |
好的,让我们继续完成剩下的几种数据归一化方法的示例。
3. 小数定标归一化(Decimal Scaling)
小数定标归一化是通过移动小数点的位置来实现的。
首先,我们需要确定每个特征的最大绝对值:
- : 最大绝对值 =
- : 最大绝对值 =
- : 最大绝对值 =
然后,选择一个合适的小数点移动位数,使得归一化后的数据在-1到1之间。这里我们选择移动两位小数点:
| 数据点 | (归一化) | (归一化) | (归一化) |
|---|---|---|---|
| 1 | 1.00 | 0.57 | 0.67 |
| 2 | 1.50 | 0.71 | 0.77 |
| 3 | 2.00 | 0.85 | 0.89 |
| 4 | 2.50 | 1.00 | 1.00 |
4. 最大值归一化(Max-Value Normalization)
最大值归一化是将每个特征的值除以该特征的最大值:
| 数据点 | (归一化) | (归一化) | (归一化) |
|---|---|---|---|
| 1 | 0.40 | 0.57 | 0.67 |
| 2 | 0.60 | 0.71 | 0.77 |
| 3 | 0.80 | 0.85 | 0.89 |
| 4 | 1.00 | 1.00 | 1.00 |
5. L1 / L2范数归一化
L1范数归一化是将向量的绝对值之和归一化为1:
- : 总和 =
- : 总和 =
- : 总和 =
L1范数归一化后的数据集:
| 数据点 | (L1范数) | (L1范数) | (L1范数) |
|---|---|---|---|
| 1 | 0.14 | 0.18 | 0.20 |
| 2 | 0.21 | 0.23 | 0.23 |
| 3 | 0.29 | 0.27 | 0.27 |
| 4 | 0.36 | 0.35 | 0.30 |
L2范数归一化是将向量的欧几里得长度归一化为1:
- : 欧几里得长度 =
- : 欧几里得长度 =
- : 欧几里得长度 =
L2范数归一化后的数据集:
| 数据点 | (L2范数) | (L2范数) | (L2范数) |
|---|---|---|---|
| 1 | 0.28 | 0.33 | 0.37 |
| 2 | 0.42 | 0.47 | 0.51 |
| 3 | 0.56 | 0.61 | 0.65 |
| 4 | 0.70 | 0.76 | 0.79 |
请注意,L1和L2范数归一化的具体数值需要通过计算每个特征的总和或欧几里得长度来确定,然后应用相应的归一化公式。上述数值仅为示例,实际数值需要根据具体的计算结果来确定。
总之请注意,这些值是近似值,因为实际计算时会得到具体的数值。通过归一化,我们可以看到数据被转换到了不同的尺度上,这有助于在机器学习算法中公平地对待每个特征。
五、代码示例
这里我将提供一个使用原生Python和Numpy库实现数据归一化的例子。我们将使用最小-最大归一化方法,并且会用一个简单的数据列表来演示这个过程。
(1)首先,确保你已经安装了Numpy库。如果还没有安装,可以通过以下命令安装:
pip install numpy
(2)使用Python和Numpy进行数据归一化:
import numpy as np
# 假设我们有以下特征数据
feature_data = np.array([100, 150, 200, 250])
# 计算最大值和最小值
feature_max = np.max(feature_data)
feature_min = np.min(feature_data)
# 应用最小-最大归一化
normalized_data = (feature_data - feature_min) / (feature_max - feature_min)
print("原始数据:", feature_data)
print("归一化后的数据:", normalized_data)
这段代码首先导入了Numpy库,并创建了一个包含原始数据的Numpy数组。然后,它计算了这些数据的最大值和最小值,并将它们用于最小-最大归一化的公式中。最后,打印出原始数据和归一化后的数据。
如果大家想要处理多维数据,比如一个包含多个特征的数据集,你可以对每个特征分别进行归一化。以下是一个处理多特征数据集的例子:
import numpy as np
# 创建一个包含多个特征的数据集
data = np.array([
[100, 200, 300],
[150, 250, 350],
[200, 300, 400],
[250, 350, 450]
])
# 计算每个特征的最大值和最小值
feature_max = np.max(data, axis=0)
feature_min = np.min(data, axis=0)
# 应用最小-最大归一化
normalized_data = (data - feature_min) / (feature_max - feature_min)
print("原始数据集:")
print(data)
print("\n归一化后的数据集:")
print(normalized_data)
在这个例子中,np.max和np.min函数使用axis=0参数来分别计算每一列(即每个特征)的最大值和最小值。然后,使用这些值对整个数据集进行归一化。这样,每个特征都被独立地归一化到了0和1之间。
同样的,如果大家想要用其他的方法,只要在输入的具体数据中取得你想要的相关信息和数据,然后进行进一步的运算使最后的数据达到归一化效果就行。
以上就是笔者关于数据归一化的讲解和理解,欢迎大家点赞,收藏,交流和关注!!O(∩_∩)O谢谢!