目录
层次聚类分类
自底向上聚合: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∈Cjdist(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∈Cjdist(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∣1x∈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