【机器学习聚类算法实战-5】机器学习聚类算法之DBSCAN聚类、K均值聚类算法、分层聚类和不同度量的聚集聚类实例分析

34889d2e7fec4a02bb0ae3a22b011a2a.png

🎩 欢迎来到技术探索的奇幻世界👨‍💻

📜 个人主页:@一伦明悦-CSDN博客

✍🏻 作者简介: C++软件开发、Python机器学习爱好者

🗣️ 互动与支持💬评论      👍🏻点赞      📂收藏     👀关注+

如果文章有所帮助,欢迎留下您宝贵的评论,

点赞加收藏支持我,点击关注,一起进步!

目录

前言    

正文

01- DBSCAN聚类算法简介    

02- 基于K均值的颜色量化实战    

03- 分层聚类:结构化区域与非结构化区域    

04- 不同度量的聚集聚类实战    

总结


前言    

          DBSCAN(Density-Based Spatial Clustering of Applications with Noise)聚类算法是一种基于密度的聚类算法,能够有效地发现任意形状的聚类,并能够处理噪声数据。该算法通过定义特定半径内的数据点数量来构建具有足够密度的聚类,并将稀疏区域或孤立点识别为噪声。DBSCAN算法的优势在于无需指定聚类数目,适用于各种数据形状和大小的数据集。

        K均值聚类算法是一种基于距离的聚类算法,将数据点分为K个簇以最小化每个簇内数据点到簇中心的距离平方和。该算法需要提前指定簇的数量K,并通过随机初始化簇中心和迭代更新样本的簇分配来进行聚类。K均值聚类算法的优势在于简单易理解、实现方便,但对初始质心敏感,且对异常值敏感。

        分层聚类是一种层次化的聚类方法,根据数据间的相似性逐步合并聚类簇,形成一个完整的聚类层次结构。分层聚类方法包括凝聚聚类(agglomerative clustering)和分裂聚类(divisive clustering)两种主要策略。凝聚聚类从单个样本开始,逐步合并最相似的聚类,形成一个树状结构;分裂聚类则从一个包含所有样本的聚类开始,逐步分裂为子聚类。分层聚类的优势在于可以同时得到不同层次的聚类结果,帮助分析数据的聚类结构。

        不同度量的聚集实例分析包括了选择不同的距离度量或相似性度量来计算数据点之间的距离,并应用于聚类算法中。常用的距离度量包括欧氏距离、曼哈顿距离、余弦相似度等,不同的度量方式会影响聚类结果的质量和形状。选择合适的度量方式对于聚类算法的效果至关重要,需要根据具体数据的特点和问题需求进行选择。例如,在处理图像数据时,可以选择使用像素之间的欧氏距离;在自然语言处理领域,可以选择余弦相似度度量文本之间的相似性。通过实例分析不同度量方式在聚类任务中的应用,可以更好地理解数据间的相似性和差异性,提高聚类算法的效果和准确性。

正文

01- DBSCAN聚类算法简介    

          DBSCAN(Density-Based Spatial Clustering of Applications with Noise)聚类算法是一种基于密度的聚类算法,能够有效地发现任意形状的聚类,并可以处理噪声数据。下面是对DBSCAN聚类算法的详细分析,包括原理和步骤:

        原理分析:

        DBSCAN算法基于以下两个重要概念来实现聚类:

         核心对象(Core Point):如果一个数据点的邻域内至少包含指定数量的数据点(MinPts),则该点被认为是核心对象。

         直接密度可达(Directly Density Reachable):如果一个数据点在另一个数据点的邻域内,且另一个数据点是核心对象,则该数据点通过核心对象直接密度可达。        

        基于以上概念,DBSCAN算法将数据点分为三种类型:        

        核心对象:在其邻域内至少包含 MinPts 个数据点的数据点。

        边界点:不是核心对象,但位于核心对象的邻域内。

        噪声点(Noise Point):既不是核心对象,也不是边界点。

        步骤分析:

        参数设置:设定两个参数,eps 表示邻域的半径,MinPts 表示一个核心对象所需的最少数据点个数。

        核心对象识别:对数据集中的每个数据点进行遍历,计算其邻域内的数据点数目,标记核心对象。(核心对象满足在其邻域内至少包含 MinPts 个数据点)

        聚类扩展:从任意未访问的核心对象开始,探索其直接密度可达的数据点进行连接并形成一个聚类。若边界点位于多个核心对象的邻域内,则将其分配给其中一个核心对象的聚类

        噪声点处理:将未分配到任何聚类的噪声点处理为离群点。

        算法特点:

        自动确定聚类数目:无需事先指定聚类数目,只需设定邻域半径 eps 和最小数据点数 MinPts

        适用于任意形状的簇:DBSCAN能够有效地捕捉数据中的任意形状的聚类。

        对噪声数据鲁棒:能够将孤立点或噪声数据识别为离群点,不会干扰聚类过程。

        高效性:相对于K均值等算法,DBSCAN在处理大规模数据集时更为高效。

        下面给出具体代码分析应用过程: 这段代码演示了如何使用DBSCAN算法对生成的样本数据进行聚类,并对聚类结果进行评估和可视化。

  1. 首先,使用 make_blobs 生成了三个簇的样本数据,并进行了标准化处理。
  2. 然后,通过 DBSCAN 对标准化后的数据进行聚类,设置了 eps=0.3 和 min_samples=10 作为参数。
  3. 计算了聚类结果中的核心样本点,并对每个样本点进行了标记。
  4. 使用不同的评估指标(如均匀性、完整性、V-measure 等)评估了聚类结果的质量。
  5. 最后,通过可视化展示了聚类结果。将核心点和边界点以不同的大小和颜色进行绘制,用黑色表示噪声点。
import numpy as npfrom sklearn.cluster import DBSCAN
from sklearn import metrics
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler# #############################################################################
# Generate sample data
centers = [[1, 1], [-1, -1], [1, -1]]
X, labels_true = make_blobs(n_samples=750, centers=centers, cluster_std=0.4,random_state=0)X = StandardScaler().fit_transform(X)# #############################################################################
# Compute DBSCAN
db = DBSCAN(eps=0.3, min_samples=10).fit(X)
core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True
labels = db.labels_# Number of clusters in labels, ignoring noise if present.
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
n_noise_ = list(labels).count(-1)print('Estimated number of clusters: %d' % n_clusters_)
print('Estimated number of noise points: %d' % n_noise_)
print("Homogeneity: %0.3f" % metrics.homogeneity_score(labels_true, labels))
print("Completeness: %0.3f" % metrics.completeness_score(labels_true, labels))
print("V-measure: %0.3f" % metrics.v_measure_score(labels_true, labels))
print("Adjusted Rand Index: %0.3f"% metrics.adjusted_rand_score(labels_true, labels))
print("Adjusted Mutual Information: %0.3f"% metrics.adjusted_mutual_info_score(labels_true, labels))
print("Silhouette Coefficient: %0.3f"% metrics.silhouette_score(X, labels))# #############################################################################
# Plot result
import matplotlib.pyplot as plt# Black removed and is used for noise instead.
unique_labels = set(labels)
colors = [plt.cm.Spectral(each)for each in np.linspace(0, 1, len(unique_labels))]
for k, col in zip(unique_labels, colors):if k == -1:# Black used for noise.col = [0, 0, 0, 1]class_member_mask = (labels == k)xy = X[class_member_mask & core_samples_mask]plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),markeredgecolor='k', markersize=14)xy = X[class_member_mask & ~core_samples_mask]plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),markeredgecolor='k', markersize=6)plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.savefig("../5.png", dpi=500)

        实例运行结果如下图所示:

  • 图中不同颜色的点表示不同的聚类簇,同一簇内的点颜色相同。
  • 大点表示核心样本点,小点表示边界点。
  • 黑色的点表示噪声点,即未分配到任何簇的样本点。
  • 图像中心的聚类簇密集程度较高,周围的样本点则较为分散,符合DBSCAN对于密度聚类的特点。
  • 通过图像可以直观地观察到聚类结果,评估聚类算法的性能和有效性。

7ec14c8bf5ff413187d9fea870f972b1.png

02- 基于K均值的颜色量化实战    

         基于K均值的颜色量化是一种常用的图像处理技术,可以将一幅彩色图像中的颜色数量减少,从而减小图像的尺寸,降低存储和处理的复杂度。下面是对基于K均值的颜色量化的详细分析:

        原理分析:

  1. 数据准备:将彩色图像中的每个像素看作是一个三维向量,表示红、绿、蓝(RGB)分量的取值。数据准备阶段即将图像中的所有像素点按照RGB值组织成一个数据集。
  2. K均值算法:将数据集中的像素点以RGB向量的形式聚类成K个簇,使得每个像素点被分配到与之最近的簇中心,从而实现颜色压缩。
  3. 迭代优化:迭代地更新簇中心,直至达到收敛条件(如中心点不再变化、迭代次数达到上限等)。
  4. 颜色替换:将每个簇的颜色替换为该簇内所有像素点的平均颜色值。

        实现步骤:

  1. 初始化:随机选择K个像素点作为初始的簇中心。
  2. 簇分配:计算每个像素点与各个簇中心的距离,将其分配到最近的簇中心。
  3. 更新中心:更新每个簇中心为该簇内所有像素点的平均值。
  4. 迭代:重复步骤2和3直至满足终止条件。
  5. 颜色替代:将每个像素点的颜色替换为其所属簇的簇中心颜色。

        算法特点:

  • 简单高效:K均值算法实现简单,易于理解和实现。
  • 需预先确定K值:K均值算法需要事先确定聚类的数量K,不同的K值可能导致不同的聚类结果。
  • 对初始化敏感:簇中心的初始化对最终结果有较大影响,可能会陷入局部最优解。
  • 适用性广泛:K均值算法在颜色量化等应用领域效果较好,但对于异性方差较大的数据不太适用。

        应用领域:

  • 图像压缩:通过减少颜色数量,可以降低图像的尺寸和存储空间。
  • 图像处理:在图像编辑中,颜色量化可以用于图像风格迁移、图像复原等领域。
  • 数据可视化:颜色量化也常用于将图像的颜色数目减少用于数据可视化等领域。

        下面给出具体代码分析应用过程: 这段代码实现了基于K均值的颜色量化,并使用了scikit-learn库中的KMeans模型进行颜色压缩。以下是对代码的简要解释和对生成的图像的详细分析:

  1. 加载中国宫殿的图像,并将图像转换为浮点数表示,范围在[0,1]之间。
  2. 将图像转换为2D的numpy数组,以便用于K均值算法。
  3. 随机选择1000个像素点的子样本用于训练K均值模型,并拟合模型。
  4. 使用训练好的K均值模型对整个图像进行颜色压缩,并预测各像素点的颜色类别。
  5. 使用随机选择的颜色作为参考,对整个图像进行颜色压缩并预测颜色类别。
  6. 定义recreate_image()函数以重新构建压缩后的图像。
  7. 显示原始图像、K均值颜色压缩后的图像和随机颜色压缩后的图像。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import pairwise_distances_argmin
from sklearn.datasets import load_sample_image
from sklearn.utils import shuffle
from time import timen_colors = 64# Load the Summer Palace photo
china = load_sample_image("china.jpg")# Convert to floats instead of the default 8 bits integer coding. Dividing by
# 255 is important so that plt.imshow behaves works well on float data (need to
# be in the range [0-1])
china = np.array(china, dtype=np.float64) / 255# Load Image and transform to a 2D numpy array.
w, h, d = original_shape = tuple(china.shape)
assert d == 3
image_array = np.reshape(china, (w * h, d))print("Fitting model on a small sub-sample of the data")
t0 = time()
image_array_sample = shuffle(image_array, random_state=0)[:1000]
kmeans = KMeans(n_clusters=n_colors, random_state=0).fit(image_array_sample)
print("done in %0.3fs." % (time() - t0))# Get labels for all points
print("Predicting color indices on the full image (k-means)")
t0 = time()
labels = kmeans.predict(image_array)
print("done in %0.3fs." % (time() - t0))codebook_random = shuffle(image_array, random_state=0)[:n_colors]
print("Predicting color indices on the full image (random)")
t0 = time()
labels_random = pairwise_distances_argmin(codebook_random,image_array,axis=0)
print("done in %0.3fs." % (time() - t0))def recreate_image(codebook, labels, w, h):"""Recreate the (compressed) image from the code book & labels"""d = codebook.shape[1]image = np.zeros((w, h, d))label_idx = 0for i in range(w):for j in range(h):image[i][j] = codebook[labels[label_idx]]label_idx += 1return image# Display all results, alongside original image
plt.figure(1)
plt.clf()
plt.axis('off')
plt.title('Original image (96,615 colors)')
plt.imshow(china)
plt.savefig("../3.png", dpi=500)
plt.figure(2)
plt.clf()
plt.axis('off')
plt.title('Quantized image (64 colors, K-Means)')
plt.imshow(recreate_image(kmeans.cluster_centers_, labels, w, h))
plt.savefig("../4.png", dpi=500)
plt.figure(3)
plt.clf()
plt.axis('off')
plt.title('Quantized image (64 colors, Random)')
plt.imshow(recreate_image(codebook_random, labels_random, w, h))
plt.savefig("../5.png", dpi=500)
plt.show()

        实例运行结果如下图所示:

  1. 原始图像(96,615种颜色):展示了原始彩色图像,颜色细节丰富。
  2. K均值颜色压缩后的图像(64种颜色):经过K均值算法压缩处理,仅采用64种颜色表达图像,颜色数量减少,但整体色调保持。
  3. 随机颜色压缩后的图像(64种颜色):使用随机选取的颜色进行压缩后的图像,色调会略有不同于K均值方法,但也达到了颜色量化的目的。

1a26343e815c4e98bef87b6218d1cd5b.png

 7015656436d64f5d803fdfcdb27006cf.png

253abd99d691403dba1814b7cd131117.png

03- 分层聚类:结构化区域与非结构化区域    

         分层聚类是一种聚类分析方法,它通过逐步合并或分裂聚类来构建聚类层次结构。在图像处理领域中,分层聚类可以针对图像中的结构化区域(如边缘、纹理等)和非结构化区域(如背景、平坦区域等)进行分析和处理。下面是对分层聚类在处理结构化区域与非结构化区域的详细分析:

结构化区域和非结构化区域的特点:

  • 结构化区域:通常指图像中具有明显纹理、边缘、形状等特征的区域,这些区域具有一定的规律性和重复性。
  • 非结构化区域:指图像中较为平坦、连续的区域,缺乏明显的纹理和边缘特征,整体呈现较为均匀的颜色分布。

分层聚类在处理结构化区域和非结构化区域的应用:

  1. 结构化区域

    • 特征提取:分层聚类可以帮助提取结构化区域的特征,如边缘检测、纹理分析等,从而实现对结构化区域的定位和描述。
    • 分割和识别:通过分层聚类,可以将图像中相似的结构化区域划分到同一聚类中,并进一步实现目标分割和识别。
  2. 非结构化区域

    • 背景提取:分层聚类可以帮助识别并提取出图像中的非结构化背景区域,实现对图像中主体与背景的分离。
    • 颜色量化:将非结构化区域进行聚类处理,可以实现对颜色的量化和压缩,减少图像中的细节和噪声。

实现方法:

  1. 分层聚类算法选择:常用的分层聚类算法包括层次聚类、BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)等,根据应用场景选择适合的算法。
  2. 特征提取与表示:针对结构化区域和非结构化区域提取合适的特征向量,可以是颜色、纹理、边缘等特征。
  3. 聚类处理:根据提取的特征向量进行分层聚类,构建聚类层次结构,将相似的区域合并或分裂。
  4. 结果分析和后处理:对于结构化区域,可以进一步处理提取的特征信息,对于非结构化区域,可以根据聚类结果进行后续处理,如背景提取、颜色量化等操作。

应用场景:

  • 医学图像分析:对医学图像中的病变结构和正常组织进行区分和分析。
  • 地图图像处理:识别地图中的道路、水域等结构化区域以及其他地物。
  • 图像分割:将图像分割为不同的结构和区域,便于进一步处理和分析。

        通过分层聚类对结构化区域和非结构化区域进行分析和区分,有助于更好地理解图像内容、实现图像分割和特征提取,并在各种图像处理应用中发挥作用。

     下面给出具体代码分析应用过程:这段代码主要是使用了 scikit-learn 库进行分层聚类(Hierarchical Clustering)的示例代码,针对生成的瑞士卷数据集(Swiss Roll Dataset)进行了无连接约束和有连接约束两种情况的聚类分析,并将结果通过 3D 散点图可视化展示。下面对代码和生成的图像进行详细分析:

  1. 首先,使用 make_swiss_roll 生成含有噪音的瑞士卷数据集 X,然后将其变窄处理。

  2. 接着,使用 AgglomerativeClustering 进行分层聚类。首先对无连接约束的情况进行聚类(ward 连接方式,将数据分为 6 类),计算耗时并输出结果。

  3. 接着,根据数据结构构建连接度矩阵(这里使用的是最近的 10 个邻居),再次使用 AgglomerativeClustering 进行有连接约束的聚类,同样分为 6 类,计算耗时并输出结果。

  4. 最后,根据聚类结果绘制两幅3D散点图,分别展示了无连接约束和有连接约束下的聚类效果,并在标题中显示了计算耗时。

import time as time
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as p3
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_swiss_roll# #############################################################################
# Generate data (swiss roll dataset)
n_samples = 1500
noise = 0.05
X, _ = make_swiss_roll(n_samples, noise=noise)
# Make it thinner
X[:, 1] *= .5# #############################################################################
# Compute clustering
print("Compute unstructured hierarchical clustering...")
st = time.time()
ward = AgglomerativeClustering(n_clusters=6, linkage='ward').fit(X)
elapsed_time = time.time() - st
label = ward.labels_
print("Elapsed time: %.2fs" % elapsed_time)
print("Number of points: %i" % label.size)# #############################################################################
# Plot result
fig = plt.figure()
ax = p3.Axes3D(fig)
ax.view_init(7, -80)
for l in np.unique(label):ax.scatter(X[label == l, 0], X[label == l, 1], X[label == l, 2],color=plt.cm.jet(np.float(l) / np.max(label + 1)),s=20, edgecolor='k')
plt.title('Without connectivity constraints (time %.2fs)' % elapsed_time)
plt.savefig("../4.png", dpi=500)# #############################################################################
# Define the structure A of the data. Here a 10 nearest neighbors
from sklearn.neighbors import kneighbors_graph
connectivity = kneighbors_graph(X, n_neighbors=10, include_self=False)# #############################################################################
# Compute clustering
print("Compute structured hierarchical clustering...")
st = time.time()
ward = AgglomerativeClustering(n_clusters=6, connectivity=connectivity,linkage='ward').fit(X)
elapsed_time = time.time() - st
label = ward.labels_
print("Elapsed time: %.2fs" % elapsed_time)
print("Number of points: %i" % label.size)# #############################################################################
# Plot result
fig = plt.figure()
ax = p3.Axes3D(fig)
ax.view_init(7, -80)
for l in np.unique(label):ax.scatter(X[label == l, 0], X[label == l, 1], X[label == l, 2],color=plt.cm.jet(float(l) / np.max(label + 1)),s=20, edgecolor='k')
plt.title('With connectivity constraints (time %.2fs)' % elapsed_time)
plt.savefig("../5.png", dpi=500)
plt.show()

        实例运行结果如下图所示:

  • 无连接约束聚类结果:图像中展示了数据点按照聚类结果着色,并在三维空间中展示其分布情况。不同颜色代表不同的聚类簇,展示了数据点的聚类效果。
  • 有连接约束聚类结果:同样是根据聚类结果着色展示数据点的分布情况,不同颜色代表不同的聚类簇。由于考虑了数据点之间的连接性,聚类效果可能会有所不同。

c0ecadd22144418a87fc1668bd776884.png

aa0acfa4d4db4f30a68c4d32e458b366.png 

04- 不同度量的聚集聚类实战    

         在数据挖掘和机器学习领域中,聚集聚类(Agglomerative Clustering)是一种常见的聚类算法,它通过不断地将最相近的数据点或簇进行合并来构建聚类结构。在聚集聚类中,存在多种不同的度量方法用于衡量数据点之间的相似性或距离,从而影响最终的聚类结果。以下是一些常用的度量方法:

  1. 欧氏距离(Euclidean Distance):最常见的距离度量方法之一,计算两个数据点之间的直线距离。欧氏距离适用于数据特征为连续值的情况。

  2. 曼哈顿距离(Manhattan Distance):也称为城市街区距离,计算两个数据点在各个坐标轴上的距离总和。适用于特征为连续值的情况。

  3. 切比雪夫距离(Chebyshev Distance):计算两个数据点在各个坐标轴上的最大差值。适用于处理数据缩放不一致的情况。

  4. 闵可夫斯基距离(Minkowski Distance):欧氏距离和曼哈顿距离的泛化形式,可以通过参数来控制距离的计算方式。

  5. 余弦相似度(Cosine Similarity):用于衡量两个向量之间的夹角余弦值,而非距离,适用于处理文本数据或稀疏数据。

        选择合适的距离度量方法对聚集聚类的结果影响巨大,不同的数据特点和应用场景可能需要不同的度量方法来获得最佳的聚类效果。在实际应用中,可以根据数据的特征和领域知识来选择合适的距离度量方法,以及调整算法参数来优化聚类结果。

     下面给出具体代码分析应用过程:这段代码主要是对生成的波形数据进行聚类分析,并使用不同的距离度量(余弦距离、欧氏距离、曼哈顿距离)来比较聚类结果。代码中的主要步骤包括:

  1. 生成具有三种波形模式的数据集,每种模式有30个样本。
  2. 绘制基本波形数据的真实标签情况,展示每种波形模式的数据分布情况。
  3. 计算不同波形类别之间的平均距离,并绘制热图展示不同度量方式下的类间距离情况。
  4. 使用层次聚类算法(Agglomerative Clustering)对数据进行聚类,分别使用余弦距离、欧氏距离、曼哈顿距离进行聚类,并绘制聚类结果图像。
import matplotlib.pyplot as plt
import numpy as npfrom sklearn.cluster import AgglomerativeClustering
from sklearn.metrics import pairwise_distancesnp.random.seed(0)# 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)# Make the noise sparseadditional_noise[np.abs(additional_noise) < .997] = 0X.append(12 * ((a + amplitude_noise)* (sqr(6 * (t + phi + phase_noise)))+ additional_noise))y.append(i)X = np.array(X)
y = np.array(y)n_clusters = 3labels = ('Waveform 1', 'Waveform 2', 'Waveform 3')# Plot the ground-truth labelling
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("../5.png", dpi=500)# Plot the distances
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):plt.text(i, j, '%5.3f' % avg_dist[i, j],verticalalignment='center',horizontalalignment='center')plt.imshow(avg_dist, interpolation='nearest', cmap=plt.cm.gnuplot2,vmin=0)plt.xticks(range(n_clusters), labels, rotation=45)plt.yticks(range(n_clusters), labels)plt.colorbar()plt.suptitle("Interclass %s distances" % metric, size=18)plt.tight_layout()
plt.savefig("../4.png", dpi=500)# Plot clustering results
for index, metric in enumerate(["cosine", "euclidean", "cityblock"]):model = AgglomerativeClustering(n_clusters=n_clusters,linkage="average", affinity=metric)model.fit(X)plt.figure()plt.axes([0, 0, 1, 1])for l, c in zip(np.arange(model.n_clusters), 'rgbk'):plt.plot(X[model.labels_ == l].T, c=c, alpha=.5)plt.axis('tight')plt.axis('off')plt.suptitle("AgglomerativeClustering(affinity=%s)" % metric, size=20)plt.savefig("../3.png", dpi=500)
plt.show()

        实例运行结果如下图所示:

  • Ground truth图像:展示了真实标签下每种波形模式的数据分布情况,可以清晰地看到不同波形之间的差异。
  • Interclass distances热图:展示了不同波形类别之间的平均距离,浅色表示距离较远,深色表示距离较近,有助于比较不同距离度量方式下的类间相似性。
  • AgglomerativeClustering聚类结果图像:展示了使用不同距禈度量方式进行聚类后的结果。每种波形模式使用不同颜色表示,可以观察到不同聚类方法下对数据的聚类效果。

013c7c32cd34488c8f7f13caca29eb31.png

312ad3dee81147cab00d5ab769b232e5.png 

49fe47518060427d8c273a398a0ebef6.png 

aa0880557c954a44adad874075e2ebaf.png 

38e61d04b9eb448aac04a6b56cd1931e.png 

ab18683c7db6411bae1534a948cf9f95.png 

4d271121531c49269d31d76a11f7e85f.png 

总结

          在机器学习领域,常用的聚类算法包括DBSCAN聚类算法、K均值聚类算法、以及分层聚类算法。这些算法在处理不同类型的数据和应用场景中都有各自的优势和适用性。

  1. DBSCAN聚类算法(Density-Based Spatial Clustering of Applications with Noise):

    • 优点:能够发现任意形状的聚类,对噪声数据比较鲁棒。
    • 工作原理:通过定义邻域内的数据点密度来确定聚类,从而将高密度区域划分为一个聚类,并能够有效处理密度不均匀的数据集。
  2. K均值聚类算法(K-Means Clustering):

    • 优点:简单且高效,适用于大规模数据集。
    • 工作原理:将数据点划分为K个簇,通过不断迭代更新簇的中心点和重新分配数据点来最小化簇内的方差。
  3. 分层聚类算法(Hierarchical Clustering):

    • 优点:能够构建聚类簇之间的层次结构,不需要预先指定簇的数量。
    • 工作原理:通过不断合并或分裂数据点或簇来构建聚类层次结构,可分为凝聚性层次聚类和分裂性层次聚类两种方法。
  4. 不同度量的聚集

    • 聚集聚类是一种基于簇的层次聚类算法,采用不同的距离或相似度度量方法来决定簇之间的合并顺序。
    • 不同度量方法会影响聚类的结果,常用的度量包括欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离和余弦相似度等。

        总的来说,选择适合数据特点和需求的聚类算法和距离度量方法是十分重要的。DBSCAN适用于发现任意形状的聚类,K均值适用于均衡分布的数据,分层聚类适用于构建聚类层次结构。同时,根据数据的特点和任务需求选择合适的距离度量方法也是关键的一步。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/14806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保障餐饮场所安全:定期送检可燃气体报警器

在餐饮行业&#xff0c;火灾隐患一直备受关注。餐厅、茶饮店等场所常常使用燃气设备&#xff0c;而这些设备带来了潜在的安全隐患。 为了及时发现并预防可燃气体泄漏&#xff0c;可燃气体报警器的定期送检显得尤为重要。那么&#xff0c;为什么可燃气体报警器需要定期送检呢&a…

【Linux】从零开始认识进程间通信 —— 管道

送给大家一句话&#xff1a; 人要成长&#xff0c;必有原因&#xff0c;背后的努力与积累一定数倍于普通人。所以&#xff0c;关键还在于自己。 – 杨绛 从零开始认识进程间通信 1 为什么要进程间通信2 进程如何通信3 进程通信的常见方式4 管道4.1 什么是管道4.2 管道通信的系…

交叉编译程序,提示 incomplete type “struct sigaction“ is not allowed

问题描述 incomplete type "struct sigaction" is not allowed解决办法 在代码的最顶端添加如下代码即可 #define _XOPEN_SOURCE此定义不是简单的宏定义&#xff0c;是使程序符合系统环境的不可缺少的部分 _XOPEN_SOURCE为了实现XPG&#xff1a;The X/Open Porta…

零一万物Yi-1.5开源,34B/9B/6B多尺寸,34B超Qwen1.5-72B

前言 近年来&#xff0c;大型语言模型&#xff08;LLM&#xff09;在各个领域展现出惊人的能力&#xff0c;为人们的生活和工作带来了巨大的改变。然而&#xff0c;大多数开源 LLM 的性能仍然无法与闭源模型相媲美&#xff0c;这限制了 LLM 在科研和商业领域的进一步应用。为了…

element-plus表格的表单校验如何实现,重点在model和prop

文章目录 vue&#xff1a;3.x element-plus&#xff1a;2.7.3 重点&#xff1a; 1) tableData放到form对象里 2) form-item的prop要写成tableData.序号.属性 <!--table-表单校验--> <template><el-form ref"forms" :model"form"><e…

安装mpi4py与dlio_profiler_py的总结

安装mpi4py mpi4py是一个Python库&#xff0c;它提供了与MPI&#xff08;Message Passing Interface&#xff09;兼容的接口&#xff0c;使得Python程序能够利用MPI实现并行计算。mpi4py 的核心是基于MPI标准的C/C实现&#xff0c;它能够在高性能计算环境下进行高效的并行处理…

软考之信息系统管理知识点(3)

流水线&#xff1a;是指在程序执行时多条指令重叠进行操作的一种准并行处理实现技术。各种部件同时处理是针对不同指令而言的&#xff0c;它们可同时为多条指令的不同部分进行工作&#xff0c;以提高各部件的利用率和指令的平均执行速度。 编译得过程 关系数据库是表的集合 …

【全网最全】2024电工杯数学建模A题前两问完整解答+21页初步参考论文+py代码+保奖思路等(后续会更新成品论文)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片链接&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024电工杯数学建模A题前两问完整解答21页初步参考论文py代码保奖思路等&#xff08;后续会更新成品论文&#xff09;「首先来看看目前已有…

力扣:92. 反转链表 II(Java)

目录 题目描述&#xff1a;示例 1&#xff1a;示例 2&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的…

网络采集受限?如何解决指纹识别、IP封禁、验证码、账号多登等问题

网页采集是什么 网页采集&#xff0c;也常被称作网络采集、网络数据抓取&#xff0c;是一种通过自动化工具从网站上获取信息的技术。这些技术通过访问网页&#xff0c;解析页面上的内容&#xff0c;并提取出有价值的数据&#xff0c;如文本、图片、链接等。 网页采集通常用于…

Python 调整PDF文件的页面大小

在处理PDF文件时&#xff0c;我们可能会遇到这样的情况&#xff1a;原始PDF文档不符合我们的阅读习惯&#xff0c;或者需要适配不同显示设备等。这时&#xff0c;我们就需要及时调整PDF文档中的页面尺寸&#xff0c;以满足不同应用场景的需求。 利用Python语言的高效性和灵活性…

Linux--网络通信(一)概述

网络通信概述 网络通信本质上是一种进程间通信&#xff0c;是位于网络中不同主机上的进程之间的通信&#xff0c;属于 IPC 的一种&#xff0c; 通常称为 socket IPC。所以网络通信是为了解决在网络环境中&#xff0c;不同主机上的应用程序之间的通信问题。 大概可以分为三个层…

23种设计模式之一————外观模式详细介绍与讲解

外观模式详细讲解 一、概念二、 外观模式结构核心思想及解释模式的UML类图模式角色应用场景模式优点模式缺点 三、实例演示图示代码展示运行结果 一、概念 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它提供了一个统一的接口&#xff0c…

【问题解决】Android Studio Jellyfish新建Kotlin项目后Gradle Sync及Maven下载很慢

创建新项目之后&#xff0c;Gradle Sync和Build都很慢&#xff0c;因为下载Gradle和Maven等工具。 代码默认配置 settings.gradle.kts pluginManagement {repositories {google {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.g…

Android Activity 设计详解

文章目录 Android Activity 设计说明1. Activity 的生命周期2. Activity 的启动模式3. Activity 的通信4. Activity 的布局和视图管理5. Activity 的配置变化处理6. Activity 的保存和恢复状态7. Activity 的任务和返回栈 总结 Android Activity 设计说明 在 Android 中&#…

Ansible01-Ansible的概述、实验环境初始化、Inventory

目录 写在前面1. Ansible是什么1.1 简介与来历1.2 Ansible的特点1.3Ansible的架构与工作流程1.3.1 ansible 任务执行模式1.3.2 ansible 执行流程1.4 Ansible的模块 2. Ansible实验初始化2.1 实验环境2.2Ansible的安装2.2.1 Ansible的程序结构 2.3 修改Ansible配置文件2.3.1 配置…

【408精华知识】页、页面、页框、页帧、内存块、物理块、物理页面还傻傻分不清?

在做题过程中&#xff0c;我们经常能看到页、页框、块等概念&#xff0c;初接触时&#xff0c;常感觉傻傻分不清&#xff0c;这篇文章将简洁地介绍它们之间的联系与区别。 这些概念之间的根本区别&#xff0c;在于是物理上的概念还是逻辑上的概念&#xff0c;也即是虚地址还是实…

汇聚荣:新手做拼多多应该注意哪些事项?

新手在拼多多开店&#xff0c;面临的是竞争激烈的市场和复杂的运营规则。要想在这个平台上脱颖而出&#xff0c;必须注意以下几个关键事项。 一、市场调研与定位 深入了解市场需求和竞争对手情况是新手开店的首要步骤。选择有潜力的细分市场&#xff0c;并针对目标消费者群体进…

华为云服务培训

一、存储类服务实践 是什么&#xff1a; 云硬盘( Elastic Volume Service )是一种为 ECS&#xff08;弹性云服务器&#xff09;、BMS&#xff08;裸金属服务器&#xff09; 等计算服务提供持久性存储的服务。 作用&#xff1a; 它通过数据冗余和缓存加速等多项技术&#xf…

Spring系列-03-BeanFactory和Application接口和相关实现

BeanFactory BeanFactory和它的子接口们 BeanFactory 接口的所有子接口, 如下图 BeanFactory(根容器)-掌握 BeanFactory是根容器 The root interface for accessing a Spring bean container. This is the basic client view of a bean container; further interfaces such …