Kmeans算法
介绍
- 给定一个有M个对象的数据集,构建一个具有K个簇的模型,其中k<=M。满足:
- 每个簇至少包含一个对象
- 每个对象属于且仅属于一个簇
- 将满足上述条件的K个簇称为一个合理的聚类划分
- 基本思想:对于给定的类别数目k,首先给定初始划分,通过迭代改变样本和簇的隶属关系,使得每次处理后得到的划分方式比上一次的好(总的数据集之间的距离和变小了)
算法理论
假设输入样本为T=x1,x2,...,xmT=x_1,x_2,...,x_mT=x1,x2,...,xm;则算法步骤为(使用欧氏距离):
- 随机选择样本初始化的k个聚类中心,a1,a2,...,aka_1,a_2,...,a_ka1,a2,...,ak;
- 对于每个样本xix_{i}xi,将其标记为距离类别中心aja_{j}aj最近的类别 jjj
- labeli=argmin1<j<k{ ∑i=1n(xi−aj)2}l a b e l_{i}=\underset{1<j<k}{\arg \min }\{\sqrt{\sum_{i=1}^{n}\left(x_{i}-a_{j}\right)^{2}}\}labeli=1<j<kargmin{ ∑i=1n(xi−aj)2}
- 更新每个类别的中心点aja_{j}aj为隶属该类别的所有样本的均值
μi=1∣Ci∣∑x∈Cix\mu_{i}=\frac{1}{|C_i|} \sum_{x \in C_i} xμi=∣Ci∣1∑x∈Cix - 重复上述两步操作,知道达到某个终止条件
- 终止条件:
- 迭代次数
- 最小平方误差MSE
- 簇中心点变化率
例子
对数据集{ (1,2),(2,2),(6,8),(7,8)}\{(1,2),(2,2),(6,8),(7,8) \}{ (1,2),(2,2),(6,8),(7,8)}聚成2类
- 随机选取聚类中心C={ (1,2),(2,2)}C=\{(1,2),(2,2)\}C={ (1,2),(2,2)}
- 分别计算样本点到每个中心点的欧式距离
- 对距离从小到大进行排序,将样本点进行归类
- 各类使用样本均值更新样本中心点
- 重复2、3、4
- 当聚类中心不再变化时,停止迭代,完成聚类
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import copy
import sklearn.datasets as ds
import matplotlib.colors
from sklearn.cluster import KMeans,DBSCAN,AgglomerativeClustering
import scipy.cluster.hierarchy as sch
# v测量,轮廓系数
from sklearn.metrics import v_measure_score, silhouette_score
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = 'False'
def example1():
X = np.array([[1, 2], [2, 2], [6, 8], [7, 8]])
# 初始聚类中心
C = np.array<