在数据分析和机器学习领域,数据预处理是一个至关重要的步骤。原始数据往往存在各种问题,例如不同特征的尺度差异较大。这种尺度差异可能会影响到某些机器学习算法的性能,比如基于距离度量的算法(如 K - 近邻算法、支持向量机等)。为了解决这个问题,特征缩放技术应运而生,其中标准化和归一化是两种常用的特征缩放方法。本文将详细介绍这两种方法,并通过 R 语言代码进行演示。
标准化,也称为 Z - 分数标准化,是将特征值转换为均值为 0,标准差为 1 的标准正态分布。其计算公式如下:
[ z = \frac{x - \mu}{\sigma} ]
其中,(x) 是原始特征值,(\mu) 是特征的均值,(\sigma) 是特征的标准差。
# 生成示例数据
set.seed(123)
data <- data.frame(
feature1 = rnorm(100, mean = 10, sd = 2),
feature2 = rnorm(100, mean = 100, sd = 10)
)
# 查看原始数据的均值和标准差
original_means <- sapply(data, mean)
original_sds <- sapply(data, sd)
cat("原始数据的均值:", original_means, "\n")
cat("原始数据的标准差:", original_sds, "\n")
# 进行标准化
standardized_data <- scale(data)
# 查看标准化后数据的均值和标准差
standardized_means <- apply(standardized_data, 2, mean)
standardized_sds <- apply(standardized_data, 2, sd)
cat("标准化后数据的均值:", standardized_means, "\n")
cat("标准化后数据的标准差:", standardized_sds, "\n")
归一化,通常指的是最小 - 最大归一化,它将特征值缩放到 [0, 1] 的区间内。其计算公式如下:
[ x{norm} = \frac{x - x{min}}{x{max} - x{min}} ]
其中,(x) 是原始特征值,(x{min}) 是特征的最小值,(x{max}) 是特征的最大值。
# 定义归一化函数
normalize <- function(x) {
return ((x - min(x)) / (max(x) - min(x)))
}
# 对示例数据进行归一化
normalized_data <- as.data.frame(lapply(data, normalize))
# 查看归一化后数据的最小值和最大值
normalized_mins <- sapply(normalized_data, min)
normalized_maxs <- sapply(normalized_data, max)
cat("归一化后数据的最小值:", normalized_mins, "\n")
cat("归一化后数据的最大值:", normalized_maxs, "\n")
方法 | 适用场景 | 缺点 |
---|---|---|
标准化 | 数据存在异常值,算法对数据的分布有要求(如线性回归、逻辑回归等),基于距离度量的算法 | 不能保证数据在特定区间内 |
归一化 | 数据不存在异常值,算法对数据范围有要求(如神经网络) | 对异常值敏感,可能会压缩正常数据的范围 |
标准化和归一化是两种重要的特征缩放方法,它们在不同的场景下有各自的优势。在实际应用中,我们需要根据数据的特点和算法的要求来选择合适的特征缩放方法。通过本文的介绍和 R 语言代码演示,相信读者对这两种方法有了更深入的理解,可以在实际项目中灵活运用。