from sklearn.metrics import pairwise_distances_argmin
import numpy as np
import random
def find_cluster(X,n_cluster,seed):
"""
基于EM的k均值算法算法
:param X: 数据
:param n_cluster: 聚类中心数量
:param seed: 随机状态
:return: 聚类中心坐标和数据标签
"""
#随机产生初始聚类中心
index=random.sample(range(0,X.shape[0]),n_cluster,rseed=seed)
centers=X[index]
while True:
#将点分配至离其最近的簇中心点(E步)
labels=pairwise_distances_argmin(X,centers)
#将簇中心点设置为所有点坐标的平均值
new_centers=np.array([X[labels==i].mean(0) for i in range(0,n_cluster) ])
if np.all(centers,new_centers):
break
centers=new_centers
return labels,centers