我不知道我是否太过分了,但我想删除下面代码中的 for 循环:
# self.assigments = (N, )
# self.points = (N, 2)
# centers = (3, 2)
centers = np.zeros((self.K, self.points.shape[1]))
_, counts = np.unique(self.assignments, return_counts=True)
for point, assignment in zip(self.points, self.assignments):
centers[assignment][0] += point[0] / counts[assignment]
centers[assignment][1] += point[1] / counts[assignment]
return centers
此代码基本上根据分配重新计算 K-Means 聚类算法的中心。我正在努力删除 for 循环,但我的直觉表明它可以删除。这让我想知道,在尝试通过矢量化等技术删除
for
循环时,是否可以考虑任何规则/启发法?
我的期望是,从上述代码中删除
for
循环是可能的,并且通常可以通过删除 for
循环来应用一些规则或启发式进行优化。
counts[self.assignments]
会产生什么?一个 (N,) 数组?
self.points # (N,2)
temp = self.points/counts[self.assignments][:,None]
应该是 (N,2)。所以我的猜测是
for assignment in self.assignments:
centers[assignment] += temp[assignment]
这并不能消除大的
N
循环,但可能会使 +=
分配的可视化变得更容易。
在我内心深处,我想
bincount
在这里可能有用。不过这个功能我没怎么用过。
我想这说明了我的双重方法 - 尽可能地清理内部“矢量化”,然后对主迭代进行可视化。