📅  最后修改于: 2023-12-03 15:11:01.845000             🧑  作者: Mango
在聚类分析中,链接类型是指文档或数据点之间的距离如何被计算以及如何在聚类过程中被组合。毫升(single-link)是一种链接类型,也被称为最小距离链接(minimum distance linkage)或最短距离链接(shortest distance linkage)。
在毫升聚类中,两个簇之间的距离等于它们中最近的两个点之间的距离。这种链接类型通常被看作是一种有效的方式来识别簇内紧密聚集的数据点。
以下是使用Python实现的示例代码:
def single_linkage(distances):
# 初始化簇列表
clusters = [[i] for i in range(len(distances))]
# 计算两两簇之间的距离
cluster_distances = {}
for i in range(len(clusters)):
for j in range(i+1, len(clusters)):
cluster_distances[(i,j)] = min(distances[i][k] + distances[j][k] for k in clusters[i] + clusters[j])
cluster_distances[(j,i)] = cluster_distances[(i,j)]
# 形成簇之间的合并序列
linkage = []
while len(clusters) > 1:
# 找到距离最近的两个簇
min_distance = float('inf')
for i in range(len(clusters)):
for j in range(i+1, len(clusters)):
if cluster_distances[(i,j)] < min_distance:
min_distance = cluster_distances[(i,j)]
merge_clusters = (i,j)
# 合并簇
clusters.append(clusters[merge_clusters[0]] + clusters[merge_clusters[1]])
linkage.append(merge_clusters)
# 更新距离字典
for i in range(len(clusters)-1):
if i not in merge_clusters:
new_distance = min(cluster_distances[(merge_clusters[0], i)], cluster_distances[(merge_clusters[1], i)])
cluster_distances[(len(clusters)-1, i)] = new_distance
cluster_distances[(i, len(clusters)-1)] = new_distance
# 删除已合并的簇
clusters = [c for idx, c in enumerate(clusters) if idx not in merge_clusters]
return linkage
以下是一个数据点的示例和使用毫升聚类计算的簇:
数据点:
[(2,10), (2,5), (8,4), (5,8), (7,5), (6,4), (1,2), (4,9)]
使用欧几里得距离计算两点之间的距离:
def euclidean_distance(a, b):
return ((a[0]-b[0])**2 + (a[1]-b[1])**2)**0.5
distances = [[euclidean_distance(a,b) for b in data] for a in data]
使用毫升聚类算法:
linkage = single_linkage(distances)
得到的簇:
[[6], [0, 1], [5], [4, 2, 3, 7]]
其中,数据点0和1被聚集在一起,它们之间的距离为2.24,这是所有簇中最小的距离。而簇3中的4、2、3、7这四个点聚集在一起,它们之间的距离为3.61,这是所有簇中最大的距离。
毫升聚类是一种有效的聚类算法,可以用于识别簇内紧密聚集的数据点。然而,它容易受到异常值的影响,因此在使用时需要注意数据的预处理。