在大型数据集中查找相关性

Posted

技术标签:

【中文标题】在大型数据集中查找相关性【英文标题】:Find correlation in large dataset 【发布时间】:2013-04-17 01:20:10 【问题描述】:

我有一个庞大的数据集。我们谈论的是 100 个 121x145x121 单元格的 3D 矩阵。任何单元格的值都在 0 和 1 之间,我需要一种根据它们的相关性对这些单元格进行聚类的方法。问题是数据集对于我知道的任何算法来说都太大了;即使只使用其中的一半(任何矩阵都是大脑的 MRI 扫描),我们也有大约 4000 亿对。有什么想法吗?

【问题讨论】:

仅供参考,我正在使用 MATLAB 编程。 你在说什么相关性?你能定义数据上下文中的“相关性”是什么意思吗? 我不得不问:细胞如何“关联”?它只是一个匹配的数字还是更复杂的数字? 太糟糕了,您使用的是 MATLAB。我知道 MATLAB 专门研究矩阵数学,但您可能会从专门为您的问题量身定制的编译应用程序中获得更好的性能 @VivinPaliath 任何关联都可以;但是为了简单起见,我们可以假设线性相关。你可以这样思考这个问题:我有 100 个 3D 矩阵,所以任何单元格(例如,70-50-70)都可以被认为是一个值数组(100 个矩阵中具有该位置的所有单元格的值)。所以我需要一种计算所有这些“数组”之间相关性的方法,以便我知道单元格 60-70-60 与单元格 61-70-60 高度相关。这应该可以澄清我的问题(对于 Frecklefoot 也是如此)。 【参考方案1】:

作为第一步,我很想尝试K-means clustering。

这在 Matlab 统计工具箱中显示为函数 kmeans。

在此算法中,您最终只计算 K 个当前中心与数据之间的距离,因此对的数量比比较所有选择要少得多。

在 Matlab 中,我还发现运算速度很大程度上取决于矩阵的组织(由于内存缓存和优化问题)。我建议转换您的 3d 矩阵,以便列(在内存中一起保存)对应于特定单元格的 100 个值。

这可以通过permute function 来完成。

【讨论】:

原生 kmeans 函数不支持 3D 聚类,很遗憾。我可以“滚动”矩阵,但这又需要很长时间。我实际上并不是在寻找一种算法:如果我能找到任何启​​发式算法也可以完成这项工作。 您是否有足够的内存来使用 reshape 将其从多个 3d 矩阵转换为单个 2d 矩阵? (大小为 n*m,n=100 和 m=121x145x121) @PeterdeRivaz 我很确定我不是。我可以试一试,但我们仍在讨论可能需要几个月的操作(重新排列 2122945 个元素...!)。【参考方案2】:

尝试加权K-means++ 聚类算法。在每个点为所有 100 个输入矩阵创建一个值总和矩阵,以生成一个“灰度”矩阵,然后调整 K-means++ 算法以使用加权 (wt) 值。

在初始化阶段,随机选择一个新数据点作为新中心,使用加权概率分布,其中选择点 x 的概率与 D(X)^2 x wt^2 成正比。

assignment step 应该没问题,但是在更新步骤中计算质心时,请调整公式以考虑权重。 (或使用相同的公式,但每个点都使用 wt 次)。

您可能无法使用库函数来执行此操作,但您可以从减少 100 倍的点数和矩阵数开始使用。

【讨论】:

以上是关于在大型数据集中查找相关性的主要内容,如果未能解决你的问题,请参考以下文章

查找大型数据集中子字符串的所有匹配项的(行、列)位置

查找大型数据集中的两个日期之间是不是有假期?

关联规则挖掘算法的介绍

您可以将公式应用于数据透视表的计数过滤器吗?尝试在大型数据集中查找重复项

如何从 BigQuery 中存储的大型线串数据集中查找所有道路交叉口

查找两个大型数据集之间的最近坐标