K-均值算法是发现给定数据集的k个簇的算法。簇个数k是用户给定的,每一个簇通过其簇中所有点的中心点来描述
工作流程:
首选选取样本中k个样本作为每个簇的簇中心
然后对每一个样本与每个簇之间的关系,来分配到每一个簇中
然后更新每个簇的均值
重复上面过程
伪代码
初始化 create k points from samples repeat 从样本中选取样本 计算样本与每个均值距离 将样本归入距离最小的簇中。 更新簇中心
K-均值聚类一般流程
1:收集数据
2:准备数据
3:分析数据
4:训练算法,不适用无监督学习,无监督学习没有训练过程
5:测试算法
6:使用算法
简单的k-means使用
import numpy as np import matplotlib.pyplot as plt # 计算两点之间的距离 两点距离 def distance(e1, e2): return np.sqrt((e1[0]-e2[0])**2+(e1[1]-e2[1])**2) # 集合中心 def means(arr): return np.array([np.mean([e[0] for e in arr]), np.mean([e[1] for e in arr])]) # arr中距离a最远的元素,用于初始化聚类中心 def farthest(k_arr, arr): f = [0, 0] max_d = 0 for e in arr: d = 0 for i in range(k_arr.__len__()): d = d + np.sqrt(distance(k_arr[i], e)) if d > max_d: max_d = d f = e return f # arr中距离a最近的元素,用于聚类 def closest(a, arr): c = arr[1] min_d = distance(a, arr[1]) arr = arr[1:] for e in arr: d = distance(a, e) if d < min_d: min_d = d c = e return c if __name__=="__main__": ## 生成二维随机坐标(如果有数据集就更好) arr = np.random.randint(200, size=(200, 1, 2))[:, 0, :] ## 初始化聚类中心和聚类容器 m = 5 r = np.random.randint(arr.__len__() - 1) k_arr = np.array([arr[r]]) cla_arr = [[]] for i in range(m-1): k = farthest(k_arr, arr) k_arr = np.concatenate([k_arr, np.array([k])]) cla_arr.append([]) ## 迭代聚类 n = 20 cla_temp = cla_arr for i in range(n): # 迭代n次 for e in arr: # 把集合里每一个元素聚到最近的类 ki = 0 # 假定距离第一个中心最近 min_d = distance(e, k_arr[ki]) for j in range(1, k_arr.__len__()): if distance(e, k_arr[j]) < min_d: # 找到更近的聚类中心 min_d = distance(e, k_arr[j]) ki = j cla_temp[ki].append(e) # 迭代更新聚类中心 for k in range(k_arr.__len__()): if n - 1 == i: break k_arr[k] = means(cla_temp[k]) cla_temp[k] = [] ## 可视化展示 col = ['HotPink', 'Aqua', 'Chartreuse', 'yellow', 'LightSalmon'] for i in range(m): plt.scatter(k_arr[i][0], k_arr[i][1], linewidth=10, color=col[i]) plt.scatter([e[0] for e in cla_temp[i]], [e[1] for e in cla_temp[i]], color=col[i]) plt.show()
学习结果