国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python聚類算法之凝聚層次聚類實(shí)例分析

2020-01-04 17:56:09
字體:
供稿:網(wǎng)友
這篇文章主要介紹了Python聚類算法之凝聚層次聚類的原理與具體使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
 

本文實(shí)例講述了Python聚類算法之凝聚層次聚類。分享給大家供大家參考,具體如下:

凝聚層次聚類:所謂凝聚的,指的是該算法初始時(shí),將每個點(diǎn)作為一個簇,每一步合并兩個最接近的簇。另外即使到最后,對于噪音點(diǎn)或是離群點(diǎn)也往往還是各占一簇的,除非過度合并。對于這里的“最接近”,有下面三種定義。我在實(shí)現(xiàn)是使用了MIN,該方法在合并時(shí),只要依次取當(dāng)前最近的點(diǎn)對,如果這個點(diǎn)對當(dāng)前不在一個簇中,將所在的兩個簇合并就行:

單鏈(MIN):定義簇的鄰近度為不同兩個簇的兩個最近的點(diǎn)之間的距離。
全鏈(MAX):定義簇的鄰近度為不同兩個簇的兩個最遠(yuǎn)的點(diǎn)之間的距離。
組平均:定義簇的鄰近度為取自兩個不同簇的所有點(diǎn)對鄰近度的平均值。
 

  1. # scoding=utf-8 
  2. # Agglomerative Hierarchical Clustering(AHC) 
  3. import pylab as pl 
  4. from operator import itemgetter 
  5. from collections import OrderedDict,Counter 
  6. points = [[int(eachpoint.split('#')[0]), int(eachpoint.split('#')[1])] for eachpoint in open("points","r")] 
  7. # 初始時(shí)每個點(diǎn)指派為單獨(dú)一簇 
  8. groups = [idx for idx in range(len(points))] 
  9. # 計(jì)算每個點(diǎn)對之間的距離 
  10. disP2P = {} 
  11. for idx1,point1 in enumerate(points): 
  12.   for idx2,point2 in enumerate(points): 
  13.     if (idx1 < idx2): 
  14.       distance = pow(abs(point1[0]-point2[0]),2) + pow(abs(point1[1]-point2[1]),2) 
  15.       disP2P[str(idx1)+"#"+str(idx2)] = distance 
  16. # 按距離降序?qū)⒏鱾€點(diǎn)對排序 
  17. disP2P = OrderedDict(sorted(disP2P.iteritems(), key=itemgetter(1), reverse=True)) 
  18. # 當(dāng)前有的簇個數(shù) 
  19. groupNum = len(groups) 
  20. # 過分合并會帶入噪音點(diǎn)的影響,當(dāng)簇?cái)?shù)減為finalGroupNum時(shí),停止合并 
  21. finalGroupNum = int(groupNum*0.1) 
  22. while groupNum > finalGroupNum: 
  23.   # 選取下一個距離最近的點(diǎn)對 
  24.   twopoins,distance = disP2P.popitem() 
  25.   pointA = int(twopoins.split('#')[0]) 
  26.   pointB = int(twopoins.split('#')[1]) 
  27.   pointAGroup = groups[pointA] 
  28.   pointBGroup = groups[pointB] 
  29.   # 當(dāng)前距離最近兩點(diǎn)若不在同一簇中,將點(diǎn)B所在的簇中的所有點(diǎn)合并到點(diǎn)A所在的簇中,此時(shí)當(dāng)前簇?cái)?shù)減1 
  30.   if(pointAGroup != pointBGroup): 
  31.     for idx in range(len(groups)): 
  32.       if groups[idx] == pointBGroup: 
  33.         groups[idx] = pointAGroup 
  34.     groupNum -= 1 
  35. # 選取規(guī)模最大的3個簇,其他簇歸為噪音點(diǎn) 
  36. wantGroupNum = 3 
  37. finalGroup = Counter(groups).most_common(wantGroupNum) 
  38. finalGroup = [onecount[0] for onecount in finalGroup] 
  39. dropPoints = [points[idx] for idx in range(len(points)) if groups[idx] not in finalGroup] 
  40. # 打印規(guī)模最大的3個簇中的點(diǎn) 
  41. group1 = [points[idx] for idx in xrange(len(points)) if groups[idx]==finalGroup[0]] 
  42. group2 = [points[idx] for idx in xrange(len(points)) if groups[idx]==finalGroup[1]] 
  43. group3 = [points[idx] for idx in xrange(len(points)) if groups[idx]==finalGroup[2]] 
  44. pl.plot([eachpoint[0] for eachpoint in group1], [eachpoint[1] for eachpoint in group1], 'or'
  45. pl.plot([eachpoint[0] for eachpoint in group2], [eachpoint[1] for eachpoint in group2], 'oy'
  46. pl.plot([eachpoint[0] for eachpoint in group3], [eachpoint[1] for eachpoint in group3], 'og')   
  47. # 打印噪音點(diǎn),黑色 
  48. pl.plot([eachpoint[0] for eachpoint in dropPoints], [eachpoint[1] for eachpoint in dropPoints], 'ok')   
  49. pl.show() 
?

運(yùn)行效果截圖如下:

Python聚類算法之凝聚層次聚類實(shí)例分析

希望本文所述對大家Python程序設(shè)計(jì)有所幫助。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 建湖县| 无极县| 湖口县| 弋阳县| 达拉特旗| 称多县| 镇江市| 宜兰市| 福清市| 延川县| 德令哈市| 义乌市| 山西省| 梨树县| 汾阳市| 合江县| 舒城县| 梨树县| 梁平县| 二连浩特市| 库尔勒市| 衡阳县| 麦盖提县| 凤山市| 壶关县| 临泽县| 弋阳县| 来安县| 诏安县| 台中县| 惠水县| 仁怀市| 德江县| 张家口市| 基隆市| 防城港市| 永和县| 全椒县| 泉州市| 柏乡县| 新民市|