关于聚类的讨论
来源:互联网 发布:网站维护页面源码 编辑:程序博客网 时间:2024/05/18 02:37
监督学习和无监督学习:
监督学习是已近知道输出的结果,就是期望输出。而无监督学习意味着对于结果的未可知。监督学习包括:神经网络,决策树,SVM以及贝叶斯过滤。而无监督学习包括聚类,负矩阵因式分解和自组织映射。
聚类的目的:
举个简单的例子来说,(来自于《集体智慧编程》),我们想知道热门的博客会偏向于什么样的文字情感,甚至说,我们想知道某位写作红人(郭敬明)的写作风格。我们就可以把把数据集做一个聚类,那些出现频率较高的词就会体现出来,就是找出它的主题分词(topical grouping)。
分级聚类:
分级聚类就是持续不断的将最为相似的群组两两合并,来构建一个群组的结构。两个群组合并成一个群组之后,其相应的距离定义会发生更新。从坐标的角度来说,两个坐标构成一个群组之后,它的中心就是这两个坐标的中点了,所有的群组,它的计算代表就是它的中心。这一过程(每次合并一个,更新距离)会一直重复下去,直到剩下一个群组为止。距离的定义可以理解为元素的相似程度。
分级聚类在文本使用中较多使用的评价函数是皮尔逊相关度,因为它考虑的是数据与某条直线的拟合程度,可以避开讨论文本长短不一的问题。
通过分级聚类,我们可以知道哪些样本之间的相关度比较高,特别是画出树状图之后,一目了然。
分级聚类的缺点是无法并行,每次都得遍历所有的距离,找到距离最短。实际编程中,可以把上一次的结果保存下来,每次聚类的时候只会涉及到两个元素,只要更新这两个元素即可。代码如下:
def hcluster(rows,distance=pearson): # 距离定义为皮尔逊距离pearson,上一篇文章有定义 distance={} currentclustid=-1 # bicluster这个类在下面会定义 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)): if(clust[i].id,clust[j].id) not in distance: distance[(clust[i].id,clust[j].id)]=distance(clust[i].vec,clust[j].vec) d=distance[clust[i].id,clust[j].id] if d<closest: closest=d lowerstpair=(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) currentclustid-=1 del clust[lowestpair[1]] del clust[lowestpair[0]] clust.append(newcluster) return clust[0]class bicluster: def _init_ _(self,vec,left=None,right=None,distance=0.0,id=None) self.left=left self.right=right self.vec=vec self.id=id self.distance=distance
列聚类:
就是对原本的数据集做转置,使列变成行,这样做聚类的目的,在文本分析中,我们针对单词,就可以知道哪些单词时常会
结合在一起使用才,可能是非常有意义的。
K-means聚类:
K-means聚类首先会随机确定K个中心位置(k取不同的值,画出效果图,计算不同k值的损失函数,k一般取5-9),然后将各个数据项分配给最邻近的中心点。分配完成后,聚类中心就会转移到该聚类的所有节点的中心位置。
然后再重新分配,重新开始,直到所有的分配过程都不发生变化为止。
K-menas由于聚类中心开始的随机性,即最初的中心位置随机定的,所有同一数据集,两次聚类效果不一样。判断标准是类内距离小,类间距离大。
优点是可以并行,速度快。
对于初始点的选择,K个随机点,一般算法最初选定一个随机点,然后遍历所有点到该点的距离,这样选择的效果会更好(避免K个点的距离过近)
- 关于聚类的讨论
- 关于抽象类的讨论
- 关于抽象类的讨论
- 关于关联类的讨论摘抄
- 关于类和对象的进一步讨论
- 关于checkpoint的讨论
- 关于checkpoint的讨论
- 关于比赛的讨论
- 关于工作流的讨论
- 关于C的讨论
- 关于时钟的讨论
- 关于单元测试的讨论
- 关于引用的讨论
- 关于EventDispatcher的讨论
- 关于DM9000 的讨论
- 关于Map 的讨论
- 关于引用&的讨论
- 关于haskell的讨论
- HDOJ5130 多边形和圆相交面积 最简单的模板
- linux内存管理slab算法之kmem_cache结构创建
- 软件测试方法相关
- PyCharm 3.0 快捷键
- 原码, 反码, 补码 详解(博客园 张子秋)
- 关于聚类的讨论
- 高性能网站架构设计之缓存篇(8)- Redis哨兵Sentinel的搭建和原理说明
- Android状态栏微技巧,带你真正理解沉浸式模式
- Eclipse+tomcat部署JFinal是启动tomcat时报JFinalFilter cannot be cast to javax.servlet.Filter
- C++11 thread编程调用类方法并传入参数
- 如何在CSDN中添加代码块
- 开始时间和结束时间,用例设计
- CI框架简单使用方法
- Oracle:environment variable "PATH"