聚类算法之DBSCAN算法之一:经典DBSCAN

DBSCAN是基于密度空间的聚类算法,与KMeans算法不同,它不需要确定聚类的数量,而是基于数据推测聚类的数目,它能够针对任意形状产生聚类。

1.epsilon-neighborhood

epsoiln-neighborhood(简称e-nbhd)可理解为密度空间,表示半径为e且含有若干个点的nbhd,密度等于包含点的个数/空间大小。图中中心点是(3,2),半径epsilon是0.5
在这里插入图片描述
根据式子密度=点的个数/面积,可以计算得到上图中密度=31/2pi(0.5)*(0.5)=62/pi,这个数字本身意义不大,但通过计算某一小区域的密度,横向对比可以得知整个区域的密度分布,由此相近的点可聚类到同一区域内。

2.DBSCAN

DBSCAN算法需要首先确定两个参数:
(1)epsilon:在一个点周围邻近区域的半径
(2)minPts:邻近区域内至少包含点的个数
根据以上两个参数,结合epsilon-neighborhood的特征,可以把样本中的点分成三类:

  1. 核点(core point):满足NBHD(p,epsilon)>=minPts,则为核样本点
  2. 边缘点(border point):NBHD(p,epsilon)<minPts,但是该点可由一些核点获得(density-reachable或者directly-reachable
  3. 离群点(Outlier):既不是核点也不是边缘点,则是不属于这一类的点

注:边缘点density-reachable是指存在当前类中其他点作为核点所在的类中。例如,朋友的朋友(可以是n多个)也是朋友。如下图,黄圈右下角的点即为density-reachabledirectly-reachable的点即为NBHD中的点。
在这里插入图片描述

3.DBSCAN步骤

结合2中内容,DBSCAN的一般步骤是:(在已知epsilon和minPts的前提下)

  1. 任意选择一个点(既没有指定到一个类也没有特定为外围点),计算它的NBHD(p,epsilon)判断是否为核点。如果是,在该点周围建立一个类,否则,设定为外围点。
  2. 遍历其他点,直到建立一个类。把directly-reachable的点加入到类中,接着把density-reachable的点也加进来。如果标记为外围的点被加进来,修改状态为边缘点。
  3. 重复步骤1和2,直到所有的点满足在类中(核点或边缘点)或者为外围点

4.代码实现

思路:读取数据,选择Grocery和Milk两列作为训练样本,对数据归一化(特征标准化),使用dbscan聚类,并作图。
特征标准化是归一化中常用的手段,特点是零均值和单位方差,对于正态分布的数据拟合很好。

# coding=utf-8
import numpy as np
from scipy.spatial.distance import cdist
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
import pandas as pd

data = pd.read_csv("data/wholesale.csv")
data.drop(["Channel", "Region"], axis=1, inplace=True)

data = data[["Grocery", "Milk"]]
data = data.as_matrix().astype("float32", copy=False)#convert to array

#数据预处理,特征标准化,每一维是零均值和单位方差
stscaler = StandardScaler().fit(data)
data = stscaler.transform(data)

#画出x和y的散点图
plt.scatter(data[:, 0], data[:, 1])
plt.xlabel("Groceries")
plt.ylabel("Milk")
plt.title("Wholesale Data - Groceries and Milk")
plt.savefig("results/wholesale.png", format="PNG")

dbsc = DBSCAN(eps=0.5, min_samples=15).fit(data)

labels = dbsc.labels_ #聚类得到每个点的聚类标签 -1表示噪点
#print(labels)
core_samples = np.zeros_like(labels, dtype=bool) #构造和labels一致的零矩阵,值是false
core_samples[dbsc.core_sample_indices_] = True
#print(core_samples)


unique_labels = np.unique(labels)
colors = plt.cm.Spectral(np.linspace(0, 1, len(unique_labels))) #linespace返回在【0,1】之间均匀分布数字是len个,Sepectral生成len个颜色


#print(zip(unique_labels,colors))
for (label, color) in zip(unique_labels, colors):
    class_member_mask = (labels == label)
    print(class_member_mask&core_samples)
    xy = data[class_member_mask & core_samples]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=color, markersize=10)

    xy2 = data[class_member_mask & ~core_samples]
    plt.plot(xy2[:, 0], xy2[:, 1], 'o', markerfacecolor=color, markersize=5)
plt.title("DBSCAN on Wholsesale data")
plt.xlabel("Grocery (scaled)")
plt.ylabel("Milk (scaled)")
plt.savefig("results/(0.9,15)dbscan_wholesale.png", format="PNG")

5.分析及总结

(1)epsilon不变的情况下,调整minPts的大小,则minPts越大,NBHD越密集,产生离群点越多。以下四幅图对应epsilon和minPts分别是(0.5,15),(0.5,20),(0.5,40),(0.5,60)

在这里插入图片描述
在这里插入图片描述
(2)在minPts不变的情况下,epsilon越小,聚类越密集,产生离群点越多。以下三幅图分别是(0.5,15),(0.8,15),(0.9,15)
在这里插入图片描述
epsilon越小,minPts越多,则密度越高,产生聚类越密集。

DBSCAN最大的特点是事先不必确定聚类的种类,通过基于密度的方法,聚类并找出离群点。不仅需要对大部分在类中的点分析,也需要对离群点分析(例如统计分析被木马程序入侵的电脑,本例中牛奶需求水平较高的顾客…)

6.参考链接

https://blog.dominodatalab.com/topology-and-density-based-clustering/?tdsourcetag=s_pcqq_aiomsg

  • 21
    点赞
  • 188
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
ST-DBSCAN (Space-Time Density-Based Spatial Clustering of Applications with Noise) 是一种时空聚类算法,它是基于 DBSCAN (Density-Based Spatial Clustering of Applications with Noise) 算法的扩展。ST-DBSCAN 在时空数据中进行聚类,考虑了数据点的空间位置和时间属性。 DBSCAN 算法是一种基于密度的聚类方法,它将数据点划分为核心点、边界点和噪声点。核心点是在一个给定的半径范围内拥有足够数量的邻居点的点。边界点是在核心点的邻域内但不具备足够数量邻居点的点。噪声点没有足够数量的邻居点且不在任何簇中。 ST-DBSCAN 算法DBSCAN 的基础上添加了时间属性。它通过考虑空间位置和时间维度上的距离来进行聚类。ST-DBSCAN 将时空数据点视为具有三个属性:空间位置、时间和密度。它使用一个扩展的欧氏距离来计算两个数据点之间的相似度,包括空间距离和时间距离。 ST-DBSCAN 的工作流程如下: 1. 根据给定的参数确定核心点的最小邻居数和半径范围。 2. 遍历数据集中的每个点,计算其邻域中的点数。 3. 对于每个核心点,找到其可达的密度可达点(密度可达点是指在给定半径范围内有足够数量邻居点的点)。 4. 根据可达性来构建聚类簇。 5. 标记噪声点,即没有足够邻居点的点。 6. 最后,根据定义的聚类规则将聚类结果返回。 ST-DBSCAN 在时空数据的聚类中具有很好的性能,可以应用于许多领域,如交通流分析、轨迹数据分析等。它可以有效地识别和聚类时空数据中的相关模式和异常点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值