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实现更高效。
你都知道要用什么算法了,就不能自己实现一下,然后造福大众吗
老师布置的作业,这个算法我都没有听过
百度一下有说明的。
蟹蟹

