背景:有不同型号的焊接头在一段时间的磨损程度,当磨损程度出现异常了,报警,提醒更换焊接头
难点:如何确定怎样算异常,数据分析方法
知识点:DBSCAN算法
思路:
1.将磨损数据进行差分求绝对值取平均值作为聚类算法的半径,项目部署后设置每5min自动运行一次,每次只取后面20个值进行聚类分析,找出异常值(噪音点),一旦找到,就预警。
DBSCAN算法介绍
DBSCAN(Density-Based Spatial Clustering of Application with Noise)是一种典型的基于密度的聚类算法,在DBSCAN算法中将数据点分为一下三类:
- 核心点:在半径Eps内含有超过MinPts数目的点
- 边界点:在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内
- 噪音点:既不是核心点也不是边界点的点(离群点)
性质:
1、DBSCAN聚类算法的优缺点包括:
不需要预先指定簇的数量。
能够识别离群点和噪声点。
能够处理任意形状的簇。
对于密度高的簇能够表现出色。
2、DBSCAN聚类算法的缺点包括:
对于密度低的簇,聚类效果可能不如其他算法。
对于高维数据,聚类效果可能不佳。
3、DBSCAN聚类算法的应用包括:
图像分割
地理信息系统中的空间聚类
计算机视觉中的对象跟踪
社交网络分析中的社群发现
构建
1.两个参数
- eps:它是特定邻域的半径。如果两点之间的距离小于或等于 esp,则将其视为其邻居。
- minPts:给定邻域中形成簇的最小数据点数量。
2.代码
import pandas as pd
from sklearn.cluster import DBSCAN
import numpy as np
# 读取Excel数据
data = pd.read_excel('path')
# 将日期列转换为日期时间类型
data['DATE'] = pd.to_datetime(data['DATE'])
# 取最后10个数据
last_10_data = data[column_name].tail(10000)
print(last_10_data)
# 计算数据差分的绝对值然后求平均值作为半径
radius = np.mean(np.abs(np.diff(last_10_data)))
print("radius:",radius)
last_10_data_array = last_10_data.values.reshape(-1, 1) # 将数据转换为二维数组
# 创建DBSCAN对象
dbscan = DBSCAN(eps=radius, min_samples=10)
# 进行聚类
labels = dbscan.fit_predict(last_10_data_array)
# 标记噪声点
noise_points = np.where(labels == -1)[0] # 找到噪声点的索引
num_noise_points = list(labels).count(-1)
if num_noise_points>0:
print("ALERT: Detected noise points!") # 执行报警逻辑,如发送警报通知等
print("Noise points:", last_10_data.iloc[noise_points]) # 输出噪声点的具体数值
print("噪声点的数目:", num_noise_points)