提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
sklearn库中的两个聚类算法:AgglomerativeClustering和DBSCAN
前言
sklearn库中的两个聚类算法:AgglomerativeClustering和DBSCAN都是基于密度的聚类算法,它们的聚类过程不需要事先定义聚类数量k
提示:以下是本篇文章正文内容,下面案例可供参考
一,介绍二者
1,AgglomerativeClustering是什么?
AgglomerativeClustering是一种凝聚层次聚类算法,每个数据点最初都被视为一个单独的簇,然后将最相似的簇合并,继续合并直到达到要求的簇数或者遇到合并阈值。该算法的效果受距离度量、合并策略以及定义簇数量的方式等参数影响。常用的距离度量有欧几里得距离、曼哈顿距离和余弦相似度等,常用的合并策略有ward、complete、average、single等,定义簇数量的方式则可以是提前设定好的固定数量,也可以是根据合并高度定义簇数量
2,DBSCAN是什么?
DBSCAN是一种基于密度的聚类算法,将被聚类的数据集看做由一些高密度区域和低密度区域组成。通过在距离小于一定半径内的样本点数目来刻画样本点的密度,在高密度区域内产生足够的密度联系并把它们分为一个簇,而将高密度区域和低密度区域的噪声数据点分开。该算法只需要设定两个参数eps和min_samples,其中eps表示一个样本的邻域半径大小,min_samples表示邻域内最少的样本点数量,即可自动发现不同形状和大小的簇
二、使用步骤
1.引入库
代码如下(示例):
from sklearn.cluster import DBSCAN,AgglomerativeClustering
2.读入数据
1,使用DBSCAN算法对数据集X进行聚类,并用散点图展示聚类结果
代码如下(示例):
y_pred = DBSCAN(eps = 0.05, min_samples = 10).fit_predict(X)
这段代码使用了DBSCAN算法对数据集X进行聚类,其中eps代表邻域半径,min_samples代表密度阈值。fit_predict()方法将数据集X作为输入并返回预测的聚类标签。具体地,如果数据点属于一个聚类,它将被分配一个非负整数标签。如果数据点不属于任何聚类,则将其分配为-1。本代码中的聚类结果将存储在y_pred中。
2,使用了AgglomerativeClustering算法对数据集X进行聚类,并将聚类标签保存在y_pred数组中
y_pred = DBSCAN(eps = 0.05, min_samples = 10).fit_predict(X)
这段代码使用了DBSCAN算法对数据集X进行聚类。其中eps参数表示邻域半径的大小,min_samples参数表示一个簇中至少需要的数据点数。fit_predict()方法将X作为输入进行聚类并返回每个数据点的聚类标签,这些标签将被存储在y_pred中。DBSCAN算法可以将密集的数据点聚合为一个簇,并将低密度区域划分为噪声点,因此y_pred中的标签可以被视为对X中数据点的“聚类/噪声”分类结果。在一些实际场景中,这种结果的使用相当普遍,例如异常检测和离群点检测等。需要注意的是,该算法在不同的数据集上产生不同的聚类效果,用户需要通过多次尝试不同的参数,才能找到最佳聚类结果。
三、全部源码(包含轮廓系数(silhouette_score)对聚类结果进行了评价)
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets, metrics
# 以下代码使用了sklearn库中的两个聚类算法:
from sklearn.cluster import DBSCAN,AgglomerativeClustering
# 生成了两个数据集X1, y1和X2, y2,将它们连接起来形成一个新的数据集X
# 使用sklearn库中的datasets模块中的make_circles函数生成了一个环形数据集
X1, y1=datasets.make_circles(n_samples=500, factor=.6,noise=.08)
'''
n_samples参数指定生成的样本数
factor参数指定内部圆环与外部圆环之间的间距
noise参数指定在数据点中添加的高斯噪声的标准差大小
'''
X2, y2 = datasets.make_blobs(n_samples=1000, n_features=2, centers=[[1.2,1.2]], cluster_std=[[.3]],random_state=9)
X = np.concatenate((X1, X2))
# 用散点图展示了数据集X中的数据点
plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.show()
from sklearn.cluster import AgglomerativeClustering
y_pred = AgglomerativeClustering(n_clusters=3,affinity="cosine",linkage="average").fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()
score = metrics.silhouette_score(X, y_pred, metric='euclidean', sample_size=len(X))
print(score)
# 使用DBSCAN算法对数据集X进行聚类,并用散点图展示聚类结果
y_pred = DBSCAN(eps = 0.05, min_samples = 10).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()
# 最后,使用轮廓系数(silhouette_score)对聚类结果进行了评价,并打印出了评价结果
score = metrics.silhouette_score(X, y_pred, metric='euclidean', sample_size=len(X))
print(score)
总结
AgglomerativeClustering是基于层次的聚类算法。该算法从每个数据点开始,逐渐将数据点合并为越来越大的簇。该算法的优点在于可以通过设置不同的合并策略(如单连接,完全连接等)来适应不同形状和大小的簇。但是,AgglomerativeClustering在处理大规模数据时可能会变得相当耗时。
DBSCAN是一种基于密度的聚类算法。该算法通过从具有足够密度的数据点开始,来查找簇。密度低于一定阈值的数据点会被排除在外。该算法可以找到任意形状的簇,且不需要指定簇的数量。但是,DBSCAN算法对参数的选择比较敏感,需要谨慎设置邻域半径和密度阈值。
总之,AgglomerativeClustering和DBSCAN都具有自己的特点和优点。使用哪种算法将取决于数据集的特征以及用户的实际需求。