箱型图实现分割点选取

在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算法的代码实现中的训练集计算结果。
结果:

箱型图实现分割点选取_第1张图片

箱型图实现分割点选取_第2张图片

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

你可能感兴趣的:(箱型图实现分割点选取)