DBSCAN 聚类算法又称为密度聚类,是一种不断发张下线而不断扩张的算法,主要的参数是半径r和k值
DBSCAN的几个概念:
核心对象:某个点的密度达到算法设定的阈值则其为核心点,核心点的意思就是一个点在半径r的范围内,如果存在k个值,那么这个点就成为核心对象
直接密度可达:若点p在q的邻域内,且q是核心,则p-q称为直接密度可达
密度可达:若有q1, q2...qk,对任意qi与qi-1是直接密度可达,从q1和qk则是密度可达
边界点: 属于一个类的非核心点,不能再发展下线
噪声点: 不属于任意一类簇的点,从一个核心点出发是密度不可达
工作流程
参数D:数据数据集
参数R:指定半径
Minpts:密度阈值
停止条件:所有的点都遍历结束后停止,即所有的点都不是核心点
第一步:标记所有的对象为未遍历的点
第二步:随机选择一个初始点
第三步:如果R的领域内,有k个点的话,就创建一个新簇,将p添加到这个簇里C
第四步:遍历这个簇里的p个点,如果p为unvisited标记为visited,把这些对象添加到N,如果p不是任何簇的成员,把p添加到C
第五步:如果存在任意点不属于任何一个簇,即为噪声点
第六步:直到遍历完所有的点
这是一种不断遍历和发展下线的过程
优势:
不需要指定簇的个数
可以发现任意形状的簇
擅长找到离群点
两个参数就够了
劣势:
高维数据有些困难(可以做降维)
参数难以选择(参数对结果的影响很大)
sklearn效率很慢(数据削减策略),由于数据量很大,我们可以去除一部分相似的数据
代码:使用sklearn中的DBSCAN进行计算,使用scatter_matrix进行画图
第一步:数据导入
第二步:特征提取
第三步:模型训练和测试
第四步:使用轮廓系数进行评估
第五步:使用scatter_matrix画出两两变量的散点图
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 第一步导入数据 data = pd.read_csv('data.txt', sep=' ') # 第二步提取特征 X = data[['calories', 'sodium', 'alcohol', 'cost']] # 设置颜色列表 colors = np.array(['red', 'blue', 'green', 'black']) from sklearn.cluster import DBSCAN from pandas.tools.plotting import scatter_matrix from sklearn.metrics import silhouette_score # 3.模型训练和测试 labels = DBSCAN(eps=10, min_samples=2).fit(X).labels_ # 4. 输出轮廓系数得分 score = silhouette_score(X, labels) # 5. 画scatter_matrix图 scatter_matrix(X, c=colors[labels], s=50, figsize=(10, 10)) plt.show()