Python聚類算法之凝聚層次聚類實(shí)例分析
本文實(shí)例講述了Python聚類算法之凝聚層次聚類。分享給大家供大家參考,具體如下:
凝聚層次聚類:所謂凝聚的,指的是該算法初始時(shí),將每個(gè)點(diǎn)作為一個(gè)簇,每一步合并兩個(gè)最接近的簇。另外即使到最后,對(duì)于噪音點(diǎn)或是離群點(diǎn)也往往還是各占一簇的,除非過(guò)度合并。對(duì)于這里的“最接近”,有下面三種定義。我在實(shí)現(xiàn)是使用了MIN,該方法在合并時(shí),只要依次取當(dāng)前最近的點(diǎn)對(duì),如果這個(gè)點(diǎn)對(duì)當(dāng)前不在一個(gè)簇中,將所在的兩個(gè)簇合并就行:
單鏈(MIN):定義簇的鄰近度為不同兩個(gè)簇的兩個(gè)最近的點(diǎn)之間的距離。
全鏈(MAX):定義簇的鄰近度為不同兩個(gè)簇的兩個(gè)最遠(yuǎn)的點(diǎn)之間的距離。
組平均:定義簇的鄰近度為取自兩個(gè)不同簇的所有點(diǎn)對(duì)鄰近度的平均值。
# 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")]
# 初始時(shí)每個(gè)點(diǎn)指派為單獨(dú)一簇
groups = [idx for idx in range(len(points))]
# 計(jì)算每個(gè)點(diǎn)對(duì)之間的距離
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ū)⒏鱾€(gè)點(diǎn)對(duì)排序
disP2P = OrderedDict(sorted(disP2P.iteritems(), key=itemgetter(1), reverse=True))
# 當(dāng)前有的簇個(gè)數(shù)
groupNum = len(groups)
# 過(guò)分合并會(huì)帶入噪音點(diǎn)的影響,當(dāng)簇?cái)?shù)減為finalGroupNum時(shí),停止合并
finalGroupNum = int(groupNum*0.1)
while groupNum > finalGroupNum:
# 選取下一個(gè)距離最近的點(diǎn)對(duì)
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所在的簇中,此時(shí)當(dāng)前簇?cái)?shù)減1
if(pointAGroup != pointBGroup):
for idx in range(len(groups)):
if groups[idx] == pointBGroup:
groups[idx] = pointAGroup
groupNum -= 1
# 選取規(guī)模最大的3個(gè)簇,其他簇歸為噪音點(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個(gè)簇中的點(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)行效果截圖如下:

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
詳解python3中用HTMLTestRunner.py報(bào)ImportError: No module named ''
這篇文章主要介紹了詳解python3中用HTMLTestRunner.py報(bào)ImportError: No module named 'StringIO'如何解決,感興趣的可以了解一下2019-08-08
Python腳本/代碼的幾種常見(jiàn)運(yùn)行方式
我們知道,python腳本或者說(shuō)python程序其實(shí)是一個(gè)包含了python代碼的文件,通過(guò)運(yùn)行python代碼,我們可以驗(yàn)證腳本/程序是否按照我們的期望執(zhí)行,在python中,有多種方式來(lái)運(yùn)行腳本或程序,取決于小伙伴們的需求,接下來(lái)小編將介紹幾種常見(jiàn)的 python 代碼運(yùn)行方式2023-10-10
Python中Cryptography庫(kù)實(shí)現(xiàn)加密解密
Python中Cryptography庫(kù)給你的文件加把安全鎖,本文主要介紹了Python中Cryptography庫(kù)實(shí)現(xiàn)加密解密,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02
python2.7讀取文件夾下所有文件名稱及內(nèi)容的方法
python,本身來(lái)說(shuō)是一門(mén)高級(jí)編程語(yǔ)言,python它入門(mén)簡(jiǎn)單,有基礎(chǔ)的學(xué)起來(lái)很快就能有簡(jiǎn)單的應(yīng)用,但是在非常高的抽象計(jì)算中,高級(jí)的python程序設(shè)計(jì)也是非常難學(xué)的。接下來(lái)給大家介紹python2.7讀取文件夾下所有文件名稱及內(nèi)容的方法,一起看看吧2018-02-02
pycharm下配置pyqt5的教程(anaconda虛擬環(huán)境下+tensorflow)
這篇文章主要介紹了pycharm下配置pyqt5的教程(anaconda虛擬環(huán)境下+tensorflow),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
python單線程下實(shí)現(xiàn)多個(gè)socket并發(fā)過(guò)程詳解
這篇文章主要介紹了python單線程下實(shí)現(xiàn)多個(gè)socket并發(fā)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
python實(shí)現(xiàn)音樂(lè)播放和下載小程序功能
這篇文章主要介紹了python實(shí)現(xiàn)音樂(lè)播放和下載小程序功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
PyCharm安裝庫(kù)numpy失敗問(wèn)題的詳細(xì)解決方法
今天使用pycharm編譯python程序時(shí),由于要調(diào)用numpy包,但又未曾安裝numpy,于是就根據(jù)pycharm的提示進(jìn)行安裝,最后竟然提示出錯(cuò),下面這篇文章主要給大家介紹了關(guān)于PyCharm安裝庫(kù)numpy失敗問(wèn)題的詳細(xì)解決方法,需要的朋友可以參考下2022-06-06

