python实现树冠聚类的方法

  介绍

这篇文章将为大家详细讲解有关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实现树冠聚类的方法