異常檢測—LOF算法簡介以及Python實現


LOF(Local Outlier Factor)算法是基於密度的異常點檢測算法,適合於高維數據檢測。

核心思想
離群點處的密度應該較鄰域內其他點的密度小。

基本概念
k距離:對於點p,將其他點與之距離進行從小到大排序,第k個即為k距離
k距離鄰域:到點p的距離小於等於k距離點,共k個
可達距離:若到點p的實際距離小於k距離,則為k距離,反之為實際距離
局部可達密度:鄰域內點到p點可達距離平均值的倒數。(注意方向不要搞反)

 

 局部離群因子:領域內點的局部可達密度的均值除以p點的局部可達密度

 

 局部離群因子(LOF)的大小代表該點為離群點的可信度。即因子越大,該點越可能是離群點。

代碼示例

from scipy.spatial.distance import cdist import 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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM