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. 代码:
import numpy as npimport randomimport matplotlib.pyplot as pltdef distance(x, y):return np.sqrt(np.sum((x-y)**2))def find_closest(arr, x):# 在arr中找到与x最近的点的下标closest = 0min_distance = float('inf')for i in range(len(arr)):tmp_dist = distance(x, arr[i])if tmp_dist < min_distance:closest, min_distance = i, tmp_distreturn closestdef update_centers(arr):# 更新中心centers = []for classes in arr:classes = np.array(classes)centers.append(np.mean(classes, axis=0))return np.array(centers)def kmeans(nums, k, n):# 初始聚类点的选择num = len(nums)tmp_index = list(range(num))random.shuffle(tmp_index)random_index = tmp_index[:k]k_centers = nums[random_index, :]for i in range(n):# 循环n轮k_classes = [[] for i in range(k)]for point in range(len(nums)):index = find_closest(k_centers, nums[point])k_classes[index].append(nums[point])# 更新中心点k_centers = update_centers(k_classes)return k_centers, k_classesif __name__ == '__main__':nums = np.random.randn(100, 2)k_centers, k_classes = kmeans(nums, 4, 20)# 画图color = ['red', 'blue', 'pink', 'green']scale = [20, 30, 40, 50]for i in range(len(color)):classes = np.array(k_classes[i])plt.scatter(classes[:, 0], classes[:, 1], s=scale[i], color=color[i], alpha=0.6)plt.show()
