scipy具有用于距离计算的内置函数,与自制的实现相比,速度快如闪电。
所以,第一个想法是更换你的整个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
此实现的几个优点之一是,它会自动决定如何计算距离,这样就不会破坏您的记忆。