关于聚类算法
物以类聚,相似的构成组
已rss订阅源为例
一、数据构造
1.每个博客都有不同的词汇
2.统计出所有博客中出现的词汇
3.以所有的词汇作为模板,统计每个博客中这些词汇出现的频率,构造每个博客的数据
二、皮尔逊相关算法
三、聚类算法
1.定义一个统计类bicluster 包含属性:数据、左边临近对象、右边临近对象、左右两临近对象数据近似度、id
2.首先构造所有博客的bicluster对象数组(数据、左右临近对象为空、相似度为空、id为博客的索引)初始对象currentclustid=-1
3.遍历所有的博客的对象数组 找出相似度最高的两个博客对象 构造两博客对象的中间对象(数据为两博客数据的均值,左右临近对象分为两个博客对象,相似度为连个博客对象数据的相似度,id为初始对象currentclustid)
4.对象数组删除这两个博客对象同时加入新构造的对象 重复遍历操作 直至对象数组只剩一个元素
5.最终形成一个博客对象的关系链
代码如下:
def hcluster(rows,distance=pearson): distances={} currentclustid=-1 # 最开始的聚类就是数据集中的行 clust=[bicluster(rows[i],id=i) for i in range(len(rows))] while len(clust)>1: lowestpair=(0,1) closest=distance(clust[0].vec,clust[1].vec) # 遍历每一个配对,寻找最小距离 for i in range(len(clust)): for j in range(i+1,len(clust)): #用distance来缓存距离的计算值 if (clust[i].id,clust[j].id) not in distances: distances[(clust[i].id,clust[j].id)]=distance(clust[i].vec,clust[j].vec) d=distances[(clust[i].id,clust[j].id)] if d<closest: closest=d lowestpair=(i,j) # 计算两个聚类的平均值 mergevec=[ (clust[lowestpair[0]].vec[i]+clust[lowestpair[1]].vec[i])/2.0 for i in range(len(clust[0].vec))] # 建立新的聚类 newcluster=bicluster(mergevec,left=clust[lowestpair[0]], right=clust[lowestpair[1]], distance=closest,id=currentclustid) # 不在原始数据集合中的聚类,其id为负数 currentclustid-=1 del clust[lowestpair[1]] del clust[lowestpair[0]] clust.append(newcluster) return clust[0]
图示如下: