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

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2680|回复: 1

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

[复制链接]
发表于 2012-5-7 09:41:58 | 显示全部楼层 |阅读模式
生物信息学数据处理中,常常需要用到聚类的算法,下面就常用的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 代码
  1. import math
  2. def KM(lst,m1,m2):
  3.       k_list_1=[]
  4.       k_list_2=[]
  5.       for value in lst:
  6.             deta=abs(value-m1)-abs(value-m2)
  7.             if deta>0:
  8.                   k_list_1.append(value)
  9.                   #print k_list_1
  10.             else:
  11.                   k_list_2.append(value)
  12.                   #print k_list_2

  13.       #print k_list_1
  14.       #print k_list_2
  15.       k1=sum(k_list_1)/float(len(k_list_1))
  16.       k2=sum(k_list_2)/float(len(k_list_2))
  17.       if (k1==m1 and k2==m2) or (k1==m2 and k2==m1):
  18.             return k_list_1,k_list_2,k1,k2
  19.       else:
  20.             return KM(lst,k1,k2)



  21. 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]
  22. print KM(n,0,1)
复制代码
运行结果:
  1. >>>
  2. ([-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
发表于 2012-10-14 20:27:09 | 显示全部楼层
谢谢分享啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2017-3-30 06:56 , Processed in 0.097166 second(s), 21 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

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