密度聚类方法的指导思想是,只要样本点的密度大于某阈值,则将该样本添加到最近的簇中。
这类算法能克服基于距离的算法只能发现“类圆形”的聚类的缺点,可发现任意形状的聚类,且对噪声数据不敏感。但计算密度单元的计算复杂度大,需要建立空间索引来降低计算量。
DBSCAN
密度最大值算法
DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度的空间聚类算法。 该算法将具有足够密度的区域划分为簇,并在具有噪声的空间数据库中发现任意形状的簇,它将簇定义为密度相连的点的最大集合。
基于密度这点有什么好处呢,我们知道kmeans聚类算法只能处理球形的簇,也就是一个聚成实心的团(这是因为算法本身计算平均距离的局限)。但往往现实中还会有各种形状,比如下面两张图,环形和不规则形,这个时候,那些传统的聚类算法显然就悲剧了。于是就思考,样本密度大的成一类呗。呐这就是DBSCAN聚类算法
推荐一个很形象的描述DBSCAN的网站,可视化
https://www.naftaliharris.com/blog/visualizing-dbscan-clustering/
2.DBSCAN的重要参数
(1)eps 相当于圈的半径,越大越小都不好,自己合适调节
(2)min_samples 相当于一个圈中最少的样本数,不到的话,就被划分为离散点
(3)metric
3.DBSCAN案例
1 import warnings 2 warnings.filterwarnings(\'ignore\') 3 import numpy as np 4 import matplotlib.pyplot as plt 5 %matplotlib inline 6 7 from sklearn import datasets 8 from sklearn.cluster import DBSCAN,KMeans 9 # noise控制叠加的噪声的大小 10 X,y = datasets.make_circles(n_samples=1000,noise = 0.1,factor = 0.3) 11 12 # centers=[[1.5,1.5]] 坐标位置,在1.5,1.5生成 13 X3,y3 = datasets.make_blobs(n_samples=500,n_features=2,centers=[[1.5,1.5]],cluster_std=0.2) 14 15 # 将两个数据级联 16 X = np.concatenate([X,X3]) 17 18 y = np.concatenate([y,y3+2]) 19 20 plt.scatter(X[:,0],X[:,1],c = y)