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

LOF算法是基于密度的局部异常数据挖掘算法中较为经典的算法。该方法通过计算数据集中每个对象的局部异常因子LOF,来衡量数据对象的异常程度。如果局部异常因子越大,则认为该数据是异常数据对象的程度也就越大,反之则越小。LOF算法衡量一个数据对象是否是异常数据不仅仅取决于它与周围邻居之间距离的大小,而且还与它周围邻居的密度状况有关。
花果山上的老猴子,一生阅猴无数,但是从来没有见过其他物种。有一天,猪八戒来到花果山找他们的大王。老猴子一声令下,把这个东西给我绑起来。这里,老猴子很清楚的知道这个外来物种不是同类,但是它究竟是什么,不得而知。这就是一个简单的单分类的例子。而美猴王看到这个场景后哈哈大笑,把这个呆子给我抬过来。这就是二分类。二者的显著区别在于:二分类不但能得出来这个东西不是猴子,他还能告诉你这个东西叫呆子。
from scipy.spatial.distance import cdistimport numpy as npclass LOF:def __init__(self, data, k, epsilon=1.0):self.data = dataself.k = kself.epsilon = epsilonself.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] = kreturn nei_inds, distdef get_lrd(self, nei_inds, rdist):# 计算局部可达密度lrd = np.zeros(self.N)for i, inds in enumerate(nei_inds):s = 0for j in inds:s += rdist[j, i]lrd[i] = self.k / sreturn lrddef 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 pltplt.scatter(data[:, 0], data[:, 1], color='b')plt.scatter(outliers[:, 0], outliers[:, 1], color='r')plt.show()
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

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



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