孤独腹地
2021-11-13 16:07
采纳率: 100%
浏览 31

kmeans++聚类聚成这样合理吗

kmeans++聚类聚成这样合理吗
聚类的算法代码如下

class Kmeans:
    def __init__(self, k, threshold=1e-5):
        self.k = k
        self.threshold = threshold
    
    def centroid_init(self,X):
        centroids = []
        centroids.append(X[np.random.choice(X.shape[0])])
        for i in range(self.k-1):
            D = []
            for x in X:
                D.append(np.min([np.linalg.norm(x - c) for c in centroids]))
            centroids.append(X[np.argmax(D)])
        return np.array(centroids)
                              
    def train(self, X):
        # 初始化聚类中心
        self.centroids = self.centroid_init(X)
        y_pred = np.zeros(shape=(X.shape[0],))
        while True:
            # 涂色
            for i, x in enumerate(X):
                y_pred[i] = self.predict(x)
            
            # 计算新的聚类中心
            new_centroids = self.centroids.copy()
            for i in range(self.k):
                new_centroids[i] = X[y_pred==i].mean()
            
            # 如果聚类中心位置基本没有变化,那么终止
            if np.max(np.abs(new_centroids - self.centroids)) < self.threshold:
                break
            
            # 否则更新聚类中心,重复上述步骤
            self.centroids = new_centroids
        return y_pred

    def predict(self, x):
        dis = []
        # 计算每个样本与中心的距离
        for c in self.centroids:
            dis.append(np.linalg.norm(x - c))
        # 将样本索引添加到距离最小的中心对应的分类中
        return np.argmin(dis)

下图左边是原数据分布,右边是上面的算法生成的聚类分布

img

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

1条回答 默认 最新

相关推荐 更多相似问题