我正在尝试使用scikit-learn提供的谱聚类方法来聚合我的数据集的行(只有16000 行)。在我预先计算了或多或少分配 3 GB(我最多可以达到 8 GB)的亲和矩阵(16000x16000 浮点矩阵)之后出现了我的问题,使用 argpack 求解器调用该矩阵的方法需要更多内存并且cpu在尝试将事物进出内存时浪费了很多时间,以至于计算速度减慢至死。我也尝试在该方法之前调用垃圾收集器,但没有成功:
import gc
gc.collect()
我怎样才能得到正在发生的事情的精确方案?这是一个已知的问题?python中是否有任何替代方法可以开箱即用地执行光谱聚类?
如果需要,我可以发布一个最小的工作示例。
更新 关于 lobpcg 求解器我错了,起初它似乎使用了我所有的内存,但后来稳定在 5Gb 左右,这个过程继续,但另一个问题出现了。似乎计算会导致一些数值不准确,最终会产生 Nans 或类似这样的错误(出现的错误会发生变化,而亲和力矩阵会发生一些变化,见下文):
File "/usr/local/lib/python3.4/dist-packages/sklearn/cluster/spectral.py", line 255, in spectral_clustering
eigen_tol=eigen_tol, drop_first=False)
File "/usr/local/lib/python3.4/dist-packages/sklearn/manifold/spectral_embedding_.py", line 303, in spectral_embedding
largest=False, maxiter=2000)
File "/usr/local/lib/python3.4/dist-packages/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py", line 449, in lobpcg
assert np.allclose(gramA.T, gramA)
AssertionError
我的亲和力度量是一个高斯核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))
wheredata_slice
是一个 numpy 数组,它的行是我的实例并self._sigma
存储高斯 sigma 参数。