聚类(四)—— 基于密度的聚类

主要内容
聚类分析概述
K-Means聚类
层次聚类
基于密度的聚类
其他聚类方法
聚类评估
小结

四、基于密度的聚类

算法原理

基于密度的聚类算法的主要思想是:只要邻近区域的密度(对象或数据点的数目)超过某个阈值,就把它加到与之相近的聚类中。也就是说,对给定类中的每个数据点,在一个给定范围的区域中必须至少包含某个数目的点。
基于密度的聚类算法代表算法有:DBSCAN算法OPTICS算法DENCLUE算法等。

DBSCAN算法涉及2个参数5个定义:
在这里插入图片描述
在这里插入图片描述
定义1(Eps邻域)

给定一个对象 p ,p 的Eps 邻域 NEps(p)定义为以 p 为核心,以Eps为半径的d 维超球体区域,即:

在这里插入图片描述
其中,D为d维实空间上的数据集, dist ( p, q)表示D中的2个对象p和q之间的距离。

定义2(核心点与边界点)

对于对象p∈D,给定一个整数MinPts,如果p的Eps邻域内的对象数满足|NEps§|≥MinPts ,则称p为(Eps,MinPts ) 条件下的核心点;不是核心点但落在某个核心点的Eps 邻域内的对象称为边界点。

在这里插入图片描述
定义3(直接密度可达)
如图所示,给定 (Eps,MinPts ) ,如果对象 p 和 q 同时满足如下条件:
p∈ NEps(q) ;
|NEps(q)|≥MinPts (即q是核心点),则称对象 p 是从对象 q 出发,直接密度可达的。
在这里插入图片描述
定义4(密度可达)

如图所示,给定数据集D,当存在一个对象链 p1,p2,p3,…,pn, 其中 p1 = q , p N= p,对于 pi ∈D ,如果在条件(Eps,MinPts ) 下 pi+1从pi 直接密度可达,则称对象p从对象q在条件 (Eps,MinPts )下密度可达。密度可达是非对称的,即p从q密度可达不能推出q也从p密度可达。
在这里插入图片描述
定义5(密度相连)
如图所示,如果数据集D中存在一个对象o,使得对象p和q是从o在 (Eps,MinPts )条件下密度可达的,那么称对象p和q在 (Eps,MinPts )条件下密度相连。密度相连是对称的。
在这里插入图片描述
在这里插入图片描述
DBSCAN算法描述:

在这里插入图片描述
算法改进

在这里插入图片描述
但是,DBSCAN算法对用户设置的参数敏感,Eps和MinPts的设置会影响聚类的效果。针对这一问题,OPTICS(Ordering Points to Identify the Clustering Structure)算法被提出,它通过引入核心距离和可达距离,使得聚类算法对输入的参数不敏感。

DBSCAN算法实现

from sklearn import datasets
import numpy as np
import random
import matplotlib.pyplot as plt
def findNeighbor(j,X,eps):
    N = []
    for p in range(X.shape[0]):  # 找到所有邻域内对象
        temp = np.sqrt(np.sum(np.square(X[j]-X[p])))
# 欧氏距离
        if(temp<=eps):
            N.append(p)
    return N
def dbscan(X,eps,min_Pts):
    k=-1
    NeighborPts = []  # array,某点领域内的对象
    Ner_NeighborPts = []
    fil = []  # 初始时已访问对象列表为空
    gama = [x for x in range(len(X))  ]# 初始所有点标为未访问
    cluster = [-1 for y in range(len(X))]
    while len(gama)>0:
        j = random.choice(gama)
        gama.remove(j)  #未访问列表中移除
        fil.append(j)   #添加入访问列表
        NeighborPts = findNeighbor(j,X,eps)
        if len(NeighborPts) < min_Pts:
            cluster[j] = -1   #标记为噪声点
        else:
            k = k+1
            cluster[j] = k
            for i in NeighborPts:
                if i not in fil:
                    gama.remove(i)
                    fil.append(i)
                    Ner_NeighborPts=findNeighbor(i,X,eps)
                    if len(Ner_NeighborPts) >= min_Pts:
                        for a in Ner_NeighborPts:
                            if a not in NeighborPts:
                                NeighborPts.append(a)
                    if (cluster[i]==-1):
                        cluster[i]=k
    return cluster
X1, y1 = datasets.make_circles(n_samples=1000, factor=.6,noise=.05)
X2, y2 = datasets.make_blobs(n_samples = 300, n_features = 2, centers = [[1.2,1.2]], cluster_std = [[.1]],random_state = 9)
X = np.concatenate((X1, X2))
eps = 0.08
min_Pts = 10
C = dbscan(X,eps,min_Pts)
plt.figure(figsize = (12, 9), dpi = 80)
plt.scatter(X[:,0],X[:,1],c = C)
plt.show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shi_jiaye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值