凝聚層次聚類:所謂凝聚的,指的是該演算法初始時,將每個點作為乙個簇,每一步合併兩個最接近的簇。另外即使到最後,對於噪音點或是離群點也往往還是各佔一簇的,除非過度合併。對於這裡的「最接近」,有下面三種定義。我在實現是使用了min,該方法在合併時,只要依次取當前最近的點對,如果這個點對當前不在乙個簇中,將所在的兩個簇合併就行:
單鏈(min):定義簇的鄰近度為不同兩個簇的兩個最近的點之間的距離。
全鏈(max):定義簇的鄰近度為不同兩個簇的兩個最遠的點之間的距離。
組平均:定義簇的鄰近度為取自兩個不同簇的所有點對鄰近度的平均值。
# 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")]
# 初始時每個點指派為單獨一簇
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
grou程式設計客棧pnum -= 1
# 選取規模最大的3個簇,其他簇歸為噪音點
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]
# 列印規模最大的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聚類演算法之凝聚層次聚類例項分析
本文位址: /jiaoben/python/135364.html
初識聚類演算法 K均值 凝聚層次聚類和DBSCAN
聚類分析就僅根據在資料中發現的描述物件及其關係的資訊,將資料物件分組 簇 其目標是,組內的物件相互之間是相似的,而不同組中的物件是不同的。組內相似性越大,組間差別越大,聚類就越好。先介紹下聚類的不同型別,通常有以下幾種 1 層次的與劃分的 如果允許簇具有子簇,則我們得到乙個層次聚類。層次聚類是巢狀簇...
初識聚類演算法 K均值 凝聚層次聚類和DBSCAN
聚類分析就僅根據在資料中發現的描述物件及其關係的資訊,將資料物件分組 簇 其目標是,組內的物件相互之間是相似的,而不同組中的物件是不同的。組內相似性越大,組 間差別越大,聚類就越好。先介紹下聚類的不同型別,通常有以下幾種 1 層次的與劃分的 如果允許簇具有子簇,則我們得到乙個層次聚類。層次聚類是巢狀...
聚類演算法 層次聚類演算法
層次聚類演算法 hierarchical clustering method 又稱為系統聚類法 分級聚類法。層次聚類演算法又分為兩種形式 凝聚層次聚類 首先將每個物件作為乙個簇,然後合併這些原子簇為越來越大的簇,直到某個終結條件被滿足。層次聚類 首先將所有物件置於乙個簇中,然後逐漸細分為越來越小的簇...