层次聚类关键方法
#coding:UTF-8
#Hierarchical clustering 层次聚类
from E_distance import Euclidean_distance
from yezi import yezi
class bicluster:
def __init__(self, vec, left=None,right=None,distance=0.0,id=None):
self.left = left
self.right = right #每次聚类都是一对数据,left保存其中一个数据,right保存另一个
self.vec = vec #保存两个数据聚类后形成新的中心
self.id = id
self.distance = distance def hcluster(blogwords,n) :
biclusters = [ bicluster(vec = blogwords[i], id = i ) for i in range(len(blogwords)) ]
distances = {}
flag = None;
currentclusted = -1
while(len(biclusters) > n) : #假设聚成n个类
min_val = 999999999999; #Python的无穷大应该是inf
biclusters_len = len(biclusters)
for i in range(biclusters_len-1) :
for j in range(i + 1, biclusters_len) :
if distances.get((biclusters[i].id,biclusters[j].id)) == None:
distances[(biclusters[i].id,biclusters[j].id)] = Euclidean_distance(biclusters[i].vec,biclusters[j].vec)
d = distances[(biclusters[i].id,biclusters[j].id)]
if d < min_val :
min_val = d
flag = (i,j)
bic1,bic2 = flag #解包bic1 = i , bic2 = j
newvec = [(biclusters[bic1].vec[i] + biclusters[bic2].vec[i])/2 for i in range(len(biclusters[bic1].vec))] #形成新的类中心,平均
newbic = bicluster(newvec, left=biclusters[bic1], right=biclusters[bic2], distance=min_val, id = currentclusted) #二合一
currentclusted -= 1
del biclusters[bic2] #删除聚成一起的两个数据,由于这两个数据要聚成一起
del biclusters[bic1]
biclusters.append(newbic)#补回新聚类中心
clusters = [yezi(biclusters[i]) for i in range(len(biclusters))] #深度优先搜索叶子节点,用于输出显示
return biclusters,clusters
深度优先显示:
def yezi(clust):
if clust.left == None and clust.right == None :
return [clust.id]
return yezi(clust.left) + yezi(clust.right)
欧氏距离:
#Euclidean_distance
from math import sqrt def Euclidean_distance(vector1,vector2):
length = len(vector1) TSum = sum([pow((vector1[i] - vector2[i]),2) for i in range(len(vector1))]) SSum = sqrt(TSum) return SSum

层次聚类算法:

给定要聚类的N的对象以及N*N的距离矩阵(或者是相似性矩阵), 层次式聚类方法的基本步骤(参看S.C. Johnson in 1967)如下:
  1. 将每个对象归为一类, 共得到N类, 每类仅包含一个对象. 类与类之间的距离就是它们所包含的对象之间的距离.
  2. 找到最接近的两个类并合并成一类, 于是总的类数少了一个.
  3. 重新计算新的类与所有旧类之间的距离.
  4. 重复第2步和第3步, 直到最后合并成一个类为止(此类包含了N个对象).

由于层次聚类计算量巨大,所以通常不用来计算大量的数据,不过可以用层次聚类来选取K-means算法的初始类中心。

例子(不规范,只是用来显示输入和输出的格式):

参考:http://www.cnblogs.com/coser/archive/2013/04/10/3013044.html

Python-层次聚类-Hierarchical clustering的更多相关文章

  1. 层次聚类 Hierarchical Clustering

    -------------------------------- 不管是GMM,还是k-means,都面临一个问题,就是k的个数如何选取?比如在bag-of-words模型中,用k-means训练码书 ...

  2. 机器学习(6): 层次聚类 hierarchical clustering

    假设有N个待聚类的样本,对于层次聚类来说,步骤:        1.(初始化)把每个样本归为一类,计算每两个类之间的距离,也就是样本与样本之间的相似度:        2.寻找各个类之间最近的两个类, ...

  3. python实现一个层次聚类方法

    层次聚类(Hierarchical Clustering) 一.概念 层次聚类不需要指定聚类的数目,首先它是将数据中的每个实例看作一个类,然后将最相似的两个类合并,该过程迭代计算只到剩下一个类为止,类 ...

  4. 32(1).层次聚类---AGNES

    层次聚类hierarchical clustering 试图在不同层次上对数据集进行划分,从而形成树形的聚类结构. 一. AGNES AGglomerative NESting:AGNES是一种常用的 ...

  5. Python机器学习——Agglomerative层次聚类

    层次聚类(hierarchical clustering)可在不同层次上对数据集进行划分,形成树状的聚类结构.AggregativeClustering是一种常用的层次聚类算法.   其原理是:最初将 ...

  6. Python爬虫技术(从网页获取图片)+HierarchicalClustering层次聚类算法,实现自动从网页获取图片然后根据图片色调自动分类—Jason niu

    网上教程太啰嗦,本人最讨厌一大堆没用的废话,直接上,就是干! 网络爬虫?非监督学习? 只有两步,只有两个步骤? Are you kidding me? Are you ok? 来吧,follow me ...

  7. 【Python机器学习实战】聚类算法(2)——层次聚类(HAC)和DBSCAN

    层次聚类和DBSCAN 前面说到K-means聚类算法,K-Means聚类是一种分散性聚类算法,本节主要是基于数据结构的聚类算法--层次聚类和基于密度的聚类算法--DBSCAN两种算法. 1.层次聚类 ...

  8. 【层次聚类】python scipy实现

    层次聚类 原理 有一个讲得很清楚的博客:博客地址 主要用于:没有groundtruth,且不知道要分几类的情况 用scipy模块实现聚类 参考函数说明: pdist squareform linkag ...

  9. 【python】利用scipy进行层次聚类

    参考博客: https://joernhees.de/blog/2015/08/26/scipy-hierarchical-clustering-and-dendrogram-tutorial/ 层次 ...

随机推荐

  1. [转]MyBatis传入多个参数的问题 - mingyue1818

    原文  http://www.cnblogs.com/mingyue1818/p/3714162.html 一.单个参数: public List<XXBean> getXXBeanLis ...

  2. [转]搞ACM的你伤不起(转自Roba大神)

    劳资六年前开始搞ACM啊!!!!!!!!!! 从此踏上了尼玛不归路啊!!!!!!!!!!!! 谁特么跟劳资讲算法是程序设计的核心啊!!!!!! 尼玛除了面试题就没见过用算法的地方啊!!!!!! 谁再跟 ...

  3. hdu5481 Desiderium

    链接 Desiderium 题意 给定n条线段,从中选取若干条,共有2n种选法(因为每一条线段有两种方法:选或者不选). 每一种选法都对应一个长度,也就是所选线段的并集长度. 求这2n种选法长度之和. ...

  4. 工作框架各种使用整理---使用Cache

    <service verb="get" noun="Products"> <implements service="sang.pro ...

  5. android 资讯阅读器

    最近找申请到了一个不错的接口 , 非常适合拿来写一个资讯类的app. 现在着手写,随写随更.也算是抛砖引玉.烂尾请勿喷.╭(╯^╰)╮ android 资讯阅读器 第一阶段目标样式(滑动切换标签 , ...

  6. android Baseadapter 和 ViewHolder的使用

    昨晚学习了徐大神的关于BaseAdapter的讲解,让我受益匪浅特来博客留下印记 说到baseadapter大家一定都不陌生,下面这张图就展示了数据.listview.baseadapter 之间的关 ...

  7. Java--笔记(5)

    41.面向对象的五大基本原则 (1)单一职责原则(SRP) (2)开放封闭原则(OCP) (3)里氏替换原则(LSP) (4)依赖倒置原则(DIP) (5)接口隔离原则(ISP) 单一职责原则(SRP ...

  8. ActiveMQ_Topic队列(三)

    一.本文章包含的内容 1.列举了ActiveMQ中通过Topic方式发送.消费队列的代码(监听者有两个,分别是topicMessageListener1.topicMessageListener2) ...

  9. VS调试网页的localhost

    那个像是iis的服务器叫: 只能访问自己的localhost,也就是127.0.0.1是回环地址(LoopBack),就是表示访问本机,是不用经过网卡的. 别名就是localhost.这种地址无法再外 ...

  10. 和ef一起使用的一些知识点。

    ObjectContext.ExecuteFunction 方法 (String, ObjectParameter[]) .NET Framework 4.6 and 4.5    执行在数据源中定义 ...