Python聚類算法之凝聚層次聚類實(shí)例分析
本文實(shí)例講述了Python聚類算法之凝聚層次聚類。分享給大家供大家參考,具體如下:
凝聚層次聚類:所謂凝聚的,指的是該算法初始時,將每個點(diǎn)作為一個簇,每一步合并兩個最接近的簇。另外即使到最后,對于噪音點(diǎn)或是離群點(diǎn)也往往還是各占一簇的,除非過度合并。對于這里的“最接近”,有下面三種定義。我在實(shí)現(xiàn)是使用了MIN,該方法在合并時,只要依次取當(dāng)前最近的點(diǎn)對,如果這個點(diǎn)對當(dāng)前不在一個簇中,將所在的兩個簇合并就行:
單鏈(MIN):定義簇的鄰近度為不同兩個簇的兩個最近的點(diǎn)之間的距離。
全鏈(MAX):定義簇的鄰近度為不同兩個簇的兩個最遠(yuǎn)的點(diǎn)之間的距離。
組平均:定義簇的鄰近度為取自兩個不同簇的所有點(diǎn)對鄰近度的平均值。
# scoding=utf-8 # Agglomerative Hierarchical Clustering(AHC) import pylab as pl from operator import itemgetter from collections import OrderedDict,Counter points = [[int(eachpoint.split('#')[0]), int(eachpoint.split('#')[1])] for eachpoint in open("points","r")] # 初始時每個點(diǎn)指派為單獨(dú)一簇 groups = [idx for idx in range(len(points))] # 計算每個點(diǎn)對之間的距離 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 # 按距離降序?qū)⒏鱾€點(diǎn)對排序 disP2P = OrderedDict(sorted(disP2P.iteritems(), key=itemgetter(1), reverse=True)) # 當(dāng)前有的簇個數(shù) groupNum = len(groups) # 過分合并會帶入噪音點(diǎn)的影響,當(dāng)簇數(shù)減為finalGroupNum時,停止合并 finalGroupNum = int(groupNum*0.1) while groupNum > finalGroupNum: # 選取下一個距離最近的點(diǎn)對 twopoins,distance = disP2P.popitem() pointA = int(twopoins.split('#')[0]) pointB = int(twopoins.split('#')[1]) pointAGroup = groups[pointA] pointBGroup = groups[pointB] # 當(dāng)前距離最近兩點(diǎn)若不在同一簇中,將點(diǎn)B所在的簇中的所有點(diǎn)合并到點(diǎn)A所在的簇中,此時當(dāng)前簇數(shù)減1 if(pointAGroup != pointBGroup): for idx in range(len(groups)): if groups[idx] == pointBGroup: groups[idx] = pointAGroup groupNum -= 1 # 選取規(guī)模最大的3個簇,其他簇歸為噪音點(diǎn) wantGroupNum = 3 finalGroup = 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] # 打印規(guī)模最大的3個簇中的點(diǎn) 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') # 打印噪音點(diǎn),黑色 pl.plot([eachpoint[0] for eachpoint in dropPoints], [eachpoint[1] for eachpoint in dropPoints], 'ok') pl.show()
運(yùn)行效果截圖如下:
希望本文所述對大家Python程序設(shè)計有所幫助。
相關(guān)文章
pandas數(shù)據(jù)處理之繪圖的實(shí)現(xiàn)
這篇文章主要介紹了pandas數(shù)據(jù)處理之繪圖的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06利用python實(shí)現(xiàn)聚類分析K-means算法的詳細(xì)過程
K-means算法是很典型的基于距離的聚類算法,采用距離作為相似性的評價指標(biāo),即認(rèn)為兩個對象的距離越近,其相似度就越大,下面通過本文給大家介紹利用python實(shí)現(xiàn)聚類分析K-means算法的詳細(xì)過程,感興趣的朋友一起看看吧2021-11-11Python實(shí)現(xiàn)隨機(jī)從圖像中獲取多個patch
經(jīng)常有一些圖像任務(wù)需要從一張大圖中截取固定大小的patch來進(jìn)行訓(xùn)練。本文就來和大家聊聊如何用Python實(shí)現(xiàn)隨機(jī)從圖像中獲取多個patch,感興趣的可以了解一下2022-08-08python taipy庫輕松地將數(shù)據(jù)和機(jī)器學(xué)習(xí)模型轉(zhuǎn)為功能性Web應(yīng)用
taipy 是一個開源的 Python 庫,任何具有基本 Python 技能的人都可以使用,對于數(shù)據(jù)科學(xué)家、機(jī)器學(xué)習(xí)工程師和 Python 程序員來說,它是一個方便的工具,借助 Taipy,你可以輕松地將數(shù)據(jù)和機(jī)器學(xué)習(xí)模型轉(zhuǎn)變?yōu)楣δ苄缘?nbsp;Web 應(yīng)用程序2024-01-01matplotlib bar()實(shí)現(xiàn)多組數(shù)據(jù)并列柱狀圖通用簡便創(chuàng)建方法
這篇文章主要介紹了matplotlib bar()實(shí)現(xiàn)多組數(shù)據(jù)并列柱狀圖通用簡便創(chuàng)建方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02利用Python的pandas數(shù)據(jù)處理包將寬表變成窄表
這篇文章主要介紹了利用Python的pandas數(shù)據(jù)處理包將寬表變成窄表,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09