失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 机器学习实战——层次聚类算法

机器学习实战——层次聚类算法

时间:2023-05-08 03:00:12

相关推荐

机器学习实战——层次聚类算法

机器学习实战——层次聚类算法

1 层次聚类概述2 sklearn中的实现

1 层次聚类概述

层次聚类试图在不同层次对数据集进行划分,从而形成树形的聚类结构。 数据集的划分可采用"自底向上"的聚合策略,也可采用"自顶向下" 的分拆策略。层次聚类可以分为凝聚层次聚类和分裂层次聚类。分裂层次聚类采用的就是"自顶而下"的思想,先将所有的样本都看作是同一个簇,然后通过迭代将簇划分为更小的簇,直到每个簇中只有一个样本为止。凝聚层次聚类采用的是"自底向上"的思想,先将每一个样本都看成是一个不同的簇,通过重复将最近的一对簇进行合并,直到最后所有的样本都属于同一个簇为止。目前,比较常用的层次聚类算法是"自底向上"的凝聚层次聚类,比较流行的算法有 BIRCH、AGNES,BIRCH 的算法可以参考文章1和文章2。本文主要介绍 AGNES 算法,其算法思想描述如下:

1 将每个样本当成一个初始簇;2 根据两个簇中样本点的最近距离找到相近的两个簇;3 合并两个簇,生成新的簇的集合;4 跳转到 2、3 步,直到达到定义的簇数目(若未定义簇数目,则将全部样本聚成一类为止)。

关于两个簇最近距离的计算有:最短距离、最长距离、平均距离三种常见的方法。设定 Ci,CjC_i,C_jCi​,Cj​ 为两个聚类簇,x,zx,zx,z 为两个簇中的样本点集合。

最短距离:把两个簇中距离最短的两个样本点间的距离作为簇间最近距离。数学公式如下:

最长距离:把两个簇中距离最大的两个样本点间的距离作为簇间最近距离。数学公式如下:

平均距离:把两个簇中各样本点距离的平均值作为簇间最近距离。数学公式如下:

2 sklearn中的实现

class sklearn.cluster.AgglomerativeClustering(n_clusters=2, affinity=’euclidean’, memory=None, connectivity=None, compute_full_tree=’auto’, linkage=’ward’, pooling_func=’deprecated’)

主要参数说明:

n_clusters:聚类的个数affinity:计算 linkage 距离的方式,可以为:euclidean、l1、l2、mantattan、cosine、precomputed,如果 linkage=’ward’,则 affinity 必须为 euclidean。linkage:指定层次聚类判断相似度的方法,有ward(组间距离等于两类对象之间的最小距离,single-linkage聚类)、average(组间距离等于两组对象之间的平均距离,average-linkage聚类)、complete(组间距离等于两组对象之间的最大距离,complete-linkage聚类)

from sklearn.cluster import AgglomerativeClusteringfrom sklearn.metrics import adjusted_rand_scorefrom sklearn.datasets import make_blobsimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] #中文显示问题plt.rcParams['axes.unicode_minus'] = False #负数显示问题#获取数据n_samples = 1500random_state = 170X,labels_true = make_blobs(n_samples=n_samples, random_state=random_state)# 聚类的个数nums = range(1,50) # 获取不同聚类个数ARI值的函数def test_AgglomerativeClustering_nclusters(X,labels_true,nums):ARIS = [] for num in nums: #定义聚类对象clst = AgglomerativeClustering(n_clusters=num)#训练对象并预测predicted_lables = clst.fit_predict(X) ARIS.append(adjusted_rand_score(labels_true, predicted_lables)) return(ARIS)ARIS = test_AgglomerativeClustering_nclusters(X,labels_true,nums)# 绘制ARI值与聚类个数的图形plt.plot(nums,ARIS,marker="+")# 由ARI值的图像知,最适合的为三类clf = AgglomerativeClustering(n_clusters=3)y_predict = clf.fit_predict(X)# 原始图像plt.subplot(1,2,1)plt.scatter(X[:,0],X[:,1],c=labels_true)plt.title('原始图像')# 聚类之后的图像plt.subplot(1,2,2)plt.scatter(X[:,0],X[:,1],c=y_predict)plt.title('预测图像')

层次聚类的树状热图可以通过 seaborn.clustermap 函数调用绘制。

如果觉得《机器学习实战——层次聚类算法》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。