聚类层次【python,机器学习,算法】

打印 上一主题 下一主题

主题 577|帖子 577|积分 1731

层次聚类算法(Hierarchical Clustering Algorithm)是一种常用的无监视学习算法,用于将数据集分别成多个不同层次的簇。与K均值聚类不同,层次聚类不需要预先指定聚类数量,而是通过计算样本之间的相似度或距离来构建一个层次结构。
聚集层次算法有两种方式:

  • 自下而上的合并(Agglomerate),其紧张步骤如下:

    • 将每个数据点视为单个聚集。因此,开始时我们将拥有 n 个聚集。开始时,数据点的数量也将为 n。
    • 计算 n 个集群之间的距离,计算距离的方法通常有以下几种:

      • 对于两个集群,取集群之间距离最近的两个样本点作为集群的距离。
      • 对于两个集群,取集群之间距离最远的两个样本点作为集群的距离。
      • 对于两个集群,分别计算两个集群内样本点的匀称距离,然后计算这两个匀称距离之间的距离。

    • 找出距离最近的两个集群,举行合并。
    • 通过以上三步,可以将样本点聚集想要的 K 个集群。
      下面是一个该算法的 Python 实现:
    1. import matplotlib.pyplot as plt
    2. import numpy as np
    3. # 设置了随机数种子,让随机数生成变得可重复,即在设置过后,每次运行代码得到的随机数都是一样的。
    4. np.random.seed(0)
    5. cluster1 = np.random.randn(30, 2) + np.array([0, 7])
    6. cluster2 = np.random.randn(30, 2) + np.array([8, 0])
    7. cluster3 = np.random.randn(30, 2) + np.array([8, 8])
    8. # 用于沿着垂直方向(行方向)堆叠数组,得到一个总的数据集
    9. data = np.vstack([cluster1, cluster2, cluster3])
    10. # 1. 初始化每个数据点为一个独立的簇
    11. def initialize_clusters(data):
    12.     return [[point] for point in data]
    13. # 2. 计算簇中心之间的距离
    14. def compute_distances(clusters):
    15.     distances = np.zeros((len(clusters), len(clusters)))
    16.     for i in range(len(clusters)):
    17.         for j in range(len(clusters)):
    18.             if i != j:
    19.                 # 使用欧式距离计算两个簇的距离
    20.                 distances[i][j] = np.sqrt(sum((np.mean(clusters[i],
    21.                                                        axis=0) - np.mean(
    22.                     clusters[j], axis=0)) ** 2))
    23.     return distances
    24. # 找距离最近的两个簇
    25. def find_closest_clusters(distances):
    26.     min_distance = np.inf
    27.     # 用于保存最近两个簇对应的索引
    28.     closest_clusters = None
    29.     for i in range(len(distances)):
    30.         for j in range(len(distances)):
    31.             if i != j and distances[i][j] < min_distance:
    32.                 min_distance = distances[i][j]
    33.                 closest_clusters = i, j
    34.     return closest_clusters
    35. # 3. 合并最近的两个簇为一个新的簇,并更新簇中心点
    36. def merge_clusters(clusters, closest_clusters):
    37.     i, j = closest_clusters
    38.     merged_cluster = clusters[i] + clusters[j]  # 将最近的两个簇更新为一个簇
    39.     new_clusters = [cluster for idx, cluster in enumerate(clusters) if
    40.                     idx not in (i, j)]
    41.     # 这里将没有合并的簇放进新的簇列表里面
    42.     new_clusters.append(merged_cluster)
    43.     return new_clusters
    44. def hierarchical_clustering(data, k):
    45.     # 初始化每个数据点为一个独立的簇
    46.     clusters = initialize_clusters(data)
    47.     # 开始迭代合并最相似的簇
    48.     while len(clusters) > k:
    49.         # 计算簇中心之间的距离,并找到最近的两个簇
    50.         distances = compute_distances(clusters)
    51.         closest_clusters = find_closest_clusters(distances)
    52.         # 合并最近的两个簇为一个新的簇,并更新簇中心点
    53.         clusters = merge_clusters(clusters, closest_clusters)
    54.     return clusters
    55. # 执行层次聚类算法
    56. k = 4
    57. clusters = hierarchical_clustering(data, k)
    58. # 打印聚类结果
    59. for idx, cluster in enumerate(clusters):
    60.     print(f"Cluster {idx + 1}: ", cluster)
    61. # 绘制聚类结果的图表
    62. plt.figure(figsize=(8, 6))
    63. colors = ["red", "green", "blue", "yellow"]
    64. for i in range(k):
    65.     for p in clusters[i]:
    66.         plt.scatter(x=p[0], y=p[1], color=colors[i])
    67. plt.xlabel("X")
    68. plt.ylabel("Y")
    69. plt.title("Hierarchical Clustering")
    70. plt.show()
    复制代码

  • 自上而下的分解(Divisive)。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表