密度聚类算法:利用DBSCAN观察用户的地理分布

Posted 数据启蒙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了密度聚类算法:利用DBSCAN观察用户的地理分布相关的知识,希望对你有一定的参考价值。

提到聚类算法,大家第一时间会想到K-means,今天给大家介绍另外一种聚类算法:DBSCAN。DBSCAN是一种基于密度的聚类算法,不同于K-means(追求同类之间距离最小,不同类之间距离最大),其输出是密度相连的点的最大集合。DBSCAN聚类的结果可以形象地成为“簇”,这也反应其一大优势:可以发现任意形状的聚类集合。DBSCAN在处理空间分布如下图花圃的数据集时,有K-means无法比拟的优势。也由于能有效识别如街道、河流等区隔,DBSCAN可以说是地理位置聚类的利器。


下面我们详细介绍DBSCAN算法的内容:


一、DBSCAN算法的核心概念

邻域:某一对象周边的区域,如果指定半径E,则被称为E邻域。

核心对象:如果某一对象Ε领域内的样本数大于等于MinPoints(最小样本数),则称该对象为核心对象。


二、DBSCAN的实现过程

输入:邻域半径E;核心点邻域内最小样本数MinPoints;样本集N

初始化:聚类结果集合C为空,C为集合的集合

输出:聚类结果集合C

计算:

1、计算样本集N中的核心点,并标记为核心点。

2、从样本集N中随机找出一个核心对象P,并将P及其E邻域内的样本从N集合移至Ci集合,将P标记为visited。如果N中不存在核心点,则N中的点标记为散点,结束计算。

3、从C中新建一个集合Ci,将Ci集合内的样本标记为i。

4、从Ci集合中找出非P核心点,并将此核心点及其E邻域内的所有样本从N集合移至Ci集合,将此核心点标记为visited。

5、如果Ci中存在未被标记为visited的核心点,则转至第4步。否则转至第2步。

密度聚类算法:利用DBSCAN观察用户的地理分布

三、DBSCAN聚类的特点

1、DBSCAN的聚类过程就是把核心点串联起来,然后以核心点为中心,E为半径,圈出邻域内的样本。

2、DBSCAN的参数过多(K-means的一个参数已经让我们头疼,何况这里有两个),调参是个头疼问题。

3、如果样本间距离差别过大的话,不适合使用DBSCAN。原因是容易出现散点过多或者分类过少的问题。很难调整两个参数已达到较好的分类效果。

4、DBSCAN可以发现任何形状的样本集合,这种特性在某些场景下使用会有很好的效果,尤其在地理位置的聚类中。



四、利用Python包进行聚类的样例

1、Python包DBSCAN使用的是欧式距离,在进行经纬度的聚利时,最好将经纬度转成平面坐标。坐标转换函数如下:

import utm

def utm_exchange(row):
    
    row['latitude'] = utm.from_latlon(row['user_latitude'], row['user_longitude'])[0]
    row['longitude'] = utm.from_latlon(row['user_latitude'], row['user_longitude'])[1]

    return row

2、利用平面坐标进行聚类,代码中包含两个参数:邻域半径eps=100米;核心对象邻域内最少样本数min_samples=10

from sklearn.cluster import DBSCAN

db = DBSCAN(eps=100, min_samples=10).fit(position[['latitude', 'longitude']])
position['labels'] = db.labels_

3、展示聚类结果,分别展示包含散点的结果和去除散点的结果,代码如下:

import matplotlib.pyplot as plt

labels = position['labels']
unique_labels = set(labels)

colors = plt.cm.Spectral(np.linspace(0, 1, len(unique_labels)))

for k, col in zip(unique_labels, colors):
    if k == -1:
        # Black used for noise.
        col = 'k'

    class_member_mask = (labels == k)

    xy = position[class_member_mask]
    
    if k == -1:
        plt.plot(xy['user_latitude'], xy['user_longitude'], 'o', markerfacecolor=col,
             markeredgecolor='k', markersize=2)
    else:
        plt.plot(xy['user_latitude'], xy['user_longitude'], 'o', markerfacecolor=col,
             markeredgecolor='k', markersize=14)

研究样本的群体分布

排除散点之后的样本群体分布




以下往期文章:






以上是关于密度聚类算法:利用DBSCAN观察用户的地理分布的主要内容,如果未能解决你的问题,请参考以下文章

基于密度的聚类方法

DBSCAN聚类算法原理总结

DBSCAN密度聚类算法

DBSCAN密度聚类算法

聚类算法--DBSCAN

聚类算法-密度聚类算法DBSCAN