Python聚類演算法之凝聚層次聚類例項分析

2022-10-04 06:18:12 字數 2830 閱讀 9443

凝聚層次聚類:所謂凝聚的,指的是該演算法初始時,將每個點作為乙個簇,每一步合併兩個最接近的簇。另外即使到最後,對於噪音點或是離群點也往往還是各佔一簇的,除非過度合併。對於這裡的「最接近」,有下面三種定義。我在實現是使用了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 又稱為系統聚類法 分級聚類法。層次聚類演算法又分為兩種形式 凝聚層次聚類 首先將每個物件作為乙個簇,然後合併這些原子簇為越來越大的簇,直到某個終結條件被滿足。層次聚類 首先將所有物件置於乙個簇中,然後逐漸細分為越來越小的簇...