下面用到的数据及代码:click here
1.获取数据:
来自100个博客里面的所有文章单词数目,这儿用的rss订阅源对文章数据进行获取,rss获取出来是xml文件格式,所以可以下载一个feedparser来对xml文档进行解析。关于怎么得到每篇博客的每个单词的统计情况,请自行查看generatefeedvector.py文件。不理解的地方欢迎交流。 获取后得到的文件为blogdata.txt。
2.分级类聚
分级类聚通过连续不断地将两个最相似的群组两两合并。树状图是分级类聚的一种可视化方法。
下面将介绍如何将以上我们生成的博客数据进行类聚。
①加载数据

#加载数据集,将博客标题存入rownames中,将单词数存在二位列表data中,将单词名放入colnames里
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

②.这儿我们需要求两篇博客单词情况的相关度,之前博客里面学习了三种求相关度的方法,这儿因为一些博客比其他博客包含的文章条目更多,所以使用皮尔逊相关度,在这儿是对两个博客的相关度的数据集是一行的数据,所以我们需要对皮尔逊相关度算法进行小小的修改,

#v1,v2data中指的是不同两行数据
def pearson(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))])num=pSum-(sum1*sum2/len(v1))den=sqrt((sum1Sq-pow(sum1,2)/len(v1))*(sum2Sq-pow(sum2,2)/len(v1)))if den==0:return 0#因为皮尔逊相关度返回的是0-1的浮点数,而且越大表示这两个相关度越高,而我们这儿需要相关度越高距离越小,所以我们用1.0-num/den表示距离return 1.0-num/den

③.建立类聚点模型,
每个点都有一行数据集vec,以及该点是由拿两个点聚集而成left和right,这两个点的相似度距离distance,以及这个点的id。所以建立以下类

class bicluster:#vec表示该博客对应的点的向量,(就是data里面的一行数据),left和right表示该点是由哪两个点聚合而成的,distance是两点之间的距离,id是点的编号def __init__(self,vec,left=None,right=None,distance=0.0,id=None):self.left=leftself.right=rightself.vec=vecself.id=idself.distance=distance

④.递归合并聚类
这儿返回的是一个最后大聚类的点
细节自己理解,不理解的相互交流,

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)):#用distances来缓存距离的计算值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=dlowestpair=(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-=1del clust[lowestpair[1]]del clust[lowestpair[0]]clust.append(newcluster)return clust[0]

⑤.图形版的类聚树

#打印类似文件系统层次结构的递归遍历类聚树
def printclust(clust,lables=None,n=0):#利用缩进来建立层级布局for i in range(n):print ' ',if clust.id<0:#负数代表分支print '-'else:#正数代表叶节点if lables==None:print clust.idelse:print lables[clust.id]#现在开始打印右侧分支和左侧分支if clust.left!=None:printclust(clust.left,lables=lables,n=n+1)if clust.right!=None:printclust(clust.right,lables=lables,n=n+1)

⑥.绘制树状图来更直观的查看类聚树
这儿需要用到python的PIL模块,先去在上面百度网盘中下载Pillow-3.4.2-cp27-cp27m-win_amd64.whl文件,然后进入该存放文件的目录下打开cmd,执行

pip install Pillow-3.4.2-cp27-cp27m-win_amd64.whl

绘制代码如下

#得到聚类的高度
def gethight(clust):#叶节点的高度为1if clust.left==None and clust.right==None:return 1else:return gethight(clust.left)+gethight(clust.right)
def getdepth(clust):#叶节点的距离为0.0if clust.left==None and clust.right==None:return 0#直接点的距离等于左右两侧距离的较大者+该节点自身的距离else:return max(getdepth(clust.left),getdepth(clust.right))+clust.distance#生成一个图片
def drawdendrogram(clust,lables,jpeg='clusters.jpg'):#高度和宽度h=gethight(clust)*20w=1200depth=getdepth(clust)#由于宽度是固定的,对距离值做调整scaling=float(w-150)/depth#新建一个白色背景图片img=Image.new('RGB',(w,h),(255,255,255))draw=ImageDraw.Draw(img)draw.line((0,h/2,10,h/2),fill=(255,0,0))#画第一个节点drawnode(draw,clust,10,(h/2),scaling,lables)img.save(jpeg,'JPEG')#对于每一个点进行作图
def drawnode(draw,clust,x,y,scaling,lables):if clust.id<0:h1=gethight(clust.left)*20h2=gethight(clust.right)*20top=y-(h1+h2)/2bottom=y+(h1+h2)/2#线的长度ll=clust.distance*scaling#聚类到其子节点的垂直线draw.line((x,top+h1/2,x,bottom-h2/2),fill=(255,0,0))#链接左侧节点的水平线draw.line((x, top + h1 / 2, x+ll, top+ h1 / 2), fill=(255, 0, 0))# 链接右侧节点的水平线draw.line((x, bottom-h2 / 2, x + ll, bottom - h2 / 2), fill=(255, 0, 0))#递归绘制左右节点drawnode(draw,clust.left,x+ll,top+h1/2,scaling,lables)drawnode(draw,clust.right,x+ll,bottom-h2/2,scaling,lables)else:#绘制叶节点标签draw.text((x+5,y-7),lables[clust.id],(0,0,0))

2.列类聚
前面博客也提到了转化人和物品进行推荐,当然我们这儿也可以转化行列,求单词的类聚,转化行列代码如下

#转化数据集的行和列
def rotatetmatrix(data):newdata=[]for i in range(len(data[0])):newrow = [data[j][i] for j in range (len(data))]newdata.append(newrow)return newdata

最后执行main函数里面的语句即可。
通过执行cluster.py,我们可以得到两张图片,分别是针对于博客和单词的类聚,我们可以看出同一类聚的相似性,就可以对这些进行分析了。

大数据学习笔记(二)-分级类聚列类聚相关推荐

  1. 大数据学习笔记二:Ubuntu/Debian 下安装大数据框架Hadoop

    文章目录 安装Java 为Hadoop创建用户 安装Hadoop 配置Hadoop 配置环境变量 设置配置文件 格式化namenode 启动hadoop集群 访问hadoop集群 大数据学习系列文章: ...

  2. 大数据学习笔记:Hadoop生态系统

    文章目录 一.Hadoop是什么 二.Hadoop生态系统图 三.Hadoop生态圈常用组件 (一)Hadoop (二)HDFS (三)MapReduce (四)Hive (五)Hbase (六)Zo ...

  3. 大数据学习笔记第1课 Hadoop基础理论与集群搭建

    大数据学习笔记第1课 Hadoop基础理论与集群搭建 一.环境准备 二.下载JDK 三.安装JDK 四.下载hadoop 五.安装hadoop集群 六.打通3台服务器的免密登录 七.hadoop集群配 ...

  4. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  5. Hadoop 大数据学习笔记

    Hadoop 大数据学习笔记1 大数据部门组织架构 Hadoop Hadoop是什么 Hadoop的优势 Hadoop的组成 HDFS架构 YARN架构 MapReduce 大数据技术生态体系![在这 ...

  6. 大数据学习笔记(一)

    大数据学习笔记(一)大数据概论 大数据是什么 1大数据概念:(big data ) : 指无法在一定时间内用常规软件工具进行捕捉.管理和处理数据集合,是需要新处理模式才能具有更强的决策力.洞察发现力和 ...

  7. 此文献给正打算入门大数据的朋友:大数据学习笔记1000条(2)

    501.MapReduce计算框架中的输入和输出的基本数据结构是键-值对. 502.Hadoop神奇的一部分在于sort和shuffle过程. 503.Hive驱动计算的"语言"是 ...

  8. 大数据学习笔记一:大数据的发展历程--MapReduce,Hive,Yarn,Hadoop,Spark,Flink

    大数据学习系列文章:大数据-博客专栏 今天在学习极客时间专栏:<从0开始学大数据> 从预习 01 | 大数据技术发展史:大数据的前世今生到预习 03 | 大数据应用领域:数据驱动一切,系统 ...

  9. 大数据学习笔记:初探大数据世界

    文章目录 一.大数据时代 (一)第三次信息化浪潮 (二)信息科技支撑大数据时代 1.存储设备容量不断增加 2.CPU处理能力大幅提升 3. 网络带宽不断增加 (三)大数据时代来临 (四)大数据发展历程 ...

  10. 大数据学习笔记—大数据概论

    大数据概论 一. 大数据的概念 二.大数据的特点(4V) 三. 大数据的应用场景 四.大数据的发展前景 五.大数据部门的业务流程/组织结构 一. 大数据的概念 大数据(big data),指无法在一定 ...

最新文章

  1. OpenCV(项目)车牌识别3 -- 模板匹配
  2. c语言编程常见问题解答 pdf,[编程语言]C语言常见问题集pdf pdf文件[1.35MB]-码姐姐下载...
  3. μ子刷屏的背后:说「新物理学即将现身」还为之过早
  4. Play 1.x框架学习之五:错误信息显示 (error message display In play framework)
  5. (0001) iOS 开发之收集第三方资源篇
  6. 笔记本电脑下载python视频教程-如何使用Python访问/下载OneNote笔记本?
  7. cadence安装完怎么打开_Linux 环境下Vivado与Cadence仿真工具联合仿真环境的搭建
  8. Thread Safety in the Standard C++ Library
  9. android 添加so,Android studio 中添加 .so 文件
  10. asp.core api 通过socket和服务器通信发送udp_详解Linux的SOCKET编程
  11. 电脑应用程序错误怎么办_遇到电脑桌面应用程序无法正常启动(0xc0000142)怎么办?0xc0000142解决方法...
  12. sockets php,PHP: Sockets - Manual
  13. 如何从stackoverflow的api 中获取是数据_如何修复Vue中的 “this is undefined” 问题
  14. 频率学派(Frequentists) 贝叶斯学派(Bayesians)
  15. 华为鸿蒙专属文件后缀,华为鸿蒙——上传第三方APP【原理公布】
  16. php 判断 小米 手机浏览器,javascript - uc、qq、搜狗 以上三个手机浏览器判断移动端的js代码不执行...
  17. 51单片机8位数码管显示学号变化
  18. 计算机网络技术用古诗文描述,【多媒体技术论文】多媒体技术在古诗文教学的运用(共2828字)...
  19. String的intern方法详解
  20. 搅拌摩擦焊有限元仿真分析学习笔记

热门文章

  1. 服务器知识:安装FileZilla工具,以及通过FileZilla在服务器上面上传、下载文件
  2. 商标注册类别25类具体包括哪些产品
  3. 医用计算机应用大一,计算机应用技术专业学生大一学年自我鉴定
  4. FCN-Fully Convolutional Networks for Semantic Segmentation
  5. Java_文件大小单位转换_基本类型长度
  6. 神牛的养成计划---可持久化trie
  7. Python - 列表补充(一)
  8. Python:制作一个模拟扔硬币的程序(附完整代码)
  9. 语言模型(三)—— 循环神经网络语言模型(RNNLM)与语言模型评价指标
  10. pdf批量加水印后打包下载