先看一张图(来自集体智慧编程)
这个算法思路很简单, 就是最开始的时候随便定 k 个点, 然后遍历每一个原图的点, 使得每一个点都归属与那k个点中的一个, 然后更新那k个点的位置(一般是中点)
这个算法是解决当数据太多的时候层次聚类的算法太慢而设计的, 别的优点我就不知道了, 这个算法还可以调节k的大小, 比较方便, 属于人为干预性的, 而层次聚类就是属于自动型的
代码中用到了上一篇文章所提供的数据
import os
import sys
import chardet
from math import sqrt
from PIL import Image, ImageDraw
import random
#coding:utf-8
def readFile(fileName):
lines = [line for line in file(fileName)]
colNames = lines[0].strip().split('\t')[1:]
rowNames = []
data = []
for line in lines[1:]:
p = line.strip().split('\t')
rowNames.append(p[0])
data.append([float(x) for x in p[1:]])
return rowNames, colNames, data
def pearsonBeta(v1, v2):
sum1 = sum(v1)
sum2 = sum(v2)
sum1Sq = sum([pow(v, 2) for v in v1])
sum2Sq = sum([pow(v, 2) for v in v2])
pSum = sum([v1[i] * v2[i] for i in range(len(v1))])
nums = pSum - (sum1 * sum2 / len(v1))
den = sqrt((sum1Sq - pow(sum1, 2) / len(v1)) * (sum2Sq - pow(sum2, 2) / len(v2)))
if(den =