如何在R中进行降维

机器算法验证 r 聚类 降维
2022-01-20 06:09:24

我有一个矩阵,其中 a(i,j) 告诉我个人查看页面 j 的次数。有 27K 个人和 95K 页。我想在页面空间中有一些“维度”或“方面”,它们对应于经常一起查看的页面集。我的最终目标是能够计算出我查看维度 1、维度 2 等页面的频率。

我已阅读有关主成分分析单值分解的 R 文档并已执行这些命令,但我不确定如何继续。

我如何使用降维来做到这一点?或者这真的是一个聚类问题,我应该研究聚类算法吗?

非常感谢您的任何见解〜l

4个回答

让我们假设 mat_pages[] 包含列中的页面(您想要集群)和行中的个人。您可以使用以下命令根据 Rby 中的单个数据对页面进行聚类:

  pc <- prcomp(x=mat_pages,center=TRUE,scale=TRUE)

载荷矩阵是数据的 SVD 分解的特征向量矩阵。它们在分数计算中给出了每个 PAGE 的相对权重。绝对值越大的载荷对确定相应主成分的得分影响越大。

但是,我还应该指出使用 PCA 来集群页面的缺点。这样做的原因是负载赋予具有更高变异性的 PAGES 更大的权重,无论这种变异实际上是由于 PAGE 内容还是其他原因(可能是技术或个人变异)。负载不一定反映组之间的真正差异,这(也许)是您的主要兴趣。但是,在所有页面具有相同方差的假设下,这种聚类确实反映了组中的差异(我不知道这是否是一个有效的假设)。

如果您拥有强大的计算设施(考虑到您的数据大小,这可能是可能的) - 使用分层模型可能是一个好主意。在 R 中,可以使用 lme4 包来完成。


拿到成绩后怎么办?

这是一个粗略的建议,分析很大程度上取决于数据的样子。另外,我猜想这个过程对你拥有的大量数据进行分组是非常不可行的。

pc.col <- paste("page", 1:27000, sep=".")

pdf("principle-components.pdf")
plot(pc$x[,1:2]) ## Just look at the 1st two loadings (as you can see the groupings in a plane)
dev.off()

希望这可以让您了解数据是如何分组的。

警告:这不是我推荐的。


我的建议:

此类问题在基因组学中经常出现。在您的案例中,页面对应于基因,个体对应于患者(基本上个体与基因组学中的含义相同)

您希望根据数据对页面进行聚类。

您可以在 R 中使用很多集群包,并在其他答案中指出。包的一个基本问题就像 hclust 是如何确定集群的数量。我最喜欢的几个是:

  • pvclust(为您提供集群并为每个集群提供一个 p 值。使用 p 值您可以确定具有统计意义的集群。问题:需要大量计算能力,我不确定它是否适用于您的数据尺寸)
  • hopach(为您提供估计的集群数量和集群)
  • Bioconductor 中还有其他可用的软件包,请在任务视图中查看它们。

您还可以使用 k-means 等聚类算法。我相信我在这个论坛上看到了一个关于聚类的帖子。答案非常详细。Tal Galili 问我是否记错了。

这当然是一个聚类问题。查看 Rscluster包以了解算法选项的概述(pam并且agnes是开始的最佳选项;它们代表聚类中的两个主要流——质心分层)。
对数据使用聚类的主要问题是定义页面之间的良好相似性度量;简单的一种是使用曼哈顿距离;计算普通观众的数量并用第一页和第二页的观众人数的平均值对其进行标准化有点复杂——这应该可以消除流行度的影响。

编辑:好的,现在我已经看到了数据大小......它可能会让 R 爆炸,因为它需要一个三角形(number of pages)×(number of pages)矩阵来存储距离。查看此报告以获取可能的解决方案。

降维基本上是将聚类算法应用于属性(列)。由于数据集的维度相当大,您可能会尝试使用 SOM(自组织地图/Kohonen 网络)为个人或页面创建地图。然后,您可以查看这些模式是否有意义(可解释)。

如果您进行 PCA,我的建议是简要筛选除前两个之外的其他组件。获得prcomp对象pc后(请参阅 suncoolsu 的帖子),您可以plot(pc)查看归因于不同主成分的方差量。您还可以使用pairs(pc$x[,1:3])或 、lattice轻松地可视化其中的几个(通常是三个或四个) splom(pc$x[,1:3])