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

2021-09-11 04:53:22 字數 3008 閱讀 3664

lof(local outlier factor)演算法是基於密度的異常點檢測演算法,適合於高維資料檢測。

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

k距離:對於點p,將其他點與之距離進行從小到大排序,第k個即為k距離

k距離鄰域:到點p的距離小於等於k距離點,共k個

可達距離:若到點p的實際距離小於k距離,則為k距離,反之為實際距離

區域性可達密度:鄰域內點到p點可達距離平均值的倒數。(注意方向不要搞反)lrd

(p)=

k∑rd

is

tlrd(p)=\frac

lrd(p)

=∑rd

istk

區域性離群因子:領域內點的區域性可達密度的均值除以p點的區域性可達密度lof

(p)=

∑lrd

klrd

(p

)lof(p)=\frac}

lof(p)

=lrd

(p)k

∑lrd

​​區域性離群因子(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]

defget_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

]]defget_rdist

(self)

:# 計算可達距離

dist = self.get_dist()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

defget_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 / s

return lrd

defrun(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(

)

注:**未經嚴格測試,僅作示例。如有不當之處,請指正。

異常點 離群點檢測演算法 LOF

在資料探勘方面,經常需要在做特徵工程和模型訓練之前對資料進行清洗,剔除無效資料和異常資料。異常檢測也是資料探勘的乙個方向,用於反作弊 偽基站 金融詐騙等領域。異常檢測方法,針對不同的資料形式,有不同的實現方法。常用的有基於分布的方法,在上 下 分位點之外的值認為是異常值 例如圖1 對於屬性值常用此類...

異常點 離群點檢測演算法 LOF

在資料探勘方面,經常需要在做特徵工程和模型訓練之前對資料進行清洗,剔除無效資料和異常資料。異常檢測也是資料探勘的乙個方向,用於反作弊 偽基站 金融詐騙等領域。異常檢測方法,針對不同的資料形式,有不同的實現方法。常用的有基於分布的方法,在上 下 分位點之外的值認為是異常值 例如圖1 對於屬性值常用此類...

異常點 離群點檢測演算法 LOF解析

在資料探勘方面,經常需要在做特徵工程和模型訓練之前對資料進行清洗,剔除無效資料和異常資料。異常檢測也是資料探勘的乙個方向,用於反作弊 偽基站 金融詐騙等領域。異常檢測方法,針對不同的資料形式,有不同的實現方法。常用的有基於分布的方法,在上 下分位點之外的值認為是異常值 例如圖1 對於屬性值常用此類方...