Python聚類演算法之凝聚層次聚類執行個體分析

來源:互聯網
上載者:User
本文執行個體講述了Python聚類演算法之凝聚層次聚類。分享給大家供大家參考,具體如下:

凝聚層次聚類:所謂凝聚的,指的是該演算法初始時,將每個點作為一個簇,每一步合并兩個最接近的簇。另外即使到最後,對於噪音點或是離群點也往往還是各佔一簇的,除非過度合并。對於這裡的“最接近”,有下面三種定義。我在實現是使用了MIN,該方法在合并時,只要依次取當前最近的點對,如果這個點對當前不在一個簇中,將所在的兩個簇合并就行:

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

# scoding=utf-8# Agglomerative Hierarchical Clustering(AHC)import pylab as plfrom operator import itemgetterfrom collections import OrderedDict,Counterpoints = [[int(eachpoint.split('#')[0]), int(eachpoint.split('#')[1])] for eachpoint in open("points","r")]# 初始時每個點指派為單獨一簇groups = [idx for idx in range(len(points))]# 計算每個點對之間的距離disP2P = {}for idx1,point1 in enumerate(points):  for idx2,point2 in enumerate(points):    if (idx1 < idx2):      distance = pow(abs(point1[0]-point2[0]),2) + pow(abs(point1[1]-point2[1]),2)      disP2P[str(idx1)+"#"+str(idx2)] = distance# 按距離降序將各個點對排序disP2P = OrderedDict(sorted(disP2P.iteritems(), key=itemgetter(1), reverse=True))# 當前有的簇個數groupNum = len(groups)# 過分合并會帶入噪音點的影響,當簇數減為finalGroupNum時,停止合并finalGroupNum = int(groupNum*0.1)while groupNum > finalGroupNum:  # 選取下一個距離最近的點對  twopoins,distance = disP2P.popitem()  pointA = int(twopoins.split('#')[0])  pointB = int(twopoins.split('#')[1])  pointAGroup = groups[pointA]  pointBGroup = groups[pointB]  # 當前距離最近兩點若不在同一簇中,將點B所在的簇中的所有點合并到點A所在的簇中,此時當前簇數減1  if(pointAGroup != pointBGroup):    for idx in range(len(groups)):      if groups[idx] == pointBGroup:        groups[idx] = pointAGroup    groupNum -= 1# 選取規模最大的3個簇,其他簇歸為噪音點wantGroupNum = 3finalGroup = Counter(groups).most_common(wantGroupNum)finalGroup = [onecount[0] for onecount in finalGroup]dropPoints = [points[idx] for idx in range(len(points)) if groups[idx] not in finalGroup]# 列印規模最大的3個簇中的點group1 = [points[idx] for idx in xrange(len(points)) if groups[idx]==finalGroup[0]]group2 = [points[idx] for idx in xrange(len(points)) if groups[idx]==finalGroup[1]]group3 = [points[idx] for idx in xrange(len(points)) if groups[idx]==finalGroup[2]]pl.plot([eachpoint[0] for eachpoint in group1], [eachpoint[1] for eachpoint in group1], 'or')pl.plot([eachpoint[0] for eachpoint in group2], [eachpoint[1] for eachpoint in group2], 'oy')pl.plot([eachpoint[0] for eachpoint in group3], [eachpoint[1] for eachpoint in group3], 'og')  # 列印噪音點,黑色pl.plot([eachpoint[0] for eachpoint in dropPoints], [eachpoint[1] for eachpoint in dropPoints], 'ok')  pl.show()

運行效果如下:

希望本文所述對大家Python程式設計有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.