内存错误 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
此实现的几个优点之一是,它会自动决定如何计算距离,这样就不会破坏您的记忆。
我正在尝试 运行 使用 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
此实现的几个优点之一是,它会自动决定如何计算距离,这样就不会破坏您的记忆。