LOF算法初探

最近在科研过程中需要对离群点进行处理,使用了lof算法,现总结一下最近所学。

Local Outlier Factor,局部异常因子算法。
目的是发现数据集中的异常。

它是一个基于密度的算法,数据异常与否并不是确定的,它对每个数据的异常程度根据局部密度做了一个量化。主要是根据样本与周围点的密度比较。

需要理解的几个概念,第k距离与它的邻域,局部密度和离群因子等。有篇文章说的不错:
https://blog.csdn.net/wangyibo0201/article/details/51705966

算法描述:
我使用的功能是在原有数据集中找到异常数据,不是预测新数据中的异常。这不是同一种方案。
首先是计算局部密度,
通过密度计算局部的异常因子,分析异常程度。
#这里即使知道了异常程度,对数据是否异常的判断也比较主观,因为很难确定在哪一个范围内的数据就确实是异常的。带我的那个博士生说建议多练找经验,我觉得这个范围判断存在一定的误差,可能需要结合具体数据进行分析。

时间复杂度:
LOF算法要计算样本点两两之间的距离,时间复杂度是O(n^2)。

接下来是实现,由于时间紧迫,不打算自己写,调sklearn包。虽然大型工程用sklearn比较傻逼,但是做测试实验我觉得也够了。
sklearn 关于lof 的操作,官方文档地址:
https://scikit-learn.org/stable/auto_examples/neighbors/plot_lof_outlier_detection.html#sphx-glr-auto-examples-neighbors-plot-lof-outlier-detection-py

关于参数的理解,看文档写的很清楚。我也参考了一篇写的不错的博客
https://blog.csdn.net/yeziand01/article/details/85234144#LOFsklearn_71

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import numpy
my_matrix=numpy.loadtxt(open("/root/ycr/task01.csv","rb"),delimiter=",",skiprows=0,usecols=(1,2)) #因为只有1,2列数据值有效

#可视化数据集
import matplotlib.pyplot as plt
plt.scatter(my_matrix[:,0],my_matrix[:,1]) #x的第0列绘制在横轴,x的第1列绘制在纵轴
plt.show()



#训练模型
from sklearn.neighbors import LocalOutlierFactor
model = LocalOutlierFactor(n_neighbors=4, contamination=0.03) #定义一个LOF模型,异常比例是3%
model.fit(my_matrix)

#预测模型
y = model.fit_predict(my_matrix)
temp4 = -model._decision_function(my_matrix)



#可视化预测结果
plt.scatter(my_matrix[:,0],my_matrix[:,1],c=temp4) #样本点的颜色由y值决定
plt.show()

#返回异常程度过高的值
for i in range(len(temp4)):
if temp4[i]>1 or temp4[i]<-1:
print(str(i)+'\n'
print(str(my_matrix[i,0])+str(my_matrix[i,0])+'\n')

#stage的详细数据
list_1=[]
list_2=[]
for i in range(len(temp4)):
list_1.append(my_matrix[i,0])
list_2.append(my_matrix[i,1])

#print(list_1)
avg_1=numpy.mean(list_1)
avg_2=numpy.mean(list_2)
print('the first average target is '+str(avg_1))
print('the second average target is '+str(avg_2))