zoukankan      html  css  js  c++  java
  • 集体智慧编程笔记

    关于聚类算法

    物以类聚,相似的构成组

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

    图示如下:

  • 相关阅读:
    Spring Boot 无侵入式 实现 API 接口统一 JSON 格式返回
    Java8 Stream:2万字20个实例,玩转集合的筛选、归约、分组、聚合
    排名前 16 的 Java 工具类
    万字详解,JDK8 的 Lambda、Stream 和日期的使用详解
    这样规范写代码,同事直呼“666”
    Java多线程高并发学习笔记——阻塞队列
    零散的MySQL基础总是记不住?看这一篇就够了!
    Java 中自定义注解及使用场景
    最简单的6种防止数据重复提交的方法!
    选择数据库联系人【选择之后将不在列表】
  • 原文地址:https://www.cnblogs.com/helmsyy/p/7765796.html
Copyright © 2011-2022 走看看