集体智慧编程笔记

关于聚类算法

物以类聚,相似的构成组

已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]

图示如下:

原文地址:https://www.cnblogs.com/helmsyy/p/7765796.html