1. 原理
1. 标准k-means
基本思想:不断更新质心,直到质心变化不大
2. 二分k-means
基本思想:选取分簇之后的sse(到质心的距离平方和)是否最小分簇
3. 小批量k-means
基本思想:随机选取小批量样本,分配到最近的质心,更新质心,重复操作即可
2. python实现
1. 标准k-means
def standard_kmeans(data_mat, k):
"""
1. 初始化k个中心点
2. 计算每个样本到中心点的距离,最近的就划分为哪个族
3. 更新中心点
4. 判断中心点是否有变化
5. 没有变化,结束
6. 有变化,回到步骤2
:param data_mat:
:param k:
:return:
"""
m, n = data_mat.shape
center_pt = rand_init_center(data_mat, k)
# 存储每个点到属于哪个族以及距离
cluster_assment = np.mat(np.zeros((m,2)))
change = True
while change:
change = False
# 遍历所有样本
for i in range(m):
min_dis_index = -1
min_dis = np.inf
# 遍历所有的中心点
for j in range(k):
dis = computer_distance(center_pt[j, :], data_mat[i, :])
if dis < min_dis:
min_dis = dis
min_dis_index = j
if cluster_assment[i,0] != min_dis_index:
change = True
# 更新最近的中心点以及距离
cluster_assment[i,0] = min_dis_index
cluster_assment[i,1] = min_dis
# 如果中心没有变化,那么就可以退出了
if not change:
break
# 更新中心
for i in range(k):
# 提取i族的点
index = cluster_assment[:, 0].A == i
# nonzero返回一个元组,[0] 是行号,[1]是列号
index = np.nonzero(index)
pts = data_mat[index[0], :]
if pts.shape[0] != 0:
center_pt[i] = np.mean(pts, axis=0)
return center_pt, cluster_assment