使用sklearn和一个大的相似性矩阵进行谱聚类

2024-05-14 13:02:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用scikit-learn提供的谱聚类方法来聚合我的数据集的行(只有只有16000)。 我的问题是在我预先计算了亲和力矩阵(1600x16000浮点矩阵)后产生的,它或多或少地分配了3g字节(我最多可以达到8gb),该方法通过argpack解算器调用该矩阵,需要更多的内存,而cpu在试图交换内存中的东西时会浪费太多时间,以致于计算速度减慢到死亡。 我也尝试在方法之前调用垃圾回收器,但没有成功:

import gc
gc.collect()

我怎样才能知道发生了什么事的确切计划? 这是已知问题吗?python中有没有其他方法可以现成地执行谱聚类?在

如果需要,我可以发布一个最小的工作示例。在

更新 关于lobbcg解算器,我错了,一开始它似乎占用了我所有的内存,但后来它稳定在5Gb左右,过程继续,但另一个问题出现了。 似乎计算会导致一些数值误差,最终会产生NaN或类似这样的误差(当亲和力矩阵稍有变化时,出现的误差会发生变化,见下文):

^{pr2}$

我的亲和力度量是一个高斯核exp(-((X_1 - x_2)^2/2*sigma^2)),当尝试不同的sigma值时,结果会有很大的变化。我可以理解,当一些条目接近于零时,可能会出现一些不准确的情况,但当我使用较大的sigma值(=5.0)时,情况就不一样了,取而代之的是,它们更接近于1.0。在

现在我假设我漏掉了一点,或者我在这个过程中做错了什么,所以我用一个新的目标来更新这个问题。在

作为参考,我是如何计算亲和矩阵的:

 pairwise_dists = \
      scipy.spatial.distance.squareform(
           scipy.spatial.distance.pdist(data_slice,'sqeuclidean'))
 similarity_matrix = scipy.exp(-pairwise_dists /(2 * self._sigma ** 2))

其中data_slice是一个numpy数组,它的行是我的实例,self._sigma存储高斯西格玛参数。在


Tags: 方法内存过程情况矩阵聚类scipysigma
1条回答
网友
1楼 · 发布于 2024-05-14 13:02:32

谱聚类计算不同矩阵的特征向量。在

这个矩阵的大小为O(n^2),因此几乎任何实现都需要O(n2)内存。在

16000x1600x4(假设使用浮动存储,无开销)约为1gb。它可能需要一个工作拷贝(比如scipy.exp这样的方法可能会产生一个矩阵的副本;并且可能会有两倍的精度),以及一些开销,这就是为什么您最终使用3GB。。。在

这种算法不适用于大数据,就像其他需要O(n^2)内存的算法一样。选择一种不同的算法;也许可以使用索引结构来加速。或者减小数据集的大小,例如通过采样。在

相关问题 更多 >

    热门问题