本文目录导读:

- Min-Max 归一化(最值归一化)
- Z-Score 归一化(标准化)
- 最大绝对值归一化
- 单位向量归一化(L2归一化)
- 稳健归一化(Robust Scaler)
- Decimal Scaling 归一化
- 选择建议
- 完整示例
在Python中,数据归一化(Normalization)主要有以下几种常用方法,每种方法适用于不同的场景:
Min-Max 归一化(最值归一化)
将数据缩放到 [0, 1] 区间(或指定区间)。
import numpy as np
from sklearn.preprocessing import MinMaxScaler
# 原始数据
data = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
# 方法1:使用 scikit-learn
scaler = MinMaxScaler(feature_range=(0, 1)) # 可指定区间
normalized_data = scaler.fit_transform(data)
# 方法2:手动实现
def min_max_normalize(x):
return (x - np.min(x)) / (np.max(x) - np.min(x))
公式: ( X{norm} = \frac{X - X{min}}{X{max} - X{min}} )
Z-Score 归一化(标准化)
将数据转换为均值为0,标准差为1的分布。
from sklearn.preprocessing import StandardScaler
# 使用 scikit-learn
scaler = StandardScaler()
standardized_data = scaler.fit_transform(data)
# 手动实现
def z_score_normalize(x):
return (x - np.mean(x)) / np.std(x)
公式: ( X_{norm} = \frac{X - \mu}{\sigma} )
最大绝对值归一化
将数据缩放到 [-1, 1] 区间,保留数据的稀疏性。
from sklearn.preprocessing import MaxAbsScaler scaler = MaxAbsScaler() normalized_data = scaler.fit_transform(data)
公式: ( X_{norm} = \frac{X}{max(|X|)} )
单位向量归一化(L2归一化)
将每个样本转换为单位向量(长度为1)。
from sklearn.preprocessing import Normalizer # L2归一化(默认) scaler = Normalizer(norm='l2') normalized_data = scaler.fit_transform(data) # L1归一化 scaler_l1 = Normalizer(norm='l1')
公式: ( X_{norm} = \frac{X}{||X||} )
稳健归一化(Robust Scaler)
使用中位数和四分位数范围,对异常值更稳健。
from sklearn.preprocessing import RobustScaler scaler = RobustScaler() robust_data = scaler.fit_transform(data)
公式: ( X_{norm} = \frac{X - median}{IQR} )
Decimal Scaling 归一化
通过移动小数点位置进行归一化。
def decimal_scaling(x):
max_val = np.max(np.abs(x))
j = np.ceil(np.log10(max_val))
return x / (10 ** j)
选择建议
| 方法 | 适用场景 | 注意事项 |
|---|---|---|
| Min-Max | 需要固定范围,数据分布已知 | 对异常值敏感 |
| Z-Score | 数据近似正态分布 | 不保证特定范围 |
| MaxAbs | 稀疏数据 | 保留零值 |
| 单位向量 | 需要特征方向而非大小 | 改变数据分布 |
| Robust | 数据含有异常值 | 计算成本较高 |
完整示例
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler
# 生成示例数据
np.random.seed(42)
data = pd.DataFrame({
'feature1': np.random.randn(100),
'feature2': np.random.randn(100) * 10,
'feature3': np.random.randn(100) * 100
})
# 多种归一化方法对比
scalers = {
'Min-Max': MinMaxScaler(),
'Z-Score': StandardScaler(),
'Robust': RobustScaler()
}
normalized_data = {}
for name, scaler in scalers.items():
normalized_data[name] = pd.DataFrame(
scaler.fit_transform(data),
columns=data.columns
)
在实际应用中,需要根据数据的特性和后续模型的要求选择合适的归一化方法。