聚类分析
概述
分类与聚类
- 分类:学习/训练过程有监督,训练样本有明确标签
- 聚类:学习/训练过程无监督,样本无明确标签
聚类的概念
- 聚类是把各不相同的个体分割为有更多相似性子集合的工作。
- 聚类生成的子集合称为簇
聚类的要求
- 生成的簇内部的任意两个对象之间具有较高的相似度
- 属于不同簇的两个对象间具有较高的相异度
聚类与分类的区别在于聚类不依赖于预先定义的类,没有预定义的类和样本——聚类是一种无监督的数据挖掘任务
聚类通常作为其他数据挖掘或建模的前奏。
在一个簇内的距离最小化,簇之间的距离最大化。
应用领域
- 客户价值分析
- 文本分类
- 基因识别
- 空间数据处理
- 卫星图片分析
数据分析、统计学、机器学习、空间数据库技术、生物学和市场学也推动了聚类分析研究的进展
常用的聚类算法
- K-均值聚类(K-Means)
- K-中心点聚类(K-Medoids)
- 密度聚类(Densit-based Spatial Clustering of Application with Noise, DBSCAN)
- 层次聚类(系谱聚类 Hierarchical Clustering, HC)
- 期望最大化聚类(Expectation Maximization, EM)
需要说明的是,这些算法本身无所谓优劣,而最终运用于数据的效果却存在好坏差异,这在很大程度上取决于数据使用者对于算法的选择是否得当。
相似性度量
相似度的衡量:距离
变量大致可以分为两类:
- 定量变量,也就是通常所说的连续变量。
- 定性变量,这些量并非真有数量上的变化,而只有性质上的差异。这些量可以分为两种,一种是有序变量,另一种是名义变量。
连续型变量距离:
典型的距离定义
相似系数
两个仅包含二元属性的对象之间的相似性度量也称相似系数
两个对象的比较有四种情况:
f00 = x取0并且y取0的属性个数;
f01 = x取0并且y取1的属性个数;
f10 = x取1并且y取0的属性个数;
f11 = x取1并且y取1的属性个数.
简单匹配系数:SMC = 值匹配的属性个数 / 属性个数= (f11 +f00) / (f01 + f10 + f11 + f00)
Jaccard(杰卡德) 系数 :J = 匹配的个数 / 不涉及0-0匹配的属性个数= (f11) / (f01 + f10 +f11)
例: 两个二元向量:x=(1,0,0,0,0,0,0,0,0,0)
y=(0,0,0,0,0,0,1,0,0,1)
f00 =7 (x取0并且y取0的属性个数)
f01 =2 (x取0并且y取1的属性个数)
f10 =1 (x取1并且y取0的属性个数)
f11 =0 (x取1并且y取1的属性个数)
简单匹配系数:SMC= (f11 +f00) / (f01 + f10 +f11 + f00)=(0+7)/(2+1+0+7)=0.7
Jaccard系数:J = (f11) / (f01 + f10+f11) =0/2+1+0 =0
余弦相似系数(如计算两文档间相似系数):
cos( x1, x2 ) = (x1 · x2) / ||x1|| ||x2|| ,
其中 · 表示向量的点积(内积),||x||表示向量的范数。
例:向量:x1 = (3,2,0,5,0,0,0,2,0,0)
x2 = (1,0,0,0,0,0,0,1,0,2)
则余弦相似系数为:cos( x1, x2 ) = 5/(6.481*2.245)=0.3436
K-Means
算法步骤
- 随机选取K个样本作为类中心;
- 计算各样本与各类中心的距离;
- 将各样本归于最近的类中心点;
- 求各类的样本的均值,作为新的类中心;
- 判定:若类中心不再发生变动或达到迭代次数,算法结束,否则回到第2步。
图中的计算分析:
Center1 = 1
Center2 = 2
Center1 = 1
Center2 = (class为2之和)/(class为2个数) = (2+4+5)/3 = 11/3
Center1 = (1+2)/2 = 3/2
Center2 = (4+5)/2 = 9/2
Center1 = 3/2
Center = 9/2
性能度量:簇内相似度与簇间相似度
- 外部指标:将聚类结果与实际结果进行比较
- 内部指标:不依赖于任何参考模型,直接考察聚类结果
优点:
- 算法简单,易于理解
- 对球形簇样本聚类效果好
- 二分k均值等变种算法运行良好,不受初始化问题的影响。
缺点:
- 不能处理非球形簇、不同尺寸和不同密度的簇
- 对离群点、噪声敏感
K-Medoids
算法步骤
1、随机选取K个样本作为类中心;
2、计算各样本与各类中心的距离;
3、将各样本归于最近的类中心点;
4、在各类别内选取到其余样本距离之和最小的样本作为新的类中心;
5、判定:若类中心不再发生变动或达到迭代次数,算法结束,否则回到第2步。
优点:
- 算法简单,易于理解
- 对球形簇样本聚类效果好
- 对离群点、噪声不敏感
缺点:
- 不能处理非球形簇、不同尺寸和不同密度的簇
- 算法复杂度较高
层次聚类(系谱聚类 Hierarchical Clustering, HC)
- 不需事先设定类别数k
- 每次迭代过程仅将距离最近的两个样本/簇聚为一类
- 得到k=n至k=1(n为待分类样本总数)个类别的聚类结果
优点
- 某些应用领域需要层次结构。如:系统发生树,基因芯片
- 有些研究表明,这种算法能够产生较高质量的聚类
缺点
- 计算量、存储量大
- 对噪声、高维数据敏感
Python自编代码实现K-Means聚类分析算法对鸢尾花样本进行聚类
from sklearn.datasets import load_iris #导入库
import numpy as np
iris = load_iris() #鸢尾花数据
data = iris.data
# print(data)
n = len(data)
k = 2 #确定k值
dist = np.zeros([n, k+1]) #生成一个[n,k+1]的数组
#1、选中心
center = data[:k, :]
center_new = np.zeros([k, data.shape[1]]) #新的类中心
# print(center)
# print(center_new)
while True:
#2、求距离
for i in range(n):
for j in range(k):
dist[i, j] = np.sqrt(sum((data[i, :] - center[j, :])**2))
# print(dist)
dist[i, k] = np.argmin(dist[i, :k]) #最小值位置 #3、归类
for i in range(k): #4、求新类中心(所有样本的均值)
index = dist[:, k] == i #标签类别是0的索引
center_new[i, :] = data[index, :].mean(axis=0)
# print(index)
# print(center_new)
if np.all(center == center_new): #5、判定结束
break
center = center_new
print(dist)
Python使用sklearn实现K-Means聚类分析算法对鸢尾花样本进行聚类
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
iris = load_iris()
model = KMeans(n_clusters=3).fit(iris.data)
#查看聚类结果
print(model.labels_)