国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

Python聚類算法之凝聚層次聚類實(shí)例分析

2019-11-25 17:01:37
字體:
供稿:網(wǎng)友

本文實(shí)例講述了Python聚類算法之凝聚層次聚類。分享給大家供大家參考,具體如下:

凝聚層次聚類:所謂凝聚的,指的是該算法初始時(shí),將每個(gè)點(diǎn)作為一個(gè)簇,每一步合并兩個(gè)最接近的簇。另外即使到最后,對(duì)于噪音點(diǎn)或是離群點(diǎn)也往往還是各占一簇的,除非過度合并。對(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 plfrom operator import itemgetterfrom collections import OrderedDict,Counterpoints = [[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)# 過分合并會(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 = 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]# 打印規(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ì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 浦北县| 车险| 思茅市| 叶城县| 淮安市| 张家港市| 修武县| 泰来县| 巴里| 和顺县| 彝良县| 三都| 阳春市| 科技| 积石山| 舒兰市| 平山县| 鄂尔多斯市| 富川| 隆安县| 蒙山县| 屏边| 新余市| 七台河市| 阳春市| 东莞市| 花莲市| 兴安县| 东兰县| 比如县| 巴楚县| 江川县| 当雄县| 施秉县| 泾阳县| 靖宇县| 泗水县| 牟定县| 衡水市| 广元市| 武清区|