sklearn聚类算法之DBSCAN

基本思想

聚类是很多观察值紧密聚集在一起的区域,DBSCAN算法就是受这一点的启发而来的,它对于聚类的形状没有做任何假设。具体来说,DBSCAN算法有如下几步:

  1. 先选择一个随机观察值
  2. 如果 x i x_i xi的近邻数为最小限度数量的话,就把它归入一个聚类
  3. x i x_i xi的所有邻居重复执行步骤2,对邻居的邻居也如此,以此类推。这些点是聚类的核心观察值
  4. 一旦步骤3处理完所有邻近的观察值,就选择一个新的随机点(重新开始执行步骤1)

一旦完成这些步骤,我们就会得到一个聚类的核心观察值得集合。最后,凡是在聚类附近但又不是核心的观察值将被认为属于这个聚类,而那些离聚类很远的观察值将被标记为噪声。

DBSCAN对象需要设置以下三个主要参数。

eps:从一个观察值到另一个观察值得最远距离,超过这个距离将不再认为二者是邻居

min_samples:最小限度的邻居数量,如果一个观察值在其周围小于eps距离的范围内有超过这个数量的邻居,就被认为是核心观察值

metric:eps所用的距离度量,比如minkowski(闵可夫斯基距离)或者euclidean(欧式距离)。注意,如果使用闵可夫斯基距离,就可以用参数p设定闵可夫斯基中的幂次。

API学习

class sklearn.cluster.DBSCAN(
	eps=0.5, 
	*, 
	min_samples=5, 
	metric='euclidean', 
	metric_params=None, 
	algorithm='auto', 
	leaf_size=30, 
	p=None, 
	n_jobs=None
)
参数类型解释
epsfloat, default=0.5邻域的距离阈值 ϵ \epsilon ϵ
min_samplesint, default=5样本点要成为核心对象所需要的邻域的样本数阈值
metricstr, or callable, default=‘euclidean’度量方式,默认为欧式距离,可以使用的距离度量参数有’euclidean’/‘manhattan’/‘chebyshev’/‘minkowski’/‘wminkowski’/‘seuclidean’/‘mahalanobis’
metric_paramsdict, default=None度量函数的其他关键字参数
algorithm{‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, default=‘auto’近邻算法求解方式
leaf_sizeint, default=30使用’ball_tree’或’kd_tree’时停止建子树的叶子节点数量的阈值
pfloat, default=None只用于闵可夫斯基距离和带权重闵可夫斯基距离中p值的选择,p=1为曼哈顿距离,p=2为欧式距离。
n_jobsint, default=NoneCPU并行数,值为-1时使用所有CPU运算
属性类型解释
core_sample_indices_ndarray of shape(n_core_samples,)包含每个核心实例的索引
components_ndarray of shape(n_core_samples, n_features)核心实例本身
labels_ndarray of shape(n_samples)分类结果
n_features_in_int拟合期间的特征个数
feature_names_in_ndarray of shape(n_features_in_,)拟合期间的特征名称
方法说明
fit(X[, y, sample_weight])Perform DBSCAN clustering from features, or distance matrix.
fit_predict(X[, y, sample_weight])Compute clusters from a data or distance matrix and predict labels.
get_params([deep])Get parameters for this estimator.
set_params(**params)Set the parameters of this estimator.

代码示例

>>> from sklearn.cluster import DBSCAN
>>> import numpy as np
>>> X = np.array([[1, 2], [2, 2], [2, 3],
...               [8, 7], [8, 8], [25, 80]])
>>> clustering = DBSCAN(eps=3, min_samples=2).fit(X)
>>> clustering.labels_
array([ 0,  0,  0,  1,  1, -1])
>>> clustering
DBSCAN(eps=3, min_samples=2)

参考文献

[1] Ester, M., H. P. Kriegel, J. Sander, and X. Xu, “A Density-Based Algorithm for Discovering Clusters in Large Spatial Databases with Noise”. In: Proceedings of the 2nd International Conference on Knowledge Discovery and Data Mining, Portland, OR, AAAI Press, pp. 226-231. 1996

[2] Schubert, E., Sander, J., Ester, M., Kriegel, H. P., & Xu, X. (2017). DBSCAN revisited, revisited: why and how you should (still) use DBSCAN. ACM Transactions on Database Systems (TODS), 42(3), 19.

以下是Python中对四种聚类算法的代码实现和案例: 1. k-means算法 ```python import numpy as np from sklearn.cluster import KMeans import matplotlib.pyplot as plt # 生成数据 x1 = np.random.normal(0.5, 0.2, (100, 2)) x2 = np.random.normal(2.5, 0.2, (100, 2)) x3 = np.random.normal(1.5, 0.2, (100, 2)) X = np.vstack((x1, x2, x3)) # 训练模型 kmeans = KMeans(n_clusters=3, random_state=0) kmeans.fit(X) # 可视化结果 labels = kmeans.predict(X) plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis') centers = kmeans.cluster_centers_ plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5) plt.show() ``` 2. 层次聚类算法 ```python import numpy as np from sklearn.cluster import AgglomerativeClustering import matplotlib.pyplot as plt # 生成数据 x1 = np.random.normal(0.5, 0.2, (100, 2)) x2 = np.random.normal(2.5, 0.2, (100, 2)) x3 = np.random.normal(1.5, 0.2, (100, 2)) X = np.vstack((x1, x2, x3)) # 训练模型 agg = AgglomerativeClustering(n_clusters=3) agg.fit(X) # 可视化结果 labels = agg.labels_ plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis') plt.show() ``` 3. DBSCAN算法 ```python import numpy as np from sklearn.cluster import DBSCAN import matplotlib.pyplot as plt # 生成数据 x1 = np.random.normal(0.5, 0.2, (100, 2)) x2 = np.random.normal(2.5, 0.2, (100, 2)) x3 = np.random.normal(1.5, 0.2, (100, 2)) X = np.vstack((x1, x2, x3)) # 训练模型 dbscan = DBSCAN(eps=0.3, min_samples=5) dbscan.fit(X) # 可视化结果 labels = dbscan.labels_ plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis') plt.show() ``` 4. 谱聚类算法 ```python import numpy as np from sklearn.cluster import SpectralClustering import matplotlib.pyplot as plt # 生成数据 x1 = np.random.normal(0.5, 0.2, (100, 2)) x2 = np.random.normal(2.5, 0.2, (100, 2)) x3 = np.random.normal(1.5, 0.2, (100, 2)) X = np.vstack((x1, x2, x3)) # 训练模型 spectral = SpectralClustering(n_clusters=3) spectral.fit(X) # 可视化结果 labels = spectral.labels_ plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis') plt.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值