设为首页收藏本站
开启辅助访问
切换到窄版

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2083|回复: 0

K-均值聚类的python代码(原创)

[复制链接]
发表于 2012-5-7 19:18:02 | 显示全部楼层 |阅读模式
生物信息学数据处理中,常常需要用到聚类的算法,下面就常用的k均值做一python实现算法:
第一步:选K个初始聚类中心,z1(1),z2(1),…,zK(1),其中括号内的序号为寻找聚类中心的迭代运算的次序号。聚类中心的向量值可任意设定,例如可选开始的K个模式样本的向量值作为初始聚类中心。
第二步:逐个将需分类的模式样本{x}按最小距离准则分配给K个聚类中心中的某一个zj(1)。假设i=j时, ,则 ,其中k为迭代运算的次序号,第一次迭代k=1,Sj表示第j个聚类,其聚类中心为zj。
第三步:计算各个聚类中心的新的向量值,zj(k+1),j=1,2,…,K求各聚类域中所包含样本的均值向量:
其中Nj为第j个聚类域Sj中所包含的样本个数。以均值向量作为新的聚类中心,可使如下聚类准则函数最小: 在这一步中要分别计算K个聚类中的样本均值向量,所以称之为K-均值算法。
第四步:若 ,j=1,2,…,K,则返回第二步,将模式样本逐个重新分类,重复迭代运算;
若 ,j=1,2,…,K,则算法收敛,计算结束。




python 代码
  • import math
  • def KM(lst,m1,m2):
  •       k_list_1=[]
  •       k_list_2=[]
  •       for value in lst:
  •             deta=abs(value-m1)-abs(value-m2)
  •             if deta>0:
  •                   k_list_1.append(value)
  •                   #print k_list_1
  •             else:
  •                   k_list_2.append(value)
  •                   #print k_list_2
  •       #print k_list_1
  •       #print k_list_2
  •       k1=sum(k_list_1)/float(len(k_list_1))
  •       k2=sum(k_list_2)/float(len(k_list_2))
  •       if (k1==m1 and k2==m2) or (k1==m2 and k2==m1):
  •             return k_list_1,k_list_2,k1,k2
  •       else:
  •             return KM(lst,k1,k2)
  • n=[-1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,-17,18,19,-20,21,22,23,-24,25,26]
  • print KM(n,0,1)

复制代码
运行结果:
  • >>>
  • ([-1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 21, 22, 23, 25, 26], [-17, -20, -24], 12.521739130434783, -20.333333333333332)

复制代码




python本身也提供了一个开源的聚类包
http://www.bioxxx.cn/thread-17804-1-1.html



您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|手机版|Archiver|生物信息学论坛 ( 蜀ICP备09031721号  

GMT+8, 2017-6-25 13:19 , Processed in 0.101337 second(s), 20 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表