介绍
这篇文章将为大家详细讲解有关python实现树冠聚类的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
林冠算法是2000年由安德鲁?McCallum Kamal安格尼噶和莱尔提出来的,它是对k - means聚类算法和层次聚类算法的预处理。众所周知,kmeans的一个不足之处在于k值需要通过人为的进行调整,后期可以通过肘部法则(肘方法)和轮廓系数(轮廓系数)来对k值进行最终的确定,但是这些方法都是属于“事”后判断的,而树冠算法的作用就在于它是通过事先粗聚类的方式,为k - means算法确定初始聚类中心个数和聚类中心点。
<强>使用的包:强>
导入数学 进口随机 进口numpy np 从datetime进口datetime 从进口pprint pprint p 进口matplotlib。pyplot作为plt
<强> 1。首先我在算法中预设了一个二维(为了方便后期画图呈现在二维平面上)数据数据集。强>
当然也可以使用高纬度的数据,并且我将树冠核心算法写入了类中,后期可以通过直接调用的方式对任何维度的数据进行处理,当然只是小批量的,大批量的数据可以移步Mahout和Hadoop了。
#随机生成500个二维(0,1)平面点 数据集=np.random。兰德(500 2)
<强> 2。然后生成个两类,类的属性如下:强>
林冠类: def __init__(自我,数据集): 自我。数据集=数据集 自我。t1=0 自我。t2=0
加入设定t1和t2初始值以及判断大小函数
#设置初始阈值 def setThreshold(自我,t1, t2): 如果t1比;t2: 自我。t1=t1 自我。t2=t2 其他: 打印(& # 39;t1需要大于t2 ! & # 39;)
<强> 3。距离计算,各个中心点之间的距离计算方法我使用的欧式距离。强>
#使用欧式距离进行距离的计算 def euclideanDistance(自我、vec1 vec2): 返回数学。√((vec1 - vec2) * * 2) .sum ())
<强> 4。再写个从数据中根据数据集的长度随机选择下标的函数强>
#根据当前数据集的长度随机选择一个下标 def getRandIndex(自我): 返回随机。randint (0, len (self.dataset) - 1)
<强> 5。核心算法强>
def集群(自我): 如果自我。t1==0: 打印(& # 39;请设置阈值# 39;公司) 其他: 树冠=[]#用于存放最终归类结果 而len (self.dataset) !=0: rand_index=self.getRandIndex () current_center=自我。数据集[rand_index] #随机获取一个中心点,定为P点 current_center_list=[] #初始化P点的树冠类容器 delete_list=[] #初始化P点的删除容器 自我。数据集=np.delete ( 自我。数据集,rand_index,0) #删除随机选择的中心点P datum_j的范围(len (self.dataset)): 基准=self.dataset [datum_j] 距离=self.euclideanDistance ( current_center基准面)#计算选取的中心点P到每个点之间的距离 如果距离& lt;self.t1: #若距离小于t1,则将点归入P点的树冠类 current_center_list.append(基准) 如果距离& lt;self.t2: delete_list.append (datum_j) #若小于t2则归入删除容器 #根据删除容器的下标,将元素从数据集中删除 自我。数据集=np.delete (self.dataset delete_list 0) 树冠。追加((current_center current_center_list)) 返回的树冠
为了方便后面的数据可视化,我这里的树冠定义的是一个数组,当然也可以使用dict类型。
<强> 6.主要()函数强>
def主要(): t1=0.6 t2=0.4 gc=树冠(数据集) gc。setThreshold (t1, t2) 树冠=gc.clustering () 打印(& # 39;% s初始中心强生# 39;% len(树冠)) # showCanopy(树冠上,数据集,t1, t2)
<强>林冠聚类可视化代码强>
def showCanopy(树冠上,数据集,t1, t2): 无花果=plt.figure () sc=fig.add_subplot (111) 颜色=[& # 39;布朗# 39;& # 39;绿色# 39;,& # 39;蓝# 39;,& # 39;y # 39;, & # 39; " # 39;, & # 39;晒# 39;,& # 39;dodgerblue& # 39;, & # 39;一个# 39;,& # 39;橘红色# 39;,& # 39;秘鲁# 39;,& # 39;蓝# 39;,& # 39;y # 39;, & # 39; " # 39;, & # 39;黄金# 39;,& # 39;dimgray& # 39;, & # 39; darkorange& # 39;, & # 39;秘鲁# 39;,& # 39;蓝# 39;,& # 39;y # 39;, & # 39; " # 39;, & # 39;青色# 39;,& # 39;晒# 39;,& # 39;兰花# 39;,& # 39;秘鲁# 39;,& # 39;蓝# 39;,& # 39;y # 39;, & # 39; " # 39;, & # 39;黄土# 39;】 标记=[& # 39;* & # 39;& # 39;h # 39;, & # 39; h # 39;, & # 39; + & # 39;, & # 39; o # 39;, & # 39; 1 & # 39;, & # 39; 2 & # 39;, & # 39; 3 & # 39;, & # 39;, & # 39;, & # 39; v # 39;, & # 39; h # 39;, & # 39; + & # 39;, & # 39; 1 & # 39;, & # 39; 2 & # 39;, & # 39; ^ & # 39;, & # 39; & lt; & # 39;, & # 39;祝辞& # 39;,& # 39;强生# 39;,& # 39;4 & # 39;,& # 39;h # 39;, & # 39; + & # 39;, & # 39; 1 & # 39;, & # 39; 2 & # 39;, & # 39; & # 39;, & # 39; p # 39;, & # 39; x # 39;, & # 39; d # 39;, & # 39; d # 39;, & # 39; | & # 39;, & # 39; _ # 39;]我的范围(len(树冠)): 树冠=树冠[我] 中心=树冠[0] 组件=树冠[1] sc.plot中心(中心[0],[1],标志=标记(我), 颜色=颜色[我],markersize=10) t1_circle=plt.Circle ( xy=([0]中心,中心[1]),半径=t1,颜色=& # 39;dodgerblue& # 39;填补=False) t2_circle=plt.Circle ( xy=([0]中心,中心[1]),半径=t2,颜色=& # 39;天蓝色# 39;α=0.2) sc.add_artist (t1_circle) sc.add_artist (t2_circle)组件的组件: [0]sc.plot(组件,组件[1], 标志=标记[我],颜色=颜色[我],markersize=1.5) maxvalue=https://www.yisu.com/zixun/np.amax(数据集) minvalue=np.amin(数据集) plt。xlim (minvalue - t1, maxvalue + t1) plt。ylim (minvalue - t1, maxvalue + t1) plt.show ()python实现树冠聚类的方法