关于聚类的讨论

来源:互联网 发布:网站维护页面源码 编辑:程序博客网 时间: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个点的距离过近)

原创粉丝点击