CBLOF算法-异常检测

57 篇文章 17 订阅
51 篇文章 6 订阅

CBLOF也是一种基于其他机器学习算法的异常检测算法。说到基于,就是CBLOF名字里面的B~Based。而他基于的是其他的聚类算法,所以他就是Cluster-Based。LOF三个字母是Local Outlier Factor,本地异常因子。合起来CBLOF 就是 Cluster-based Local Outlier Factor,基于聚类的本地异常因子。

他的一个基本认知是:数据可能会在多个不同的地方聚集,形成簇。当一个点越接近大簇的时候,他是正常点的概率就越高,反之越低。那么,我们只要在CBLOF里面,套一个聚类算法,就能得到这些簇了。一般,我们会用k-means算法,距离就直接用欧氏距离。于是,我们就有了上图当中的四个簇。这里,我们明显看出来,C2、C3\C4是两个大簇,剩下的C1是个小簇。那么,距离C2、C3或者C4的中心(即K-Means里面的中心,又叫Centroids)越近,就越正常,反之越异常。

数据

用销售和利润的数据。你可以在这里找到:https://community.tableau.com/docs/DOC-1236

来自:https://blog.csdn.net/juwikuang/article/details/108699190

聚类

算法的第一步是聚类。

在聚类之前,我们先对数据进行归一化。这是非常必要的一步。特别是在各种变量的变化范围不一样的情况下。

然后,我们直接用k-means聚类。

km = KMeans(n_clusters=8)
km.fit(X)

聚类以后得到下图:

在这里插入图片描述

大簇小簇

如何判断哪个簇是最大的?

  • 大小是用簇成员的多少(size)来衡量的。

其他的簇,哪个算大簇,哪个算小簇?

  • 有两个原则:绝对多数原则和突降原则

1、绝对多数

定义∣ C ∣表示簇C的大小(size)。我们把这些簇按照大小排列,则有:

从最大簇开始,一个一个的把他们的size加起来,他们的size要达到总size的绝对多数。而这个绝对多数,是一个可以设置的参数α,他的取值范围是0.5到1,一般取0.9。

2、突降

突降是用倍数β来衡量。默认值是5,也就是突降了5倍。

pyod是这样实现的:能找到同时满足两个条件的分割最好。次优是找到满足绝对多数原则的分割。最差是只找到了满足突降原则的分割。
 

large_clusters = []
small_clusters = []
count = 0
clusters  # 已经根据样本数量排好序的簇:由大到小
n_clusters = len(clusters)
sizes  # 存的每个簇的样本数量
MAX_N_POINT_IN_LARGE_CLUSTER  # 大簇的最大样本数量
BETA = 5  # 样本数量下降最大倍数
satisfy_alpha = False
satisfy_beta = False
for i in range(n_clusters):
    if satisfy_alpha and satisfy_beta:
        small_clusters.append(clusters[i])
        continue

    count += sizes[i]
    if count > MAX_N_POINT_IN_LARGE_CLUSTER:
        satisfy_alpha = True

    ratio = sizes[i] / sizes[i + 1]
    if i < n_clusters - 1 and ratio > BETA:
        satisfy_beta = True

    large_clusters.append(clusters[i])

 在这里插入图片描述

Factor 因子

计算CBLOF因子,也就是一个点到最近的大簇的距离。

  • 如果这个点是大簇里面的点,直接计算他到簇中心的距离即可。
  • 如果这个点不是大簇点,分别计算其到所有大簇的距离,选最小的作为因子。
def decision_function(X, labels):
    distances = []
    for p, label in zip(X, labels):
        if label in large_clusters:
            center = km.cluster_centers_[label]
            d = get_distance(p, center)
        else:
            d = min([get_distance(p, center) for center in large_cluster_centers])
        distances.append(d)
    return np.array(distances)

distances = decision_function(X, km.labels)

涉及到了contamination的概念。他是异常检测算法的主要参数。其实他就是表示了异常的比例。一般这个值是1%。

有了contamination,就可以用python里面的百分位函数,找出距离最大的1%的点,把他们作为异常。

threshold = np.percentile(distances, 99)
anomaly_labels = (distances > threshold) * 1

在这里插入图片描述 

————————————————
参考:https://blog.csdn.net/juwikuang/article/details/108699190

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ARIMA算法是一种时间序列预测模型,可以通过对历史数据进行分析和预测来检测异常。下面是使用Python实现ARIMA算法进行异常检测的步骤: 1. 导入必要的库: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.arima_model import ARIMA ``` 2. 加载数据并进行预处理: ```python # 加载数据 data = pd.read_csv('data.csv', header=None) # 转换为时间序列 ts = pd.Series(data[1].values, index=pd.to_datetime(data[0], unit='s')) ``` 3. 绘制时间序列图来观察数据: ```python plt.plot(ts) plt.show() ``` 4. 对时间序列进行差分,以便于进行平稳性检验: ```python diff_1 = ts.diff(1).dropna() plt.plot(diff_1) plt.show() ``` 5. 进行平稳性检验: ```python from statsmodels.tsa.stattools import adfuller def test_stationarity(timeseries): # Dickey-Fuller test: result = adfuller(timeseries) print('ADF Statistic: %f' % result[0]) print('p-value: %f' % result[1]) print('Critical Values:') for key, value in result[4].items(): print('\t%s: %.3f' % (key, value)) test_stationarity(diff_1) ``` 如果p-value小于0.05,则认为时间序列是平稳的。 6. 构建ARIMA模型并训练: ```python model = ARIMA(ts, order=(1, 1, 1)) results_ARIMA = model.fit(disp=-1) ``` 7. 预测并绘制预测结果: ```python pred = results_ARIMA.predict(start='2019-08-01', end='2019-08-31', dynamic=True) plt.plot(ts) plt.plot(pred, color='red') plt.show() ``` 8. 计算预测误差并进行异常检测: ```python residuals = ts - pred mean = np.mean(residuals) std = np.std(residuals) threshold = mean + 3*std anomalies = [i for i in range(len(residuals)) if (residuals[i] > threshold or residuals[i] < -threshold)] print('Anomalies:', anomalies) ``` 以上就是使用Python实现ARIMA算法进行异常检测的步骤。需要注意的是,ARIMA算法需要时间序列数据满足平稳性才能进行预测,因此需要对数据进行预处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值