zoukankan      html  css  js  c++  java
  • Python机器学习(五十四)SciPy k均值聚类

    聚类(K-means clustering)是在一组未标记的数据中,将相似的数据(点)归到同一个类别中的方法。聚类与分类的最大不同在于分类的目标事先已知,而聚类则不知道。

    K-means是聚类中最常用的方法之一,它是基于点与点的距离来计算最佳类别归属,即靠得比较近的一组点(数据)被归为一类。

    K-means的算法原理如下:

    1. 随机选取k个点作为中心点
    2. 遍历所有点,将每个点划分到最近的中心点,形成k个聚类
    3. 根据聚类中点之间的距离,重新计算各个聚类的中心点
    4. 重复2-3步骤,直到这k个中线点不再变化(收敛了),或达到最大迭代次数

    SciPy中,cluster包已经很好地实现了K-Means算法,我们可以直接使用它。

    使用SciPy中的k均值聚类功能

    导入 K-Means

    导入要使用的模块:

    from SciPy.cluster.vq import kmeans,vq,whiten

    样本数据生成

    准备样本数据:

    from numpy import vstack,array
    from numpy.random import rand
    
    # 具有3个特征值的样本数据生成
    data = vstack((rand(100,3) + array([.5,.5,.5]),rand(100,3)))

    上面的程序将生成以下样本数据:

    [[9.08178137e-01 1.13621041e+00 1.37775140e+00]
     [8.03177864e-01 8.61501332e-01 1.36841278e+00]
     [1.20454835e+00 5.80649650e-01 1.02232192e+00]
     [5.78773849e-01 1.29952832e+00 9.01418916e-01]
     [1.00196410e+00 1.15425599e+00 5.68536029e-01]
     [1.12860722e+00 7.63647578e-01 6.03910440e-01]
     [1.29241389e+00 1.33779906e+00 1.38514877e+00]
     [6.98439684e-01 1.10509272e+00 7.13420372e-01]
    ...

    数据白化预处理

    数据白化预处理是一种常见的数据预处理方法,作用是去除样本数据的冗余信息。

    可以使用以下代码来白化数据。

    # 白化数据
    data = whiten(data)

    分成3个聚类

    我们会把样本数据分成3个聚类,使用kmeans()函数计算3个聚类的中心点。

    # 计算 K = 3 时的中心点
    centroids, _ = kmeans(data, 3)

    打印中心点:

    print(centroids)

    输出

    [[2.33037825 1.63328035 1.76901626]
     [0.69611182 1.48776606 1.25827876]
     [2.39743406 2.98803923 2.99201397]]

    使用vq函数将样本数据中的每个样本点分配给一个中心点,形成3个聚类。

    # 将样本数据中的每个值分配给一个中心点,形成3个聚类。
    # 返回值clx标出了对应索引样本的聚类,dist表示对应索引样本与聚类中心的距离。
    clx, dist = vq(data, centroids)

    输出聚类

    # 打印聚类
    print(clx)

    输出

    [1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 0 1 0 0 1 0
     1 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0
     0 0 1 0 0 0 0 0 1 1 1 0 1 0 1 1 1 0 1 0 0 1 0 0 1 1 0 2 0 2 0 2 2 2 0 2 0
     0 0 2 2 2 2 2 0 0 0 2 2 2 2 0 0 0 2 2 2 0 2 0 2 2 0 2 0 2 2 2 2 2 2 0 2 2
     2 2 2 2 2 0 2 0 0 2 2 0 0 0 0 0 0 0 2 0 0 2 0 0 2 2 2 2 2 2 2 0 2 0 0 2 2
     2 0 2 2 0 0 2 2 2 2 0 2 0 0 2]

    上面数组中,值0,1,2分别表示3个聚类,某个位置上的值表示该对应索引数据属于哪个聚类,例如clx[0]=1,表明data[0]样本属于聚类1。

  • 相关阅读:
    kis 7.5和360似乎存在兼容性的问题,
    mysql timeout
    update users set a=1 where id in (1,2,3)这句在rails中该如何写呢
    mysql数据库 text类型的长度限制,使用change_column来进行长度的修改并不影响原有数据
    杭州的一个托管idc商
    User.find_each
    ruby 批量更新
    mongodb kt双机房灾备
    imagemagick使用
    kingdee kis
  • 原文地址:https://www.cnblogs.com/huanghanyu/p/13163272.html
Copyright © 2011-2022 走看看