内存错误 Numpy/Python 欧氏距离

Memory Error Numpy/Python Euclidean Distance

我正在尝试 运行 使用 numpy 和 python 的 K 均值聚类算法,但如果我使用较大的 K (任何大于 10 的值似乎都会导致错误)。我有两个大小为 [42000,784](数据集)和 [K,784](质心)的 numpy 数组。计算每个质心和每个数据点之间的欧式距离时会出现内存错误。这是我一直在使用的功能:

def dist(a,b):
    a = a[np.newaxis,:,:]
    b = b[:,np.newaxis,:]
    dist = np.linalg.norm((a-b), axis=2) 
    return dist

这是内存泄漏还是我没有足够的内存(我有 8GB)?我该如何解决这个问题?

scipy has built-in functions for distance computations,与自制实现相比快如闪电。

所以,第一个想法是用以下表达式替换整个 distance 函数:

from numpy.random import rand
from scipy.spatial import distance

# sample data
a = randn(42000, 784
b = randn(256, 784)

# distance computation
dist = distance.cdist(a, b, metric='euclidean')    # about 8.02 s on 
                                                   # my 8 GB RAM machine

请注意,此示例中的 dist 是根据您的示例转置的。如果你想要你的例子的形状,只需做 dist = distance.cdist(a, b).T.

通过省略平方根运算,可以进一步加快计算速度。您可以通过 dist = distance.cdist(a, b, metric='sqeuclidean').

完成此操作

整个方法并没有大大减少内存消耗,但只占用了几秒钟的内存。

第二个想法是根本不使用自制的实现,而是使用一些可靠的第三方包,比如众所周知的 Scikit Learn:

from sklear.cluster import KMeans
a = randn(4200, 200)

km = KMeans(n_clusters=256)
km.fit(a)                    # about 10 s

此实现的几个优点之一是,它会自动决定如何计算距离,这样就不会破坏您的记忆。