层次聚类算法

原创 2017年07月30日 23:01:53

层次聚类算法很简单
类似于树的结构
树自下而上更新
即n->1个簇的更新
具体见代码
增加了树的几点操作函数
应用暂时没有
后续会更新

# -*- coding:utf-8 _*_

import numpy


def getMax(x, y):
    if x > y:
        return x
    else:
        return y


def getMin(x, y):
    if x > y:
        return y
    else:
        return x


def loadData(fileName):
    data = []
    with open(fileName) as txtFile:
        for line in txtFile.readlines():
            init = map(float, line.split())  # 全部转换为float类型
            data.append(init)
    return data


# 树的节点
class clusterNode:
    # vec为坐标 lr左右节点 目前没有get到distance的作用
    def __init__(self, vec, left=None, right=None, id=None, distance=0):
        self.vec = vec
        self.left = left
        self.right = right
        self.id = id
        self.distance = distance


def L2Distance(v1, v2):
    return numpy.sqrt(sum(pow(v1 - v2, 2)))


deep = 0  # 得到树的深度
def getDeep(node, high):
    if node.left is None and node.right is None:
        global deep
        deep = getMax(deep, high)
    else:
        print node.vec
        getDeep(node.left, high + 1)
        getDeep(node.right, high + 1)


leavesNum = 0  # 得到树的叶子树
def getLeaves(node):
    if node.left is None and node.right is None:
        global leavesNum
        leavesNum += 1
    if node.left is not None:
        getLeaves(node.left)
    if node.right is not None:
        getLeaves(node.right)


def hiCluster(dataSet, calDistance=L2Distance):
    # 利用list建立树形clust 在中括号内循环
    clust = [clusterNode(numpy.array(dataSet[i]), id=i)
             for i in range(len(dataSet))]
    while len(clust) > 1:    # 没有合并完成
        lowestpair = (0, 1)  # 默认01最近 并求距离
        closest = calDistance(clust[0].vec, clust[1].vec)
        # 两两求距离 打擂台找最近的"点" (其实是簇)
        for i in range(len(clust)):
            for j in range(i + 1, len(clust)):
                temp = calDistance(clust[i].vec, clust[j].vec)
                if closest > temp:
                    closest = temp
                    lowestpair = (i, j)# 重新声明tuple (元组无法赋值)
        # 新的簇 中值加和得来
        mergeVec = [(clust[lowestpair[0]].vec[i] + clust[lowestpair[1]].vec[i]) / 2.0
                    for i in range(len(clust[0].vec))]
        # 合并后的"质心"
        newcluster = clusterNode(numpy.array(mergeVec), left=clust[lowestpair[0]],
                                 right=clust[lowestpair[1]], distance=closest)
        # 删除两个距离最近的已经合并的簇 从大的开始删
        Max = getMax(lowestpair[0], lowestpair[1])
        Min = getMin(lowestpair[0], lowestpair[1])
        del (clust[Max])
        del (clust[Min])
        # 添加新的簇
        clust.append(newcluster)
    # 返回的是类的对象 clust[0]是树根
    return clust[0]


if __name__ == "__main__":
    dataSet = loadData("testSet.txt")
    root = hiCluster(dataSet)
    print "node is"
    getDeep(root, 0)
    print "deep is", deep
    getLeaves(root)
    print "leavesNum is", leavesNum
版权声明:有错误麻烦赐教,感激不尽~~~(转载留言哦~)

层次聚类算法

  • 2015年04月20日 09:32
  • 359KB
  • 下载

层次聚类算法C++

  • 2016年06月22日 11:33
  • 974KB
  • 下载

c语言写的数据挖掘的层次聚类算法(新手版)

自己写的c语言写的数据挖掘的层次聚类算法,只用于学习交流,请勿转载!!!! # include # include main(){ int num,i,j,t,clear=0,place,co...
  • TYcht
  • TYcht
  • 2016年05月17日 16:29
  • 397

数据挖掘层次聚类算法

  • 2010年01月14日 15:07
  • 3.52MB
  • 下载

层次聚类算法研究.pdf

  • 2010年02月09日 15:06
  • 303KB
  • 下载

层次聚类算法

一、算法介绍 将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。由聚类所生成的簇是一组数据对象的集合,类中的对象彼此间相似度大,而类与类之间的相似度小。 聚类分析又称群分析,它...

基于重叠度的层次聚类算法

  • 2013年01月13日 10:22
  • 476KB
  • 下载

层次聚类算法(二)

上篇博文简单的讲述了层次聚类的基本概念,接下来就是具体的讲述凝聚的聚类算法AGNES算法与分裂的聚类算法DIANA聚类算法。 AGNES算法: 算法描述:              输入:包含n...

文本层次聚类算法和划分算法

  • 2009年08月06日 15:51
  • 65KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:层次聚类算法
举报原因:
原因补充:

(最多只允许输入30个字)