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]

    图示如下:

  • 相关阅读:
    tips 前端 阻止 浏览器缓存静态资源
    tips 前端 各个设备的页面尺寸的media query 与页面高度的经验总结
    算法-第四版-练习1.3.28解答
    事件循环(event loop) && 任务队列 (task queue) && $nextTick
    element -ui之<el-table>
    node.js(三 --- stream 管道流 模块化 函数)
    node.js(二 --- events 、buffer、)
    ajax请求的所有状态码详解
    element-ui中el-tree的父元素设置好宽度后不能被子内容撑开的问题
    java获取前端请求字段的方法
  • 原文地址:https://www.cnblogs.com/helmsyy/p/7765796.html
Copyright © 2011-2022 走看看