跳转到内容

R 中的数据挖掘算法/降维/主成分分析

来自维基教科书,开放的书籍,为开放的世界

本章介绍主成分分析(PCA)技术及其在 R 项目中的应用,用于统计计算。首先,我们将介绍该技术及其算法,然后我们将展示如何使用 R 语言实现 PCA 以及如何使用它。最后,我们将以数据挖掘场景为例展示该技术在数据挖掘中的应用。本章末尾将提供进一步的信息参考。

主成分分析

[编辑 | 编辑源代码]

PCA 是一种降维方法,其中对因素之间的协方差进行分析。原始数据将根据数据中的方差重新映射到新的坐标系中。PCA 应用一种数学方法,将许多(可能)相关的变量转换为数量较少的无关变量,称为主成分。第一个主成分解释了数据中尽可能多的可变性,每个后续成分解释了尽可能多的剩余可变性。

当数据包含大量变量时,PCA 很有用,而且(可能)这些变量之间存在一些冗余。在这种情况下,冗余意味着某些变量彼此相关。由于这种冗余,PCA 可用于将观察到的变量减少为更少数量的主成分,这些主成分将解释观察到的变量中大部分的方差。

PCA 被推荐作为一种探索性工具,用于发现数据中未知的趋势。该技术已在人脸识别和图像压缩等领域得到应用,并且是发现高维数据模式的常用技术。

PCA 算法包含 5 个主要步骤

  1. 减去平均值:从每个数据维减去平均值。减去的平均值是每个维的平均值。这将生成一个平均值为零的数据集。
  2. 计算协方差矩阵
    其中 是一个矩阵,每个条目都是计算两个独立维度之间的协方差的结果。
  3. 计算协方差矩阵的特征向量和特征值。
  4. 选择成分并形成特征向量:从协方差矩阵中找到特征向量后,下一步是按特征值对它们进行排序,从高到低。这样,成分将按重要性排序。您选择的特征向量数量将是新数据集的维度数量。此步骤的目标是构建特征向量(向量矩阵)。从特征向量列表中,选择您选择的特征向量,并使用它们形成一个列矩阵。
    FeatureVector = (eig_1, eig_2, ..., eig_n)
  5. 推导出新数据集。取 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.mvecov.mcd)返回的协方差列表。如果提供,将使用它而不是 x 的协方差矩阵。

- ...

传递给其他方法的参数,或从其他方法传递的参数。如果 x 是一个公式,则可以指定 corscores

- 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 个主成分,这些成分被用于在二维图表中绘制所有文档。

参考文献

[编辑 | 编辑源代码]
  1. ^ Mardia, K. V., J. T. Kent 和 J. M. Bibby (1979)。 “多元分析”,伦敦:学术出版社。
  2. ^ Venables, W. N. 和 B. D. Ripley (2002)。 “现代应用统计学与 S”,施普林格出版社。
  3. 主成分分析和冗余分析实验室,蒙大拿州立大学。 链接.
  4. 使用奇异值分解和自组织映射可视化和探索多元数据集,来自生物信息学禅宗。 链接.
华夏公益教科书