系列文章目录
Python异常检测- Isolation Forest(孤立森林)
python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS)
python异常检测-局部异常因子(LOF)算法
文章目录
- 系列文章目录
- 前言
- 一、DBSCAN算法原理
- 二、DBSCAN算法流程
- 三、DBSCAN算法的优缺点
- 四、DBSCAN算法的python实现
前言
基于DBSCAN算法的异常检测是一种非监督学习方法,它可以在没有先验知识或标签的情况下检测数据中的异常值。
一、DBSCAN算法原理
DBSCAN,全称Density-Based Spatial Clustering of Applications with Noise,是一种基于密度的聚类算法。该算法假设异常值在数据中的密度要么很低,要么与其他数据点分离得很远。在DBSCAN算法中,密度被定义为每个点周围一定距离内存在的其他点数目。如果一个点周围的密度大于某个预设的阈值,则将该点视为核心点,否则将其视为噪声点。
DBSCAN的基本原理:
-
Eps:一个阈值,定义了邻域的半径,即在多大的距离范围内,一个点被认为是另一个点的邻域。
-
MinPts:一个阈值,定义了核心点的邻域内至少需要包含的点数,当一个点的Eps邻域内包含的点数大于或等于MinPts,这这个点被认为是核心点。
-
核心点:在Eps邻域内至少有MinPts个点的点。
-
边界点:邻域内没有达到MinPts个点,但某个核心点的邻域内的点。
-
噪声点:既不是核心点也不是边界点的点,这些点通常都是异常值。
二、DBSCAN算法流程
假定DBSCAN算法的输入和输出如下图所示,对于无法形成聚类簇的孤立点,即为异常点(噪声点),DBSCAN算法的流程如下:
1.选择Eps和MinPts;
2.随机选择一个未访问的数据点;
3.对于参数Eps和MinPts,则找出所有从选择点的p密度可达的数据对象点,形成一个簇;
4.重复步骤2,将新发现的点也加入该簇,直到簇中没有新的点可以加入;
5.如果该簇中的点数目大于某个预设的最小点数,则将该簇标记为核心点;
6.重复步骤2-5,直到所有的点都被访问过。
7.将未被标记为核心点的点视为噪声点;
8.对未被标记的核心点进行簇的扩展,将其与可达的核心点合并成一个簇;
9.将每个簇视为一个异常检测器,使用该簇中的点来检测数据中的异常值。
三、DBSCAN算法的优缺点
DBSCAN算法的不需要先验知识或标签,而且可以处理不同形状和大小的簇。但是,它对密度参数的选择比较敏感,因此需要进行参数调优。
DBSCAN的优点:
-
能够发现任意形状的聚类,并且对数据集的噪声点数量敏感度低。
-
不需要指定预先确定的聚类数。
DBSCAN的缺点:
-
参数Eps和MinPts的选择对聚类结果影响很大。
-
对于非密集区域的数据集,DBSCAN的性能不如K-means算法。
四、DBSCAN算法的python实现
使用scikit-learn库中的DBSCAN算法进行异常值检测,首先需要安装scikit-learn库
pip install scikit-learn
然后按照以下步骤来实现:
- 导入所需的库;
- 准备数据集;
- 创建模型并训练数据;
- 使用模型预测类别,并识别出噪声点(即异常值)
具体的python代码如下:
# 导入必要的库
from sklearn.cluster import DBSCAN
from sklearn.datasets import make_moons
from sklearn.preprocessing import StandardScaler
import numpy as np# 生成一个模拟数据集
X, labels = make_moons(n_samples=200, noise=0.05, random_state=0)
X = StandardScaler().fit_transform(X) # 标准化数据# 创建一个DBSCAN实例
db = DBSCAN(eps=0.3, min_samples=5)# 拟合数据
db.fit(X)# 获取每个样本的簇标签
labels = db.labels_# 噪声点的标签为 -1
anomalies = X[labels == -1]# 打印异常值的数量
print(f"Number of anomalies detected: {len(anomalies)}")# 如果你想可视化这些点
import matplotlib.pyplot as plt
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
# 高亮显示异常值
plt.scatter(anomalies[:, 0], anomalies[:, 1], color='r', marker='x')
plt.title("Anomaly Detection using DBSCAN")
plt.show()
参考资料
统计学&Python】数据异常如何检验?14种检验方法!
数据处理和分析之数据预处理:异常值处理(DBSCAN算法在异常值检测中的应用)
基于dbscan算法的异常检测