🎩 欢迎来到技术探索的奇幻世界👨💻
📜 个人主页:@一伦明悦-CSDN博客
✍🏻 作者简介: C++软件开发、Python机器学习爱好者
🗣️ 互动与支持:💬评论 👍🏻点赞 📂收藏 👀关注+
如果文章有所帮助,欢迎留下您宝贵的评论,
点赞加收藏支持我,点击关注,一起进步!
引言
Scikit-Learn工具包提供了多种聚类算法,涵盖了不同的聚类方法和应用场景。下面将对聚集聚类、归纳聚类、光学聚类算法进行简要介绍,并对BIRCH和MiniBatchKMeans进行比较分析。
聚集聚类(Agglomerative Clustering)
聚集聚类是一种基于层次的聚类方法,它通过迭代地将最为相似的样本或聚类合并来构建聚类的层次结构。具体步骤包括:
- 初始阶段:每个样本被视为一个单独的聚类。
- 迭代合并:根据某种相似性度量(如欧氏距离),合并最为相似的两个聚类,直到满足停止条件。
Scikit-Learn中的实现为
AgglomerativeClustering
,支持不同的链接类型(如单链接、完全链接、平均链接)和距离计算方法。归纳聚类(DBSCAN)
归纳聚类(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,它能够发现任意形状的聚类,并能处理噪声点。主要特点包括:
- 核心对象:周围存在足够密度的点被视为核心对象。
- 直接密度可达:如果一个点可以通过核心对象的邻域达到另一个点,则认为它们在同一聚类中。
在Scikit-Learn中,
DBSCAN
是其实现,通过eps
参数定义邻域大小,min_samples
参数定义核心对象所需的最小样本数。光学聚类(Optics)
光学聚类是另一种基于密度的聚类算法,与DBSCAN相似但提供了更大的灵活性,能够捕捉不同密度级别的聚类结构。主要特点包括:
- 核心距离:类似于DBSCAN中的eps,定义了核心对象的邻域大小。
- 最小样本数:定义形成聚类所需的最小核心对象数。
光学聚类能够生成聚类的层次结构,通过
OPTICS
类实现。BIRCH和MiniBatchKMeans的比较分析
BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies) 和 MiniBatchKMeans 是两种不同的聚类算法,适用于大规模数据集的聚类任务。
BIRCH:
- 特点:基于层次的聚类算法,通过聚类特征树(CF树)和层次的聚类结构有效处理大规模数据。
- 优点:对大型数据集的处理效率高,能够在内存受限的情况下进行聚类。
- 适用场景:适合于需要处理大量数据并且对聚类速度有较高要求的场景。
MiniBatchKMeans:
- 特点:是K均值聚类的一种变体,通过随机小批量(mini-batch)数据来更新聚类中心,从而加快收敛速度。
- 优点:适合大规模数据集,尤其是在内存和计算资源有限的情况下能够快速进行聚类。
- 适用场景:处理大规模数据并且要求较快的聚类速度时特别有效。
正文
01-不同度量的聚集聚类
聚集聚类是一种基于层次的聚类方法,它从每个样本开始,逐步合并具有最小距离的一对聚类,直到达到预先指定的聚类数量或达到某个停止条件。在这段代码中,使用的是凝聚层次聚类(Agglomerative Clustering),其中的不同度量通常包括以下几种:
Ward Linkage:
Ward Linkage 是一种聚合准则,它选择合并两个聚类的标准是最小化合并后聚类的总内方差增加。这种方法在实践中通常表现良好,特别是对于球状簇的数据。Complete Linkage:
Complete Linkage 选择合并两个聚类的标准是两个聚类中最远距离的样本之间的距离。这种方法更倾向于形成大小相等且密集的聚类。Single Linkage:
Single Linkage 选择合并两个聚类的标准是两个聚类中最近距离的样本之间的距离。这种方法可能会形成长条状的聚类,对噪声和离群点敏感。Average Linkage:
Average Linkage 选择合并两个聚类的标准是两个聚类中所有样本之间的平均距离。这种方法在大多数情况下都能产生较好的聚类效果。在代码中,使用的是 Ward Linkage,它是 Agglomerative Clustering 默认的聚合准则。这种聚类方法在第一个子图中展示了数据的聚类结果,其中不同颜色代表不同的聚类簇。
这段代码展示了如何使用Python中的scikit-learn库进行凝聚层次聚类(Agglomerative Clustering)以及可视化聚类结果和距离矩阵。让我们逐步解释每个部分的功能和意图:
数据生成
# Generate waveform data
n_features = 2000
t = np.pi * np.linspace(0, 1, n_features)
def sqr(x):
return np.sign(np.cos(x))
X = list()
y = list()
for i, (phi, a) in enumerate([(.5, .15), (.5, .6), (.3, .2)]):
for _ in range(30):
phase_noise = .01 * np.random.normal()
amplitude_noise = .04 * np.random.normal()
additional_noise = 1 - 2 * np.random.rand(n_features)
additional_noise[np.abs(additional_noise) < .997] = 0
X.append(12 * ((a + amplitude_noise)
* (sqr(6 * (t + phi + phase_noise)))
+ additional_noise))
y.append(i)
X = np.array(X)
y = np.array(y)
- 这部分代码生成了包含三种波形的合成数据。每种波形重复生成30次,每次添加不同的噪声,最终得到包含三种波形数据的X和对应的标签y。
可视化 Ground Truth
plt.figure()
plt.axes([0, 0, 1, 1])
for l, c, n in zip(range(n_clusters), 'rgb',
labels):
lines = plt.plot(X[y == l].T, c=c, alpha=.5)
lines[0].set_label(n)
plt.legend(loc='best')
plt.axis('tight')
plt.axis('off')
plt.suptitle("Ground truth", size=20)
plt.savefig("../3.png", dpi=500)
- 这部分代码绘制了数据的地面真实标签(Ground Truth),显示了每个波形的数据示例。每种波形用不同颜色表示,有助于理解数据的分布和真实标签。
距离矩阵的可视化
for index, metric in enumerate(["cosine", "euclidean", "cityblock"]):
avg_dist = np.zeros((n_clusters, n_clusters))
plt.figure(figsize=(5, 4.5))
for i in range(n_clusters):
for j in range(n_clusters):
avg_dist[i, j] = pairwise_distances(X[y == i], X[y == j],
metric=metric).mean()
avg_dist /= avg_dist.max()
for i in range(n_clusters):
for j in range(n_clusters