【问题标题】:K-Means Clustering ParitioningK-Means 聚类分区
【发布时间】:2018-02-27 05:41:30
【问题描述】:

我正在使用 matlab,我有一个非常非常大的名为 MeansOfK 的 .mat 文件,其中包含近 5,000,000 x N。我的测试数据由 Car 和 Non-car 组成。我的问题是,当我尝试对 MeansofK 使用 k-means 时。它总是耗尽内存。

[idx, ctr] = kmeans(MeansOfK , k, 'Distance', 'sqEuclidean');

我的选择是

1.我使用分而治之的技术,其中我将汽车和非汽车划分为更小的分区并将其放入 k-means。

2.我将汽车类和非汽车类分开,并尝试对这两个类使用 k-means。

最终输出将是汽车或非汽车的组合类别。来自 k-means 过程。

所以我的问题是?

我将做的事情可行吗? 如果我对文件进行分区而不是将其作为一个整体进行,它会影响我的 k-means 的输出吗?

我们总是感谢您的建议和回答 :) 谢谢

【问题讨论】:

  • 您是否尝试过分配运行算法时使用的内存量?
  • 是的,我已将我的 ram 内存分配给 matlab 的 max。在我的电脑上关闭了我的页面。但它仍然内存不足。购买仍然不是我的选择,因为我现在没钱了。

标签: algorithm matlab image-processing k-means


【解决方案1】:

您可以做什么,您可以利用Johnson-Lindenstrauss lemma 的结果,将您的数据集嵌入到较低维度的空间中,以及在较小的数据集上进行 kmeans 计算。例如,如果您的数据矩阵是 A,您可以这样做:

% N is the number of data points and s is the reduced dimension
S  =  randn (N, s)/s q r t (s) ;
C  =  A ∗ S ;

% now you can do you kmeans computation on C
[idx, ctr] = kmeans(MeansOfK , k, 'Distance', 'sqEuclidean');

基本上,您可以将 idxctr 结果用于原始数据集,这将为您提供 (1+epsilon) 近似值。此外,您还可以根据 Dan Feldman 的工作获得更好的结果,这基本上表示您可以对数据进行计算和 SVD,并根据 k/epsilon 引擎值进行投影,以计算 kmeans 值并获得 (1+epsilon) 近似值。


更新

基于评论,我想建议利用 coresets 方法,同样基于 Dan Feldman 在 el,Turning Big Data Into Tiny Data 的论文。该技术提供了将大量数据减少到更小的能力,并提供可证明的保证,以提供最佳 kmeans 解决方案的 (1+epsilon) 近似值。此外,您可以继续进行流式核心集构造,这将允许您在流式传输数据时保持O(logn * epsilon) 近似值(第 10 节,图 3),例如在你的情况下划分成更小的块。最终,您可以在生成的核心集上运行 kmeans 计算。

另外,您可能会考虑查看我最近的publication,以获取有关如何处理您的案件的更多详细信息。如果您想使用它,您还可以在我的github account 中找到参考。

【讨论】:

  • 嗨!对不起,我没有在我的问题中说 5000000 x N 已经减少了。我们使用 PCA 作为它的降幅。
  • 缩减后的维度为 5000000?我不敢问最初的维度是什么?
  • @ArtemBarger,我正在尝试从论文中实现基本的核心集计算,比如说 13k 行和 5 维数据,但是即使在查看了你的 github 上的实现之后,我也很难理解它。你能像上面对约翰逊-林登斯特劳斯引理那样用公式解释更多吗?
【解决方案2】:

如果无法增加内存,我会说你唯一真正的选择是将数据划分为更小的集合。当我使用协同过滤算法运行一个大数据项目时,我们过去常常处理多达 7 亿个以上的数据集,每当我们用尽内存时,这意味着我们需要将数据划分为更小的数据集并分别在它们上运行算法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-11
    • 2011-08-13
    • 2013-08-08
    • 2013-02-14
    • 2018-01-14
    • 2014-04-13
    • 2011-04-11
    • 2016-12-16
    相关资源
    最近更新 更多