1.聚类分析
聚类分析指将物理或抽象对象的集合分组为由类似的对象组成的多个类的分析过程。它是一种重要的人类行为
聚类源于很多领域,包括数学,计算机科学,统计学,生物学和经济学。在不同的应用领域,很多聚类技术都得到了发展,这些技术方法被用作描述数据,衡量不同数据源间的相似性,以及把数据源分类到不同的簇中
2.聚类的意义
首先将大规模的、纷繁复杂的数据归档为不同的类别,进而针对每一类数据,制定不同的管理、分析方式,因为每一类的数据都是显著不同的
聚类会从数据中发掘出很多分析和理解的视角,让我们更深入的把握数据资源的价值、并据此指导生产生活
3.聚类与分类的区别
分类:监督学习,有限类别中的某一类
聚类:无监督学习,不依赖预先定义的类或带类标记的训练实例,需要由聚类学习算法自动确定标记。聚类是一种探索性的分析,聚类分析所使用方法的不同,常常会得到不同的结论。不同研究者对于同一组数据进行聚类分析,所得到的聚类数未必一致
4.聚类的基本流程
- 对数据进行表示和预处理,包括数据清洗、特征选择或特征抽取
- 给定数据之间的相似度或相异度及其定义方法
- 根据相似度,对数据进行划分,即聚类
- 对聚类结果进行评估
![117686899c0f56d5e43d162bcc80c722.png](https://i-blog.csdnimg.cn/blog_migrate/e585869e8a36b89052a7ee9e7719f88b.jpeg)
5.聚类方法类别
基于划分聚类算法 K-means,K-medoids,CLARA等 | 基于划分聚类算法 K-means,K-medoids,CLARA等 |
基于层次聚类算法 BIRCH,CURE等 | 基于层次聚类算法 BIRCH,CURE等 |
基于密度聚类算法 DBSCAN,OPTICS等 | 基于密度聚类算法 DBSCAN,OPTICS等 |
基于网格的聚类算法 STING,WaveCluster等 | 基于网格的聚类算法 STING,WaveCluster等 |
基于神经网络的聚类算法 自组织神经网络SOM | 基于神经网络的聚类算法 自组织神经网络SOM |
基于统计学的聚类算法 COBWeb,AutoClass等 | 基于统计学的聚类算法 COBWeb,AutoClass等 |
7.K-Means
K-均值(K-Means):K均值法是麦奎因(MacQueen,1967)提出的,这种算法的基本思想是将每一个样本分配给最近中心(均值)的类中
7.1算法步骤
- 先从没有标签的元素集合A中随机取k个元素作为k个子集各自的中心
- 分别计算剩下的元素到k个子集中心的距离,根据将这些元素分别划归到最近的子集
- 根据聚类结果,重新计算中心(子集中所有元素各个维度的算数平均数)
- 将集合A中全部元素按照新的中心然后再重新聚类
- 重复以上步骤,直到聚类的结果不再发生变化
7.2 K-Means的python实现
# 迭代,传入数据和k值,k=4
def kmeans(data, k):
# 计算样本的个数
numSamples = data.shape[0] #80
# clusterData样本的属性,行是代表各个样本,第一列保存样本属于哪个簇,第二列保存样本跟它所属簇的距离
clusterData = np.zeros((numSamples, 2)) # 80 * 2
# 决定质心是否要改变
clusterChanged = True
# 初始化质心
centroids = initCentroids(data, k) # k 个初始质心
while clusterChanged: # 死循环 迭代次数不确定
clusterChanged = False # 质心改变 后面会再改过来
# 循环每一个样本
for i in range(numSamples): #80,对所有的样本点
# 最小距离
minDist = 100000.0 # 最小值 定义成 一个超大值
# 定义样本所属的簇
minIndex = 0
# 循环计算每一个质心和样本的距离
for j in range(k): # 4,和4个质心的距离
# 计算距离
distance = euclDistance(centroids[j,:],data[i,:])
if distance < minDist: # 类似 冒泡排序
# 更新最小距离
minDist = distance
# 更新样本所属的簇
minIndex = j
# 更新样本保存的最小距离
clusterData[i,1] = distance
# 如果有一个样本所属的簇发生改变
if clusterData[i,0] != minIndex:
# 质心发生改变
clusterChanged = True
# 更新样本的簇
clusterData[i,0] = minIndex
# 当if为假,质心不发生改变,下面两行不运行,带着开头的clusterChanged = False 回到 while 结束循环
# 更新质心
for j in range(k):
# 获取第j个簇所有的样本所在的 索引
cluster_index = np.nonzero(clusterData[:,0]==j) # np.nonzero() 返回非零元素的索引
# 第j个簇所有的样本点
pointsInCluster = data[cluster_index]
# 计算质心
centroids[j,:] = np.mean(pointsInCluster,axis=0)
return centroids, clusterData