2016-11-13 24 views
1

我有一个函数:如何找到在单杆k均值意味着使用numpy的

def update(points, closest, centroids): 
    return np.array([points[closest==k].mean(axis=0) for k in range(centroids.shape[0])]) 

它基本上重心的更新的k均值算法步骤。 基本上,点是一个矩阵,最接近的是一个点到集群的分配..

,然后将所有我做的是找到基于集群中的点新意思..

但我想知道我是否可以摆脱那个循环? 这是如果我能找到一个镜头的聚类意思?

+0

我有这个代码小费。你可以交换一个生成器,交换np.array([points ..,.. shape [0])])给np.array(points ..,.. shape [0])),去掉一些没有意义的内存高架。 – Simon

回答

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)