agnes聚类matlab,层次聚类算法AGNES及实现

目录

层次聚类分类

自底向上聚合:AGNES

自顶向下分拆

下面介绍AGNES算法。

思路:

先将每个样本看作一个初始聚类簇,在算法运行每一步中找出距离最近的两个聚类簇进行合并,重复该过程,知道达到预设的聚类簇个数。

计算簇间距离:

对于簇

C

i

C_i

Ci​和

C

j

C_j

Cj​,通常有三种距离计算:最小距离(单链接)、最大距离(全链接)、平均距离(均链接)。

最小距离

d

m

i

n

(

C

i

,

C

j

)

=

m

i

n

x

C

i

,

z

C

j

d

i

s

t

(

x

,

z

)

d_{min}(C_i,Cj)=min_{x\in C_i,z\in C_j}dist(x,z)

dmin​(Ci​,Cj)=minx∈Ci​,z∈Cj​​dist(x,z)

最大距离

d

m

a

x

(

C

i

,

C

j

)

=

m

a

x

x

C

i

,

z

C

j

d

i

s

t

(

x

,

z

)

d_{max}(C_i,Cj)=max_{x\in C_i,z\in C_j}dist(x,z)

dmax​(Ci​,Cj)=maxx∈Ci​,z∈Cj​​dist(x,z)

平均距离

d

a

v

g

(

C

i

,

C

j

)

=

1

C

i

C

j

x

C

i

z

C

j

d

i

s

t

(

x

,

z

)

d_{avg}(C_i,C_j)=\frac{1}{|C_i||C_j|}\sum_{x\in C_i}\sum_{z \in C_j}dist(x,z)

davg​(Ci​,Cj​)=∣Ci​∣∣Cj​∣1​x∈Ci​∑​z∈Cj​∑​dist(x,z)

伪代码

(来自西瓜书)

输入:样本集

D

=

{

x

1

,

x

2

.

.

.

x

m

}

D=\{x_1,x_2...x_m\}

D={x1​,x2​...xm​}

聚类簇距离度量函数d

聚类簇个数k

过程:

for j = 1,2,...,m do

C_j = {x_j}

end for

#一开始每个样本分成一个簇

for i = 1,2,...,m do

for j = i+1,...,m do

M(i,j) = d(c_i, c_j)

M(j,i) = M(i,j)

end for

end for

# 初始化簇的距离矩阵

设置当前簇的个数:q = m

while q > k do # 结束条件是达到目标分簇的个数

找出距离最近的两个聚类簇C_i*和C_j*

合并C_i*和C_j*:C_i* = C_j*∪C_i*

for j=j*+1, j*+2,...,q do

将聚类簇C_j重编号为C_j-1

end for

删除距离矩阵M的第j*行和第j*列

for j=1,2,...q-1 do

M(i*,j) = d(C_i*,C_j)

M(j,i*) = M(i*,j)

end for

q = q-1

end while

# 对合并的簇进行簇距离矩阵的更新

代码实现

# 层次聚类

def hac(k, docuSim=docuSim, disMeans = distMin):

m = docuSim.shape[0]

cluster = np.ones(m).reshape(m, 1) # 记录簇的数据结构

M = np.ones(m*m).reshape(m, m) # 簇的距离矩阵初始化

for j in range(m):

cluster[j][0] = j # 初始化 一开始每个样本作为一个簇

print("当前簇的个数是" + str(m))

# print(cluster.T)

for i in range(m):

for j in range(m):

M[i][j] = (docuSim[i][j])

q = m # 初始聚类簇的个数

while q > k:

i, j, minDist = findMin(M) # 找出距离最近的两个簇

# 合并i j 两个簇到i

print("i:"+str(i)+" j"+str(j))

# cluster[j][0] = i

for l in range(m):

if cluster[l][0] == j:

cluster[l][0] = i

for l in range(m): # 将聚类簇重新编号

if cluster[l][0] > j:

cluster[l][0] -= 1

M = np.delete(M, j, axis=0)

M = np.delete(M, j, axis=1) # 删除矩阵的j行和j列

for j in range(q-1): # 重新计算簇i和其他簇的距离

M[i][j] = disMeans(cluster, i, j)

M[j][i] = M[i][j]

cluster = np.array(cluster)

# 计算指标DBI和DI

q = q - 1

# DBI = DBIvalue(cluster, q, m)

# DI = DIvalue(cluster, q, m)

print("当前簇的个数是"+str(q))

clusterList.append(cluster.T)

print("当前的DBI为"+str(DBI)+" DI为" +str(DI))

DBIList.append(DBI)

DIList.append(DI)

return 0

标签:Cj,Ci,...,距离,cluster,算法,聚类,AGNES

来源: https://blog.csdn.net/qq_41750467/article/details/115040346

你可能感兴趣的:(agnes聚类matlab)