箱型图实现分割点选取
2018-11-27 本文已影响12人
谜一样的巴扎嘿
在LOF算法中,对于k值的选取格外重要,它直接影响了最终结果的有效程度。
在这里采用箱型图实现数据的分层与k值选取。
源自https://zhuanlan.zhihu.com/p/37753692
def box(data, legend=True):
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.style.use("ggplot")
plt.figure()
# 如果不是DataFrame格式,先进行转化
if type(data) != pd.core.frame.DataFrame:
data = pd.DataFrame(data)
p = data.boxplot(return_type='dict')
warming = pd.DataFrame()
y = p['fliers'][0].get_ydata()
y.sort()
for i in range(len(y)):
if legend == True:
plt.text(1, y[i] - 1, y[i], fontsize=10, color='black', ha='right')
if y[i] < data.mean()[0]:
form = '低'
else:
form = '高'
warming = warming.append(pd.Series([y[i], '偏' + form]).T, ignore_index=True)
print(warming)
plt.show()
box(outliers1['local outlier factor'].tolist()+inliers1['local outlier factor'].tolist(), legend=True)
其中outliers1、inliers1是选自LOF算法的代码实现中的训练集计算结果。
结果:


可以看到的是选择2.x的k值比较合理,其实选择7.4作为k值也是有道理的,原来在代码中通过不断的尝试我们采用了5。