📜  毫升 |层次聚类(凝聚和分裂聚类)(1)

📅  最后修改于: 2023-12-03 15:40:40.809000             🧑  作者: Mango

层次聚类(凝聚和分裂聚类)和毫升

层次聚类是一种将数据点聚类成树状结构的方法。它有两种类型:凝聚聚类和分裂聚类。凝聚聚类是从每个数据点开始,将最近的两个点合并,直到所有点都被合并成一个聚类为止。分裂聚类则是从一个大聚类开始,将其分成两个子聚类,直到每个聚类最终只包含一个数据点。

毫升是一个常见的计量单位,通常用来测量液体的体积。

下面我们将介绍如何使用层次聚类来将一组数据点聚类,并返回每个聚类的平均毫升值。

准备数据

首先我们需要准备一组数据,这里我们使用随机生成的50个数据点:

import numpy as np

np.random.seed(0)
X = np.random.randn(50, 2)
凝聚聚类

使用scikit-learn中的AgglomerativeClustering算法进行凝聚聚类:

from sklearn.cluster import AgglomerativeClustering

agg = AgglomerativeClustering(n_clusters=None, distance_threshold=0).fit(X)

其中n_clusters=None表示我们不知道聚类的数量,而是将所有数据点合并成一个聚类,distance_threshold=0表示我们希望聚类中心之间的距离为0,即聚类中心之间的距离越小,聚类粒度就越小。可以根据需要调整这些参数。

在完成聚类之后,我们可以通过以下代码将每个聚类中的数据点按其坐标进行平均值计算,然后计算平均毫升值:

cluster_centers = []
for i in range(agg.n_clusters_):
    cluster_points = X[agg.labels_ == i]
    cluster_center = np.mean(cluster_points, axis=0)
    cluster_centers.append(cluster_center)

average_milliliters = []
for cluster_center in cluster_centers:
    average_milliliters.append(sum(cluster_center) / 2)

这里我们将每个聚类中心的x坐标和y坐标相加,然后除以2,得到了该聚类的平均毫升值。下面是完整的凝聚聚类代码示例:

import numpy as np
from sklearn.cluster import AgglomerativeClustering

np.random.seed(0)
X = np.random.randn(50, 2)

agg = AgglomerativeClustering(n_clusters=None, distance_threshold=0).fit(X)

cluster_centers = []
for i in range(agg.n_clusters_):
    cluster_points = X[agg.labels_ == i]
    cluster_center = np.mean(cluster_points, axis=0)
    cluster_centers.append(cluster_center)

average_milliliters = []
for cluster_center in cluster_centers:
    average_milliliters.append(sum(cluster_center) / 2)

print("聚类个数:", agg.n_clusters_)
print("每个聚类的平均毫升值:", average_milliliters)
分裂聚类

使用scikit-learn中的Birch算法进行分裂聚类:

from sklearn.cluster import Birch

brc = Birch(n_clusters=None, threshold=1.5).fit(X)

其中n_clusters=None表示我们不知道聚类的数量,而是设置为None,让算法自行确定聚类个数,threshold=1.5表示我们希望聚类中心之间的距离为1.5。可以根据需要调整这些参数。

在完成聚类之后,我们可以通过以下代码将每个聚类中所有数据点的x坐标和y坐标相加,然后除以2,得到了该聚类的平均毫升值:

cluster_centers = []
for i in range(brc.subcluster_labels_.max()+1):
    cluster_points = X[brc.subcluster_labels_ == i]
    cluster_center = np.mean(cluster_points, axis=0)
    cluster_centers.append(cluster_center)

average_milliliters = []
for cluster_center in cluster_centers:
    average_milliliters.append(sum(cluster_center) / 2)

这里我们将每个聚类中心的x坐标和y坐标相加,然后除以2,得到了该聚类的平均毫升值。下面是完整的分裂聚类代码示例:

import numpy as np
from sklearn.cluster import Birch

np.random.seed(0)
X = np.random.randn(50, 2)

brc = Birch(n_clusters=None, threshold=1.5).fit(X)

cluster_centers = []
for i in range(brc.subcluster_labels_.max()+1):
    cluster_points = X[brc.subcluster_labels_ == i]
    cluster_center = np.mean(cluster_points, axis=0)
    cluster_centers.append(cluster_center)

average_milliliters = []
for cluster_center in cluster_centers:
    average_milliliters.append(sum(cluster_center) / 2)

print("聚类个数:", len(cluster_centers))
print("每个聚类的平均毫升值:", average_milliliters)
总结

本文介绍了如何使用层次聚类将一组数据点聚类,并返回每个聚类的平均毫升值。凝聚聚类和分裂聚类都是常见的聚类算法。层次聚类中,通过调整聚类中心之间的距离阈值,可以控制聚类的粒度。