我正在使用matlab,我有一个名为MeansOfK的非常大的.mat文件,其中包含近5,000,000 x N.我的测试数据包括Car和Non-car。我的问题是,当我尝试使用k-means到MeansofK时。它总是耗尽内存。
[idx, ctr] = kmeans(MeansOfK , k, 'Distance', 'sqEuclidean');
我的选项是
1.i使用分而治之的技术,其中我将汽车和非汽车划分为较小的分区并将其置于k-means中。
2.我将汽车和非汽车类分开,并尝试对两个班级使用k-means。
最终输出将是汽车或非汽车的组合类别。来自k-means过程。
所以我的问题是?
我将做什么可行? 如果我对文件进行分区而不是作为一个整体进行分区,它是否会影响我的k-means的输出?
建议和答案总是赞赏:) 感谢
答案 0 :(得分: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');
基本上,您可以将idx
和ctr
结果用于原始数据集,这将为您提供(1 + epsilon)近似值。此外,您可以根据Dan Feldman的工作获得更好的结果,这基本上表示您可以对数据进行计算和SVD并投影k / epsilon引擎值以计算kmeans值并得到(1 + epsilon)近似值。 / p>
<小时/> 的更新强>
基于评论,我想建议利用核心集方法,同样基于Dan Feldman在el,Turning Big Data Into Tiny Data的论文。这些技术提供了将大量数据减少到更小的能力,同时可以保证为最佳kmeans解决方案提供(1 + epsilon)近似。此外,您可以继续使用流式核心集构造,这样您可以在流式传输数据时保持O(logn * epsilon)
近似值(第10节,图3),例如在你的情况下分区成较小的块。最终,您可以在生成的coreset上运行kmeans计算。
另外,您可能会考虑查看我最近的publication以获取有关如何处理案例的更多详细信息。如果您想使用它,我也可以在github account找到参考资料。
答案 1 :(得分:0)
我想说,如果无法增加内存,你唯一真正的选择就是将数据划分为更小的集合。当我使用协同过滤算法运行大数据项目时,我们曾经处理过多达7亿的集合,每当我们最大化内存时,我们就需要将数据划分为更小的集合并分别运行算法。