【发布时间】:2017-05-06 22:53:08
【问题描述】:
假设我有一些最近邻分类器。对于新观察,它计算新观察与“已知”数据集中所有观察之间的距离。它返回与新观察距离最小的观察的类标签。
import numpy as np
known_obs = np.random.randint(0, 10, 40).reshape(8, 5)
new_obs = np.random.randint(0, 10, 80).reshape(16, 5)
labels = np.random.randint(0, 2, 8).reshape(8, )
def my_dist(x1, known_obs, axis=0):
return (np.square(np.linalg.norm(x1 - known_obs, axis=axis)))
def nn_classifier(n, known_obs, labels, axis=1, distance=my_dist):
return labels[np.argmin(distance(n, known_obs, axis=axis))]
def classify_batch(new_obs, known_obs, labels, classifier=nn_classifier, distance=my_dist):
return [classifier(n, known_obs, labels, distance=distance) for n in new_obs]
print(classify_batch(new_obs, known_obs, labels, nn_classifier, my_dist))
出于性能原因,我想避免在classify_batch 函数中使用for 循环。有没有办法使用 numpy 操作将 nn_classifier 函数应用于 new_obs 的每一行? 我已经尝试过 apply_along_axis,但正如经常提到的,它方便但不快。
【问题讨论】:
-
循环本身并不是减速的原因。 任何涉及直接调用 python 函数的事情都会很慢。寻找使用broadcasting和ufuncs的方法。
-
你试过k-means吗?
-
另请参阅this question(几乎是重复的)和this message 链接到最佳答案。