R 中的数据挖掘算法/降维/主成分分析
本章介绍主成分分析(PCA)技术及其在 R 项目中的应用,用于统计计算。首先,我们将介绍该技术及其算法,然后我们将展示如何使用 R 语言实现 PCA 以及如何使用它。最后,我们将以数据挖掘场景为例展示该技术在数据挖掘中的应用。本章末尾将提供进一步的信息参考。
PCA 是一种降维方法,其中对因素之间的协方差进行分析。原始数据将根据数据中的方差重新映射到新的坐标系中。PCA 应用一种数学方法,将许多(可能)相关的变量转换为数量较少的无关变量,称为主成分。第一个主成分解释了数据中尽可能多的可变性,每个后续成分解释了尽可能多的剩余可变性。
当数据包含大量变量时,PCA 很有用,而且(可能)这些变量之间存在一些冗余。在这种情况下,冗余意味着某些变量彼此相关。由于这种冗余,PCA 可用于将观察到的变量减少为更少数量的主成分,这些主成分将解释观察到的变量中大部分的方差。
PCA 被推荐作为一种探索性工具,用于发现数据中未知的趋势。该技术已在人脸识别和图像压缩等领域得到应用,并且是发现高维数据模式的常用技术。
PCA 算法包含 5 个主要步骤
- 减去平均值:从每个数据维减去平均值。减去的平均值是每个维的平均值。这将生成一个平均值为零的数据集。
- 计算协方差矩阵
- 其中 是一个矩阵,每个条目都是计算两个独立维度之间的协方差的结果。
- 计算协方差矩阵的特征向量和特征值。
- 选择成分并形成特征向量:从协方差矩阵中找到特征向量后,下一步是按特征值对它们进行排序,从高到低。这样,成分将按重要性排序。您选择的特征向量数量将是新数据集的维度数量。此步骤的目标是构建特征向量(向量矩阵)。从特征向量列表中,选择您选择的特征向量,并使用它们形成一个列矩阵。
- FeatureVector = (eig_1, eig_2, ..., eig_n)
- 推导出新数据集。取 FeatureVector 的转置,并将其乘以原始数据集的左侧,转置
- FinalData = RowFeatureVector x RowDataAdjusted
- 其中 RowFeatureVector 是一个矩阵,其列是特征向量的转置(特征向量现在位于行中,最重要的特征向量位于顶部),而 RowDataAdjusted 是平均值调整后的数据转置(数据项位于每个列中,每行包含一个单独的维度)。
在本教程中,我们从 stats 包中选择了 princomp 方法。
- R 包:stats
- 方法:princomp
- 文档:princomp
princomp 是一种泛型方法,具有来自 stats 包的“formula”和“default”方法,它对给定的数值数据矩阵执行主成分分析,并将结果作为 princomp 类的对象返回。
用法
princomp(x, ...)
- 类“formula”的 S3 方法
princomp(formula, data = NULL, subset, na.action, ...)
- 默认 S3 方法
princomp(x, cor = FALSE, scores = TRUE, covmat = NULL, subset = rep(TRUE, nrow(as.matrix(x))), ...)
- 类“princomp”的 S3 方法
predict(object, newdata, ...)
参数
- formula
- 一个没有响应变量的公式,仅引用数值变量。
- data
- 一个可选数据框,包含公式 formula 中的变量。默认情况下,变量取自 environment(formula)
- subset
- 一个可选向量,用于选择数据矩阵 x 的行(观测值)。
- na.action
- 一个函数,指示数据包含 NA 时应该发生什么。默认值由 options 的 na.action 设置确定,如果未设置,则为 na.fail。'factory-fresh' 默认值为 na.omit。
- x
- 一个数值矩阵或数据框,提供用于主成分分析的数据。
- cor
- 一个逻辑值,指示计算应该使用相关矩阵还是协方差矩阵。(如果不存在常数变量,则只能使用相关矩阵。)
- scores
- 一个逻辑值,指示是否应计算每个主成分的分数。
- covmat
- 一个协方差矩阵,或一个由 cov.wt(以及来自 MASS 包的 cov.mve 或 cov.mcd)返回的协方差列表。如果提供,将使用它而不是 x 的协方差矩阵。
- ...
- 传递给其他方法的参数,或从其他方法传递的参数。如果 x 是一个公式,则可以指定 cor 或 scores。
- object
- 继承自“princomp”的类的对象
- newdata
- 一个可选数据框或矩阵,用于查找用于预测的变量。如果省略,将使用得分。如果原始拟合使用了一个公式或一个数据框或一个具有列名的矩阵,那么 newdata 必须包含具有相同名称的列。否则,它必须包含相同数量的列,以便按相同的顺序使用。
价值
princomp 方法返回一个包含以下组件的“princomp”类列表
- sdev
- 一个没有响应变量的公式,仅引用数值变量。
- loadings
- 变量载荷矩阵(即,一个矩阵,其列包含特征向量)。
- center
- 减去的均值。
- scale
- 应用于每个变量的缩放比例。
- n.obs
- 观察的数量。
- scores
- 如果 scores = TRUE,则提供的数据在主成分上的得分。这些值仅在提供 x 时才非空,并且如果也提供了 covmat,则它是一个协方差列表。对于公式方法,napredict() 被应用于处理由 na.action 省略的值。
- call
- 匹配的调用。
- na.action
- 如果相关。
这些对象的 print 方法以良好的格式打印结果,而 plot 方法则生成屏幕图。 还有一个 biplot 方法。
例子
require(graphics)
summary(pc.cr <- princomp(USArrests, cor = TRUE))
loadings(pc.cr)
plot(pc.cr)
biplot(pc.cr)
为了说明 PCA 降维技术,将展示一个简单的案例研究。
在信息检索 (IR) 领域,查询和文档可以在向量空间中表示。 一般来说,使用多个特征来描述查询检索到的文档,例如 TF-IDF 和 PageRank 措施。
偶尔,可能需要将文档可视化到二维空间中。 为此,可以使用 PCA。
最近,微软发布了 LETOR 基准数据集,用于研究 LEarning TO Rank,其中包含标准特征、相关性判断、数据分区、评估工具和多个基线。 LETOR 包含多个数据集,用于从两个查询集和 Gov2 网页集合派生的排序设置。 采用 5 折交叉验证策略,并将 5 折分区包含在包中。 在每一折中,有三个用于学习的子集:训练集、验证集和测试集。 可以从 LETOR 网站 下载数据集。
LETOR 数据集中典型的文档如下描述
0 qid:1 1:1.000000 2:1.000000 3:0.833333 4:0.871264 5:0 6:0 7:0 8:0.941842 9:1.000000 10:1.000000 11:1.000000 12:1.000000 13:1.000000 14:1.000000 15:1.000000 16:1.000000 17:1.000000 18:0.719697 19:0.729351 20:0 21:0 22:0 23:0.811565 24:1.000000 25:0.972730 26:1.000000 27:1.000000 28:0.922374 29:0.946654 30:0.938888 31:1.000000 32:1.000000 33:0.711276 34:0.722202 35:0 36:0 37:0 38:0.798002 39:1.000000 40:1.000000 41:1.000000 42:1.000000 43:0.959134 44:0.963919 45:0.971425 #docid = 244338
LETOR 文件无法“按原样”导入,但使用以下脚本,可以将 LETOR 格式转换为 R 接受的其他格式,如下所示
cat train.txt | grep "qid:1 " | gawk '{ printf("doc_"$50); for (i=3;i<=47;i++) { split($i,a,":"); printf(", "a[2]); } printf("\n"); }' > letor.data
之后,将看到 'letor.data' 如下
doc_244338, 1.000000, 1.000000, 0.833333, 0.871264, 0, 0, 0, 0.941842, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 0.719697, 0.729351, 0, 0, 0, 0.811565, 1.000000, 0.972730, 1.000000, 1.000000, 0.922374, 0.946654, 0.938888, 1.000000, 1.000000, 0.711276, 0.722202, 0, 0, 0, 0.798002, 1.000000, 1.000000, 1.000000, 1.000000, 0.959134, 0.963919, 0.971425
现在,可以将 'letor.data' 文件加载到 R 中,并运行 PCA 将文档绘制在二维空间中,如下所示
data=read.table("letor.data",sep=",") summary(pc.cr <- princomp(data[,2:46])) loadings(pc.cr) library(lattice) pc.cr$scores pca.plot <- xyplot(pc.cr$scores[,2] ~ pc.cr$scores[,1]) pca.plot$xlab <- "First Component" pca.plot$ylab <- "Second Component" pca.plot
上面的脚本生成以下图表
正如我们所见,尽管文档由多个特征(>45)表示,但 PCA 能够找到 2 个主成分,这些成分被用于在二维图表中绘制所有文档。