龙空技术网

python层次聚类

每日学Python 152

前言:

此时你们对“层次聚类算法python”大致比较关注,朋友们都想要了解一些“层次聚类算法python”的相关文章。那么小编在网络上网罗了一些有关“层次聚类算法python””的相关内容,希望大家能喜欢,同学们快快来学习一下吧!

昨天讲解了K-mean聚类的原理和实现方法,今天讲解一下层次聚类。在此之前我先给同学们补充一下昨天的K-mean聚类的画图代码,这在今天的密度聚类也同样适应。话不多说直接上代码:(代码中的C为分类结果)

import pylab as plcolValue = ['r', 'y', 'g', 'b', 'c', 'k', 'm']#颜色列表    for i in range(len(C)):        coo_X = []    #x坐标列表        coo_Y = []    #y坐标列表        for j in range(len(C[i])):            coo_X.append(C[i][j][0])            coo_Y.append(C[i][j][1])        pl.scatter(coo_X, coo_Y, marker='x', color=colValue[i%len(colValue)], label=i)pl.legend(loc='right')pl.show()
层次聚类原理

层次聚类和K-mean聚类以及密度聚类都是属于无监督学习的算法。其中K-mean聚类的时间复杂度是最低的,也比较简单、高效。今天所说的层次聚类虽然时间复杂度没有K-mean聚类低但是实现起来却是比较容易的。层次聚类的聚类过程类似于树形态的反向生长过程,自树顶开始到树根位置。层次聚类的基本做法:

准备好需要聚类的数据计算每个数据之间的距离(相似度信息),同样的这里的距离使用欧氏距离。结合相似度较为相近的族,开始聚类时每个数据都是一个独立的族,每进行一次聚类时族类就会减少一半,直到剩下最后一个族位置。当画好层次树形图时就可以选择截断成多少个族了

细心的同学会发现,当族的个数有两个或以上时应该如何计算距离了。这里我给大家介绍三种方法。

采用最近原则的方法,也就是说当族数大于1时采用最近原则,也就是说这两个族间的距离(相似度信息)应该是由两个族间最近的点之间的距离决定的。但是这方法具有一定的局限性。采用最远原则的方法,也就是说当族数大于1时采用最远原则,也就是说这两个族间的距离(相似度信息)应该是由两个族间最远的点之间的距离决定的。同样这方法具有一定的局限性。采用平均值原则,任意两个族之间的个体计算距离。把所有距离相加求平均值,即为两族之间的距离。层次聚类代码

这里我给大家介绍的是采用第一种方法来计算族间距的。这里就不给大家画树状图了。

import mathimport pylab as pl#数据集data = """1,0.697,0.46,2,0.774,0.376,3,0.634,0.264,4,0.608,0.318,5,0.556,0.215,6,0.403,0.237,7,0.481,0.149,8,0.437,0.211,9,0.666,0.091,10,0.243,0.267,11,0.245,0.057,12,0.343,0.099,13,0.639,0.161,14,0.657,0.198,15,0.36,0.37,16,0.593,0.042,17,0.719,0.103,18,0.359,0.188,19,0.339,0.241,20,0.282,0.257,21,0.748,0.232,22,0.714,0.346,23,0.483,0.312,24,0.478,0.437,25,0.525,0.369,26,0.751,0.489,27,0.532,0.472,28,0.473,0.376,29,0.725,0.445,30,0.446,0.459"""a = data.split(',')data_set = [(float(a[i]), float(a[i+1])) for i in range(1, len(a)-1, 3)]def dist(a, b):    return math.sqrt(math.pow(a[0]-b[0], 2)+math.pow(a[1]-b[1], 2))#计算欧式距离def dist_min(Ci, Cj):#获得所有族间距中最小的点    return min(dist(i, j) for i in Ci for j in Cj)#找到距离最小的下标def find_Min(M):    min = 10    x = 0    y = 0    for i in range(len(M)):        for j in range(len(M[i])):            if i != j and M[i][j] < min:                min = M[i][j]                x = i                y = j    return (x, y, min)#算法模型:def AGNES(data_set, di, k):#数据,距离,个数    #初始化C--族数,M--距离    C = []    M = []    for i in dataset:        Ci = []        Ci.append(i)        C.append(Ci)    for i in C:        Mi = []        for j in C:            Mi.append(di(i, j))#取得两点之间的最小欧式距离        M.append(Mi)    q = len(dataset)    #更新    while q > k:        x, y, min = find_Min(M)        print(x,y,min)        C[x].extend(C[y])        C.remove(C[y])        M = []        for i in C:            Mi = []            for j in C:                Mi.append(di(i, j))            M.append(Mi)        q -= 1    return Cif __name__="__main__":	  C = AGNES(data_set, dist_min, 5)#设置族数为5

以下画图可以用k-mean聚类画图代码绘画处理。

每日日语:

数字的读法:

0

1

2

3

4

ゼロ

いち

さん

よん

5

6

7

8

9

ろく

しち

はち

きゆう

标签: #层次聚类算法python