【机器学习】密度聚类DBSCAN与异常检测

聚类有以下几种

(1)K均值聚类步骤:1.随机选择k个样本作为初始均值向量;2.计算样本到各均值向量的距离,把它划到距离最小的簇;3.计算新的均值向量;4.迭代,直至均值向量未更新或到达最大次数。缺点:需要输入k,算法速度依赖于初始化的好坏,不能处理非球形簇。

(2)密度聚类步骤:DBSCAN,找到几个由密度可达关系导出的最大的密度相连样本集合。1.找到任意一个核心点,对该核心点进行扩充;2.扩充方法是寻找从该核心点出发的所有密度相连的数据点;3遍历该核心的邻域内所有核心点,寻找与这些数据点密度相连的点。优点:抗噪声,处理任意形状和大小的簇。缺点:数据量大时内存消耗大,需要自定义参数多。优点:不需要确定要划分的聚类个数。

(3)层次聚类步骤:AGNES,1.先将数据集中的每个样本看作一个初始聚类簇;2.找到距离最近的两个聚类簇进行合并。优点:无需目标函数,没有局部极小问题或是选择初始点的问题。缺点:代价大。

DBSCAN聚类算法(密度聚类)

下面这些点是分布在样本空间的众多样本,现在我们的目标是把这些在样本空间中距离相近的聚成一类。我们发现A点附近的点密度较大,红色的圆圈根据一定的规则在这里滚啊滚,最终收纳了A附近的5个点,标记为红色也就是定为同一个簇。其它没有被收纳的根据一样的规则成簇。(形象来说,我们可以认为这是系统在众多样本点中随机选中一个,围绕这个被选中的样本点画一个圆,规定这个圆的半径以及圆内最少包含的样本点,如果在指定半径内有足够多的样本点在内,那么这个圆圈的圆心就转移到这个内部样本点,继续去圈附近其它的样本点,类似传销一样,继续去发展下线。等到这个滚来滚去的圈发现所圈住的样本点数量少于预先指定的值,就停止了。那么我们称最开始那个点为核心点,如A,停下来的那个点为边界点,如B、C,没得滚的那个点为离群点,如N)。

基于密度这点有什么好处呢,我们知道kmeans聚类算法只能处理球形的簇,也就是一个聚成实心的团(这是因为算法本身计算平均距离的局限)。但往往现实中还会有各种形状,比如下面两张图,环形和不规则形,这个时候,那些传统的聚类算法显然就悲剧了。于是就思考,样本密度大的成一类,这就是DBSCAN聚类算法。

DBSCAN参数选择

上面提到了红色圆圈滚啊滚的过程,这个过程就包括了DBSCAN算法的两个参数,这两个参数比较难指定,公认的指定方法简单说一下:

  • 半径:半径是最难指定的 ,大了,圈住的就多了,簇的个数就少了;反之,簇的个数就多了,这对我们最后的结果是有影响的。我们这个时候K距离可以帮助我们来设定半径r,也就是要找到突变点,比如:

以上虽然是一个可取的方式,但是有时候比较麻烦 ,大部分还是都试一试进行观察,用k距离需要做大量实验来观察,很难一次性把这些值都选准。 

  • MinPts:这个参数就是圈住的点的个数,也相当于是一个密度,一般这个值都是偏小一些,然后进行多次尝试。

!!!

最后还有很多聚类方法,比如谱聚类,密度最小值聚类等等。

实验效果如下,来自我的github ?

引申:对于离群点的检测(异常检测),可以用

1. DBSCAN算法

2. 箱型图

箱线图判断异常值的标准以四分位数四分位距为基础,四分位数具有一定的耐抗性,多达25%的数据可以变得任意远而不会很大地扰动四分位数,所以异常值不会影响箱形图的数据形状,箱线图识别异常值的结果比较客观。由此可见,箱线图在识别异常值方面有一定的优越性。

import pandas as pd
import numpy as np
from collections import Counter
def detect_outliers(df,n, features):
    outlier_indices = []
    for col in features:
        Q1 = np.percentile(df[col], 25)
        Q3 = np.percentile(df[col], 75)
        IQR = Q3 - Q1
        outlier_step = 1.5 * IQR
        outlier_list_col = df[(df[col] < Q1 - outlier_step) | (df[col] > Q3 + outlier_step)].index
        outlier_indices.extend(outlier_list_col)
    outlier_indices = Counter(outlier_indices)
    multiple_outliers = list( k for k, v in outlier_indices.items() if v > n)
    return multiple_outliers

df = pd.read_csv("data.csv")
Outliers_to_drop = detect_outliers(df, 2 ["Col1", "Col2", "Col3", "Col4"])
df = df.drop(Outliers_to_drop, axis=0).reset_index(drop=True)

3. iForest 孤立森林是一个基于Ensemble的快速异常检测方法(详细介绍

参考:

DBSCAN聚类算法——机器学习(理论+图解+python代码(看这里?)

DBSCAN密度聚类算法

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值