二、K-Means聚类
聚类分析中最广泛使用的算法为K-Means聚类算法。
算法原理
给定一个n个对象或元组的数据库,一个划分方法构建数据的k个划分,每个划分表示一个簇,k<=n,而且满足:
(1)每个组至少包含一个对象;
(2)每个对象属于且仅属于一个组。
划分时要求同一个聚类中的对象尽可能地接近或相关,不同聚类中的对象尽可能地远离或不同。K-Means算法是一个迭代的优化算法,最终使得下面均方误差最小。
用于划分的K-Means算法,其中每个簇的中心都用簇中所有对象的均值来表示。K-Means聚类模型所采用的迭代算法直观易懂且非常实用。但是具有容易收敛到局部最优解和需要预先设定簇的数量的缺点。
优点
1.可扩展性较好,算法复杂度为O(nkt),其中n为对象总数,k是簇的个数,t是迭代次数。
2.经常终止于局部最优解
缺点
1.只有当簇均值有定义的情况下,k均值方法才能使用。(某些分类属性的均值可能没有定义)
2.用户必须首先给定簇数目
3.不适合发现非凸形状的簇,或者大小差别很大的簇
4.对噪声和离群点数据敏感
k均值方法有些变种,他们的区别在于
1.不同的初始 k 个均值的选择
2.不同的相异度计算
3.不同的计算簇均值的策略
聚类分类数据的方法:k众数(mode)方法
1.用众数来替代簇的均值
2.采用新的相异性度量处理分类对象
3.采用基于频率的方法更新簇的众数
4.可以集成k均值和k众数方法,对具有数值和分类值的数据进行聚类
算法改进
1.K-means++算法
K-means算法初始时随机选取数据集中K个点作为聚类中心,不同的初始聚类中心可能导致完全不同的聚类结果。K-means++算法初始的聚类中心之间的相互距离要尽可能的远。
2.ISODATA算法
ISODATA的全称是迭代自组织数据分析法,是在K- means算法的基础上,增加对聚类结果的“合并”和“分裂”两个操作,当属于某个类别的样本数过少时则删除该类,当属于某个类别的样本数过多、分散程度较大时,把这个类分裂为两个子类别。
K-Means算法实现
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
iris = load_iris() # 加载数据集
X = iris.data
estimator = KMeans(n_clusters=3) # 构造K-Means聚类模型
estimator.fit(X) # 数据导入模型进行训练
label_pred = estimator.labels_ # 获取聚类标签
print(label_pred) # 显示各个样本所属的类别标签
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 2 2 2 0 2 2 2 2
2 2 0 0 2 2 2 2 0 2 0 2 0 2 2 0 0 2 2 2 2 2 0 2 2 2 2 0 2 2 2 0 2 2 2 0 2
2 0]