#coding: UTF-8
import pearson_distance
from pearson_distance import pearson_distance
from math import sqrt
import random def print_matchs(matchs) :
for i in range(len(matchs)) :
print i , '---->',
for item in matchs[i] :
print item,
print
print '-'*20 def kmeans(blogwords, k) :
min_max_per_word = [ [min([row[i] for row in blogwords]), max([row[i] for row in blogwords])] for i in range(len(blogwords[0]))]
# generate k clusters randomly
clusters = [] for i in range(k) :
cluster = []
for min_, max_ in min_max_per_word :
cluster.append(random.random() * (max_ - min_) + min_) #形成初始类中心 利用每列的最大最小值 一列代表一个数据的属性
clusters.append(cluster)
lables = []
matchs = [ [] for i in range(k)]
lastmatchs = [ [] for i in range(k)] rounds = 100
while rounds > 0 :
matchs = [ [] for i in range(k)]
print 'round \t',rounds
for i in range(len(blogwords)) : #遍历所有的数据
bestmatch_cluster = None
min_distance = 100
for j in range(k) : #遍历每一个类标签
dis = pearson_distance(clusters[j], blogwords[i]) #计算相似度距离
if dis < min_distance :
min_distance = dis
bestmatch_cluster = j #保存距离最近的类中心编号
matchs[bestmatch_cluster].append(i) #将数据行编号i 添加到matchs[[],[]...[]](k个类)的每一个类中
#print_matchs(matchs)
#print_matchs(lastmatchs)
if matchs == lastmatchs : break #如果上次和这次的label没改变 则跳出循环
lastmatchs = [[ item for item in matchs[i] ] for i in range(k)] #保存的是上次的k-means结果的label
#move the centroids to the average of their members
for j in range(k) :
avg = [0.0 for i in range(len(blogwords[0])) ]
for m in matchs[j] :
vec = blogwords[m]
for i in range(len(blogwords[0])) :
avg[i] += vec[i]
avg = [ item / len(match[j]) for item in avg]
clusters[j] = avg #更新新的聚类中心
rounds -= 1
return matchs
## label指的是:
## 1------ [1,3] ·
## 2------ [2,8] ·
## 类编号 3------ [0,6] · 数据编号
## 4------ [4,7] ·
## 5------ [5,10,11] ·

距离相似度计算:

#pearson distance
from math import sqrt def pearson_distance(vector1,vector2):
sum1 = sum(vector1)
sum2 = sum(vector2) sum1Sq = sum([pow(v,2) for v in vector1])
sum2Sq = sum([pow(v,2) for v in vector2]) pSum = sum([vector1[i] * vector2[i] for i in range(len(vector1))]) num = pSum - (sum1 * sum2 / len(vector1))
den = sqrt((sum1Sq - pow(sum1,2) / len(vector1)) * (sum2Sq - pow(sum2,2)/len(vector1))) if den == 0 : return 0.0
return 1.0 - num/den

***注意:如果修改py文件(例如添加一个函数)必须要Restart shell 才能调用该函数,我们可以修改一下距离函数 或者 迭代终止条件~~~

***注意:如果要加中文注释,需要在最开头一行加入 #coding: UTF-8

***数据输入格式 [[123, 312, 434, 4325, 345345], [23124, 141241, 434234, 9837489, 34743], [128937, 127, 12381, 424, 8945], [323, 4348, 5040, 8189, 2348], [51249, 42190, 2713, 2319, 4328], [13957, 1871829, 8712847, 34589, 30945], [1234, 45094, 23409, 13495, 348052], [49853, 3847, 4728, 4059, 5389]] 一行代表一个数据,列代表一个数据的一个属性值

转自:http://www.cnblogs.com/coser/archive/2013/04/10/3013044.html

代码并不通用,要抽个时间改改,改的方向有

1-处理空簇数据,即簇中没有数据的情况。

对于出现这种情况,可以使用随机选取任意簇(非空)中最远的点作为当前空簇的中心点;或者在当前具有最大SSE的簇中选择最远距离值作为当前空簇的中心点。这两种做法都是减小了总体的SSE,如果有多个空簇的话,针对每一个空簇执行上面的两种方法之一,重复多次,消除空簇。

2-选择初始质心,可改进的参考资料是层次聚类和k-means++算法

一定要抽时间!!!

转:Python K-means代码的更多相关文章

  1. python 常忘代码查询 和autohotkey补括号脚本和一些笔记和面试常见问题

    笔试一些注意点: --,23点43 今天做的京东笔试题目: 编程题目一定要先写变量取None的情况.今天就是因为没有写这个边界条件所以程序一直不对.以后要注意!!!!!!!!!!!!!!!!!!!!! ...

  2. 机器学习算法的基本知识(使用Python和R代码)

    本篇文章是原文的译文,然后自己对其中做了一些修改和添加内容(随机森林和降维算法).文章简洁地介绍了机器学习的主要算法和一些伪代码,对于初学者有很大帮助,是一篇不错的总结文章,后期可以通过文中提到的算法 ...

  3. python的PEP8 代码风格指南

    PEP8 代码风格指南 这篇文章原文实际上来自于这里:https://www.python.org/dev/peps/pep-0008/ 知识点 代码排版 字符串引号 表达式和语句中的空格 注释 版本 ...

  4. <转>机器学习系列(9)_机器学习算法一览(附Python和R代码)

    转自http://blog.csdn.net/han_xiaoyang/article/details/51191386 – 谷歌的无人车和机器人得到了很多关注,但我们真正的未来却在于能够使电脑变得更 ...

  5. Python 坑爹之 代码缩进

    建议:统一使用空格!!!!!!!!!不要Tab Python代码缩进   这两天python-cn邮件列表有一条thread发展的特别长,题目是<python的代码缩进真是坑爹>(地址), ...

  6. Python第一行代码

    Python版本:Python 3.6.1 0x01 命令行交互 在交互式环境的提示符>>>下,直接输入代码,按回车,就可以立刻得到代码执行结果.现在,试试输入100+200,看看计 ...

  7. 用python处理html代码的转义与还原

    用python处理html代码的转义与还原   转义 escape: import cgi s = cgi.escape("""& < >" ...

  8. 【转】利用Boost.Python将C++代码封装为Python模块

    用Boost.Python将C++代码封装为Python模块 一.     基础篇 借助Boost.Python库可以将C/C++代码方便.快捷地移植到python模块当中,实现对python模块的扩 ...

  9. python爬虫小说代码,可用的

    python爬虫小说代码,可用的,以笔趣阁为例子,python3.6以上,可用 作者的QQ:342290433,汉唐自远工程师 import requests import refrom lxml i ...

  10. Python实现C代码统计工具(四)

    目录 Python实现C代码统计工具(四) 标签: Python 计时 持久化 声明 运行测试环境 一. 自定义计时函数 1.1 整个程序计时 1.2 代码片段计时 1.3 单条语句计时 二. 性能优 ...

随机推荐

  1. Python 练习册

    01:将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果 [图像处理] 类似于图中效果: py 2.7代码: from PIL import Image, Im ...

  2. 关于最近折腾的ubuntu12.10

    win7旗舰正版up1 UltraISO + ubuntu-12.10-desktop-i386.iso + 4GKingston = 启动U盘 USB HDD 启动 进入ubuntu桌面,安装,磁盘 ...

  3. 什么是smarty?

    什么是smarty? Smarty是一个使用PHP写出来的模板PHP模板引擎,由PHP.net官方提供 ,它提供了逻辑与外在内容的分离,简单的讲,目的就是要使用PHP程 序员同美工分离,使用的程序员改 ...

  4. 屠龙之路_狭路相逢勇者胜_EighthDay

    屠龙天团的少年们追着Alpha恶龙沿路留下的粪便,一路狂奔追到了福州大学生活区三十号楼4层活动室,空气中弥漫着恶龙的臭味!屠龙少年对恶龙的隐身遁迹之术心知肚明,于是点头示意,四下散开.各自拿出了电脑, ...

  5. JavaScript 全栈工程师培训教程(来自阮一峰)

    来源于:https://twitter.com/ruanyf http://www.ruanyifeng.com/blog/2016/11/javascript.html 全栈工程师培训材料,帮助学习 ...

  6. linux 配置java 环境

    下载jdk 并解压到 /usr/local/java/ 目录下 地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-down ...

  7. 【转】HTTP协议详解

    原文地址:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html 一.概念 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则 ...

  8. swift中的结构体和枚举

    Swift 里的结构体非常特殊. 类是面向对象编程语言中传统的结构单元.和结构体相比,Swift 的类支持实现继承,(受限的)反射,析构函数和多所有者. 既然类比结构体强大这么多,为什么还要使用结构体 ...

  9. Ext-进度条

    1.progress使用 Ext.MessageBox.progress('请等待',msg:'读取数据中……'); 真实案例 tqbtnNews:function(){ var me = this; ...

  10. HTTP协议学习--- (十一)理解HTTP幂等性

    在httpcomponent 文档中看到如下段落: 1.4.1. HTTP transport safety It is important to understand that the HTTP p ...