ITPub博客

首页 > 数据库 > 数据库开发技术 > 异常检测方法No.002

异常检测方法No.002

原创 数据库开发技术 作者:quincyqiang 时间:2021-05-26 09:07:44 0 删除 编辑

局部异常因子算法

LOF算法是基于密度的局部异常数据挖掘算法中较为经典的算法。该方法通过计算数据集中每个对象的局部异常因子LOF,来衡量数据对象的异常程度。如果局部异常因子越大,则认为该数据是异常数据对象的程度也就越大,反之则越小。LOF算法衡量一个数据对象是否是异常数据不仅仅取决于它与周围邻居之间距离的大小,而且还与它周围邻居的密度状况有关。

01
数据对象P的K距离
DARLING I LOVE YOU
02
数据对象P的K距离邻域
DARLING I LOVE YOU
03
数据对象P的可达距离
DARLING I LOVE YOU
04
数据对象P的局部可达密度
DARLING I LOVE YOU
05
数据对象P的局部异常因子
DARLING I LOVE YOU
06
算法步骤
DARLING I LOVE YOU
07
单分类与二分类
DARLING I LOVE YOU

花果山上的老猴子,一生阅猴无数,但是从来没有见过其他物种。有一天,猪八戒来到花果山找他们的大王。老猴子一声令下,把这个东西给我绑起来。这里,老猴子很清楚的知道这个外来物种不是同类,但是它究竟是什么,不得而知。这就是一个简单的单分类的例子。而美猴王看到这个场景后哈哈大笑,把这个呆子给我抬过来。这就是二分类。二者的显著区别在于:二分类不但能得出来这个东西不是猴子,他还能告诉你这个东西叫呆子。

08
算法实现
DARLING I LOVE YOU
from scipy.spatial.distance import cdistimport numpy as np

class LOF: def __init__(self, data, k, epsilon=1.0): self.data = data self.k = k self.epsilon = epsilon self.N = self.data.shape[0]
def get_dist(self): # 计算欧式距离矩阵 return cdist(self.data, self.data)
def _kdist(self, arr): # 计算k距离 inds_sort = np.argsort(arr) neighbor_ind = inds_sort[1:self.k + 1] # 邻域内点索引 return neighbor_ind, arr[neighbor_ind[-1]]
def get_rdist(self): # 计算可达距离 dist = self.get_dist() nei_kdist = np.apply_along_axis(self._kdist, 1, dist) nei_inds, kdist = zip(*nei_kdist) for i, k in enumerate(kdist): ind = np.where(dist[i] < k) # 实际距离小于k距离,则可达距离为k距离 dist[i][ind] = k return nei_inds, dist
def get_lrd(self, nei_inds, rdist): # 计算局部可达密度 lrd = np.zeros(self.N) for i, inds in enumerate(nei_inds): s = 0 for j in inds: s += rdist[j, i] lrd[i] = self.k / s return lrd
def run(self): # 计算局部离群因子 nei_inds, rdist = self.get_rdist() lrd = self.get_lrd(nei_inds, rdist) score = np.zeros(self.N) for i, inds in enumerate(nei_inds): N = len(inds) lrd_nei = sum(lrd[inds]) score[i] = lrd_nei / self.k / lrd[i]
return score, np.where(score > self.epsilon)[0]

if __name__ == '__main__': np.random.seed(42) X_inliers = 0.3 * np.random.randn(100, 2) X_inliers = np.r_[X_inliers + 2, X_inliers - 2] X_outliers = np.random.uniform(low=-4, high=4, size=(20, 2)) data = np.r_[X_inliers, X_outliers]
lof = LOF(data, 5, epsilon=1.2) score, out_ind = lof.run() outliers = data[out_ind]
import matplotlib.pyplot as plt
plt.scatter(data[:, 0], data[:, 1], color='b') plt.scatter(outliers[:, 0], outliers[:, 1], color='r') plt.show()
09
参考文献
DARLING I LOVE YOU

https://www.pianshen.com/article/6858893586/

https://blog.csdn.net/slx_share/article/details/87861485?utm_term=lof%E5%BC%82%E5%B8%B8%E6%A3%80%E6%B5%8B%E7%AE%97%E6%B3%95&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-1-87861485&spm=3001.4430

https://blog.csdn.net/wangyibo0201/article/details/51705966

END

添加助手微信回复研究方向或专业即可加入我们的微信交流群或QQ交流群





扫码关注我们

携手2021年,为梦想启程!



原文作者:ChallengeHub;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2019-01-07

  • 博文量
    350
  • 访问量
    161006