Python中如何实现k-Medoids聚类算法?

用 python 写 k-Medoids 算法:

输入:样本特征矩阵 X,类别数 K

输出: 聚类结果

要求:初始中心的选取应用最大最小距离法选取中心


Python中如何实现k-Medoids聚类算法?
7 回复

伸。。伸手党?


import numpy as np
from sklearn.metrics import pairwise_distances

class KMedoids:
    def __init__(self, n_clusters=3, max_iters=100, random_state=None):
        self.n_clusters = n_clusters
        self.max_iters = max_iters
        self.random_state = random_state
        self.medoids = None
        self.labels = None
        
    def fit(self, X):
        np.random.seed(self.random_state)
        n_samples = X.shape[0]
        
        # 随机初始化medoids
        medoid_indices = np.random.choice(n_samples, self.n_clusters, replace=False)
        self.medoids = X[medoid_indices]
        
        for _ in range(self.max_iters):
            # 计算距离矩阵
            distances = pairwise_distances(X, self.medoids, metric='euclidean')
            
            # 分配每个点到最近的medoid
            self.labels = np.argmin(distances, axis=1)
            
            # 更新medoids
            new_medoids = np.copy(self.medoids)
            for i in range(self.n_clusters):
                cluster_points = X[self.labels == i]
                if len(cluster_points) > 0:
                    # 计算每个点到其他所有点的距离和
                    intra_distances = pairwise_distances(cluster_points, metric='euclidean')
                    total_distances = np.sum(intra_distances, axis=1)
                    # 选择距离和最小的点作为新medoid
                    new_medoid_idx = np.argmin(total_distances)
                    new_medoids[i] = cluster_points[new_medoid_idx]
            
            # 检查收敛
            if np.allclose(self.medoids, new_medoids):
                break
                
            self.medoids = new_medoids
            
        return self
    
    def predict(self, X):
        distances = pairwise_distances(X, self.medoids, metric='euclidean')
        return np.argmin(distances, axis=1)

# 使用示例
if __name__ == "__main__":
    # 创建示例数据
    np.random.seed(42)
    X = np.random.randn(100, 2)
    
    # 创建并训练模型
    kmedoids = KMedoids(n_clusters=3, random_state=42)
    kmedoids.fit(X)
    
    # 获取结果
    labels = kmedoids.labels
    medoids = kmedoids.medoids
    
    print(f"Medoids positions:\n{medoids}")
    print(f"Cluster labels shape: {labels.shape}")

这个实现的核心逻辑是:1)随机选择初始medoids;2)将每个点分配到最近的medoid;3)在每个簇内重新计算medoid(选择使簇内距离总和最小的点);4)重复直到medoids不再变化或达到最大迭代次数。

主要特点:1)使用实际数据点作为聚类中心;2)通过pairwise_distances计算距离;3)收敛条件简单直接。

建议用scikit-learn-extra库的KMedoids实现更高效。

你都知道要用什么算法了,就不能自己实现一下,然后造福大众吗

老师布置的作业,这个算法我都没有听过

百度一下有说明的。

蟹蟹

回到顶部