我有一个功能:
def update(points, closest, centroids):
return np.array([points[closest==k].mean(axis=0) for k in range(centroids.shape[0])])
它基本上是kmeans算法中质心步的更新。 基本上,点是一个矩阵,最接近的是一个点到一个簇的赋值。
然后我所做的就是根据群集中的点找到新的均值..
但我想知道我是否可以摆脱那个for循环? 如果我能一次性找到聚类均值?
答案 0 :(得分:1)
这是基于np.add.reduceat
-
c = np.bincount(closest,minlength=centroids.shape[0])
mask = c != 0
pts_grp = points[closest.argsort()]
cut_idx = np.append(0,c[mask].cumsum()[:-1])
out = np.full((centroids.shape[0],points.shape[1]),np.nan)
out[mask] = np.add.reduceat(pts_grp,cut_idx,axis=0)/c[mask,None].astype(float)