• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Python实现K-Means、DBSCAN聚类降噪并对比

武飞扬头像
kabit
帮助1

1.导包

  1.  
    import csv
  2.  
    import numpy as np
  3.  
    import matplotlib.pyplot as plt
  4.  
    import random
  5.  
    import pywt
  6.  
    from sklearn.cluster import KMeans
  7.  
    from sklearn.cluster import DBSCAN

2.导数据

  1.  
    #特征
  2.  
    pack=[]
  3.  
    #num
  4.  
    number=[]
  5.  
     
  6.  
    csv_file = csv.reader(open('data8.csv'))
  7.  
    for content in csv_file:
  8.  
    content=list(map(float,content))
  9.  
    if len(content)!=0:
  10.  
    pack.append(content[0:1])
  11.  
     
  12.  
    packs=[]
  13.  
    for i in pack:
  14.  
    packs.append(i[0])
  15.  
    for i in range(len(pack)):
  16.  
    number.append(i 1)
学新通

3.看数据格式

  1.  
    fig = plt.gcf()
  2.  
    fig.set_size_inches(20, 5)
  3.  
    ax = plt.axes()
  4.  
    ax.spines['top'].set_visible(False)
  5.  
    ax.spines['right'].set_visible(False)
  6.  
    plt.rcParams['xtick.direction'] = 'in'#将x周的刻度线方向设置向内
  7.  
    plt.rcParams['ytick.direction'] = 'in'#将y轴的刻度方向设置向内
  8.  
    plt.tick_params(labelsize=22)
  9.  
    plt.plot(packs,linewidth=3.0)
  10.  
    plt.xlim(0,900)
  11.  
    plt.xlabel('Serial Number',fontsize = 22,fontweight='bold')
  12.  
    plt.ylabel('Packs Price',fontsize = 22,fontweight='bold')

学新通

可以明显地看出有异常数据

  1.  
    plt.boxplot(packs)
  2.  
    plt.show()

学新通

4.使用K-Means聚类

  1.  
    #Kmeans
  2.  
    kmeans = KMeans(n_clusters=3, random_state=10).fit(pack)
  3.  
    pack=np.array(pack)
  4.  
    plt.scatter(number,pack[:, 0],c=kmeans.labels_)
  5.  
    plt.title('K-means')
  6.  
    fig = plt.gcf()
  7.  
    fig.set_size_inches(30, 10.5)
  8.  
    plt.show()

 学新通

 5.去除噪声节点

  1.  
    res1 = pack[(kmeans.labels_ == 0)]
  2.  
    res2 = pack[(kmeans.labels_ == 0)]
  3.  
    res=[]
  4.  
    for i in res1:
  5.  
    res.append(i[0])
  6.  
    for i in res2:
  7.  
    res.append(i[0])
  1.  
    fig = plt.gcf()
  2.  
    fig.set_size_inches(20, 5)
  3.  
    ax = plt.axes()
  4.  
    ax.spines['top'].set_visible(False)
  5.  
    ax.spines['right'].set_visible(False)
  6.  
    plt.rcParams['xtick.direction'] = 'in'#将x周的刻度线方向设置向内
  7.  
    plt.rcParams['ytick.direction'] = 'in'#将y轴的刻度方向设置向内
  8.  
    plt.tick_params(labelsize=22)
  9.  
    plt.plot(res,linewidth=3.0)
  10.  
    plt.xlim(0,900)
  11.  
    plt.xlabel('Serial Number',fontsize = 22,fontweight='bold')
  12.  
    plt.ylabel('Packs Price',fontsize = 22,fontweight='bold')

学新通

  1.  
    plt.boxplot(res)
  2.  
    plt.show()

学新通

可以看出,使用K-Means聚类降噪可以去除噪音节点,但是分了过多的类别,导致想保留顺序需要一列辅助的编号列,比较麻烦。

6.使用DBSCAN聚类降噪

此次需要自行调参

  1.  
    dbscan = DBSCAN(eps=10,min_samples=2).fit(pack)
  2.  
    plt.scatter(number,pack[:, 0],c=dbscan.labels_)
  3.  
    plt.title('DBSCAN')
  4.  
    fig = plt.gcf()
  5.  
    fig.set_size_inches(18.5, 10.5)
  6.  
    plt.show()

学新通

 7.去除噪音节点

  1.  
    r1 = pack[(dbscan.labels_ == 0)]
  2.  
    fig = plt.gcf()
  3.  
    fig.set_size_inches(20, 5)
  4.  
    ax = plt.axes()
  5.  
    ax.spines['top'].set_visible(False)
  6.  
    ax.spines['right'].set_visible(False)
  7.  
    plt.rcParams['xtick.direction'] = 'in'#将x周的刻度线方向设置向内
  8.  
    plt.rcParams['ytick.direction'] = 'in'#将y轴的刻度方向设置向内
  9.  
    plt.tick_params(labelsize=22)
  10.  
    plt.plot(r1,linewidth=3.0)
  11.  
    plt.xlim(0,900)
  12.  
    plt.xlabel('Serial Number',fontsize = 22,fontweight='bold')
  13.  
    plt.ylabel('Packs Price',fontsize = 22,fontweight='bold')

学新通

较好的保留了顺序,两组即可区分出异常点位。

8.结论

对数据去噪而言,DBSCAN相比较K-Means有更好的区分噪音能力,但需要人工调整eps范围,而这一点需要对数据特性非常了解才可以。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhiabfcc
系列文章
更多 icon
同类精品
更多 icon
继续加载