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()

      

 

posted on 2019-01-21 10:42  python我的最爱  阅读(733)  评论(0编辑  收藏  举报