使用Pycluster包进行聚类分析实例

使用Pycluster包进行聚类分析实例

Esri 中国 卢萌

 

         “方以类聚,物以群分,吉凶生矣“

——周易·系辞上

 

人类在几千年前就认识到了所谓的聚类和分类,是用来认知和描述万事万物之间关系的主要方法。一个没读什么书小贩,也知道将不同色泽和品相的水果分开,可以卖不同的价格。所以不论是否受过高等教育,聚类和分类的思想都根深蒂固的在人类的思想中。

 

聚类是数据挖掘的主要手段之一,对于探索数据之间的规律有着重要的作用。但是很多想做数据分析的同学限于没有时间去写各种算法,只能停留在算法描述上面。

 

所以这里给大家介绍一个很好很强大的开源包:Pycluster包。

 

Pycluster包是东京大学医学研究所,人类基因研究中心的米歇尔德勋(Michiel de Hoon),星矢井本(Seiya Imoto),宫野悟(Satoru Miyano)等人编写的开源算法工具包,提供了C/C++、python和 Perl三个版本,因为本人主要玩的python,所以这里主要讲其中的Pycluster包,其他的内容,可以下载详细文档(本文中的代码、数据和文档,在最下面的链结中有,我放的是百度云盘)。

 

Pycluster封装了基于划分的算法中的两个最经典的算法K-means和k-medoids,以及基于层次的算法,主要还是说了k-means和k-medoids算法,算法的实行描述我就不详细说了,网上资料大把多。

下面解析一下整个包实现的代码以及各种参数说明:其中斜体是我写的注释。

# -*- coding:utf-8 -*-

'''

Created on 2015-6-3

 

@author: godxia

'''

import Pycluster as pc

import numpy as np

import matplotlib.pylab as pl

 

def myCKDemo(filename,n):

    #以下两个语句是获取数据,用于聚类分析的数据位于第3和第4列(从0开始计算)   

    data = np.loadtxt(filename, delimiter = "," ,usecols=(3,4))

    #第8和第9列,保存了城市的经纬度坐标,用于最后画散点图

    xy = np.loadtxt(filename, delimiter = "," ,usecols=(8,9))

    #clustermap是聚类之后的集合,记录每一组数据的类别id

    clustermap = pc.kcluster(data, n)[0]

    #centroids 是分组聚类之后的聚类中心坐标

    centroids = pc.clustercentroids(data, clusterid=clustermap)[0]

    #m是距离矩阵

    m = pc.distancematrix(data)

 

    #mass 用来记录各类的点的数目

    mass = np.zeros(n)

    for c in clustermap: 

        mass[c] += 1 

   

   

    #sil是轮廓系统矩阵,用于记录每个簇的大小

    sil = np.zeros(n*len(data)) 

    sil.shape = ( len(data), n ) 

   

    for i in range( 0, len(data) ): 

        for j in range( i+1, len(data) ): 

            d = m[j][i] 

            sil[i, clustermap[j] ] += d 

            sil[j, clustermap[i] ] += d 

 

    for i in range(0,len(data)): 

        sil[i,:] /= mass 

   

    #s轮廓系数是一个用来评估聚类效果的参数

    #值在-1 —— 1之间,值越大,表示效果越好。

    #小于0,说明与其簇内元素的平均距离小于最近的其他簇,表示聚类效果不好。

    #趋近与1,说明聚类效果比较好。

    s=0 

    for i in range( 0, len(data) ): 

        c = clustermap[i] 

        a = sil[i,c] 

        b = min(sil[i,range(0,c)+range(c+1,n)]) 

        si = (b-a)/max(b,a)

        s+=si 

   

    print n, s/len(data) 

   

    #使用matplotlib画出散点图。

    fig, ax = pl.subplots()

    #cmap是用于区分不同类别的颜色

    cmap = pl.get_cmap('jet', n)

    cmap.set_under('gray')

    #xy是经纬度,主要为了通过经纬度来画出不同城市在地理上的位置

    x = [list(d)[0] for d in xy]   

    y = [list(d)[1] for d in xy] 

    cax = ax.scatter(x, y, c=clustermap, s=30, cmap=cmap, vmin=0, vmax=n)

    pl.show() 

 

if __name__ == '__main__':

    #filename是数据c2.txt所在的路径,改成自己机器上的路径即可

    filename = r"e:\c2.txt"

    #n是预设分成几类。

    n = 5

    myCKDemo(filename,n)   

 

最终计算的结果如下:(当然,你运行之后显示的颜色可能和我这里不同,因为不同的类别颜色画出来的时候,是随机的)。


可以很明显的看出长江气候带,秦岭-淮河气候带、天山南北麓气候带等,通过温度属性进行聚类,空间位置不参与计算,能够很明显的划分出中国的气候带分布情况,说明聚类本身对于数据之间的关系模式的探索效果是非常显著。

 

最后,如果你复制的代码无法运行,可能是因为格式问题,因为python是严格缩进的,你可以下载我下面共享的源代码文件。注意要先安装Pycluster包和matplotlib包。

 

其中:c2.txt是数据,cluster.pdf 是官方文档,kclusterDemo.py 是我的python代码源文件(我用的utf-8编码的),Pycluster-1.52.win32-py2.7.exe是我使用的Pycluster包的版本,我用的python2.7 如果你用的其他版本,可以去在以下地址下载对应你的python版本的包:

http://bonsai.hgc.jp/~mdehoon/software/cluster/software.htm#pycluster

 

最后,云盘下载地址如下:

链接:http://pan.baidu.com/s/1npMkm 密码:0b2l

 

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虾神说D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值