1. Kmeans算法及其优化

1.1 Kmeans ++

K-Means++算法就是对K-Means随机初始化质心的方法的优化。选择一个新的数据点作为新的聚类中心,选择的原则是:距离较大的点,被选取作为聚类中心的概率较大

2. 软聚类和硬聚类

硬聚类就是把数据确切地分到某一类中,比如K-Means。
硬就是说“强硬”,是属于A类就是A类,不会跑到B类。

软聚类就是把数据以一定的概率分到各类中,比如高斯混合模型(GMM),比如模糊C均值模型(Fuzzy c-Means)。聚类的结果往往是样本1在A类的概率是0.7,在B类的概率是0.3。
软聚类又称为模糊聚类(fuzzy clustering)。

软聚类:

  • 高斯混合


3. EM算法

4. 代码:

  1. import numpy as np
  2. import random
  3. import matplotlib.pyplot as plt
  4. def distance(x, y):
  5. return np.sqrt(np.sum((x-y)**2))
  6. def find_closest(arr, x):
  7. # 在arr中找到与x最近的点的下标
  8. closest = 0
  9. min_distance = float('inf')
  10. for i in range(len(arr)):
  11. tmp_dist = distance(x, arr[i])
  12. if tmp_dist < min_distance:
  13. closest, min_distance = i, tmp_dist
  14. return closest
  15. def update_centers(arr):
  16. # 更新中心
  17. centers = []
  18. for classes in arr:
  19. classes = np.array(classes)
  20. centers.append(np.mean(classes, axis=0))
  21. return np.array(centers)
  22. def kmeans(nums, k, n):
  23. # 初始聚类点的选择
  24. num = len(nums)
  25. tmp_index = list(range(num))
  26. random.shuffle(tmp_index)
  27. random_index = tmp_index[:k]
  28. k_centers = nums[random_index, :]
  29. for i in range(n):
  30. # 循环n轮
  31. k_classes = [[] for i in range(k)]
  32. for point in range(len(nums)):
  33. index = find_closest(k_centers, nums[point])
  34. k_classes[index].append(nums[point])
  35. # 更新中心点
  36. k_centers = update_centers(k_classes)
  37. return k_centers, k_classes
  38. if __name__ == '__main__':
  39. nums = np.random.randn(100, 2)
  40. k_centers, k_classes = kmeans(nums, 4, 20)
  41. # 画图
  42. color = ['red', 'blue', 'pink', 'green']
  43. scale = [20, 30, 40, 50]
  44. for i in range(len(color)):
  45. classes = np.array(k_classes[i])
  46. plt.scatter(classes[:, 0], classes[:, 1], s=scale[i], color=color[i], alpha=0.6)
  47. plt.show()