聚类算法总结以及python代码实现

一、聚类(无监督)的目标

使同一类对象的相似度尽可能地大;不同类对象之间的相似度尽可能地小。

二、层次聚类

层次聚类算法实际上分为两类:自上而下或自下而上。自下而上的算法在一开始就将每个数据点视为一个单一的聚类,然后依次合并(或聚集)类,直到所有类合并成一个包含所有数据点的单一聚类。因此,自下而上的层次聚类称为合成聚类或HAC。聚类的层次结构用一棵树(或树状图)表示。树的根是收集所有样本的唯一聚类,而叶子是只有一个样本的聚类。在继续学习算法步骤之前,先查看下面的图表

1.我们首先将每个数据点作为一个单独的聚类进行处理。如果我们的数据集有X个数据点,那么我们就有了X个聚类。然后我们选择一个度量两个聚类之间距离的距离度量。作为一个示例,我们将使用平均连接(average linkage)聚类,它定义了两个聚类之间的距离,即第一个聚类中的数据点和第二个聚类中的数据点之间的平均距离。

2.在每次迭代中,我们将两个聚类合并为一个。将两个聚类合并为具有最小平均连接的组。比如说根据我们选择的距离度量,这两个聚类之间的距离最小,因此是最相似的,应该组合在一起。

3.重复步骤2直到我们到达树的根。我们只有一个包含所有数据点的聚类。通过这种方式,我们可以选择最终需要多少个聚类,只需选择何时停止合并聚类,也就是我们停止建造这棵树的时候!

层次聚类算法不要求我们指定聚类的数量,我们甚至可以选择哪个聚类看起来最好。此外,该算法对距离度量的选择不敏感;它们的工作方式都很好,而对于其他聚类算法,距离度量的选择是至关重要的。层次聚类方法的一个特别好的用例是,当底层数据具有层次结构时,你可以恢复层次结构;而其他的聚类算法无法做到这一点。层次聚类的优点是以低效率为代价的,因为它具有O(n³)的时间复杂度,与K-Means和高斯混合模型的线性复杂度不同。

层次聚类方法对给定的数据集进行层次的分解,直到某种条件满足或者达到最大迭代次数。具体又可分为:

凝聚的层次聚类(AGNES算法):一种自底向上的策略,首先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇(一般是计算所有簇的中心之间的距离,选取距离最小的两个簇合并),直到某个终结条件被满足或者达到最大迭代次数。
分裂的层次聚类(DIANA算法):采用自顶向下的策略,它首先将所有对象置于一个簇中,然后逐渐细分为越来越小的簇(一般是每次迭代分裂一个簇为两个),直到达到了某个终结条件或者达到最大迭代次数。

import sys,osimport numpy as np

class Hierarchical:    def __init__(self,center,left=None,right=None,flag=None,distance=0.0):        self.center = center        self.left = left        self.right = right        self.flag = flag        self.distance = distance

def traverse(node):        if node.left==None and node.right==None:            return [node.center]        else:            return traverse(node.left)+traverse(node.right)

def distance(v1,v2):    if len(v1)!=len(v2):        print("出现错误了")    distance = 0    for i in range(len(v1)):        distance+=(v1[i]-v2[i])**2    distance = np.sqrt(distance)    return distance

def hcluster(data,n):    if len(data)<=0:        print(‘invalid data‘)    clusters = [Hierarchical(data[i],flag=i) for i in range(len(data))]    #print(clusters)    distances = {}    min_id1 = None    min_id2 = None    currentCluster = -1

    while len(clusters)>n:        minDist = 100000000000000

        for i in range(len(clusters)-1):            for j in range(i+1,len(clusters)):                #print(distances.get((clusters[i], clusters[j])))                if distances.get((clusters[i],clusters[j]))==None:

                    distances[(clusters[i].flag,clusters[j].flag)]=distance(clusters[i].center,clusters[j].center)

                if distances[(clusters[i].flag,clusters[j].flag)]<= minDist:                    min_id1 = i                    min_id2 = j                    minDist = distances[(clusters[i].flag,clusters[j].flag)]

        if min_id1!=None and min_id2!=None and minDist!=1000000000:            newCenter = [(clusters[min_id1].center[i]+clusters[min_id2].center[i])/2 for i in range(len(clusters[min_id2].center))]            newFlag = currentCluster            currentCluster -= 1            newCluster = Hierarchical(newCenter,clusters[min_id1],clusters[min_id2],newFlag,minDist)            del clusters[min_id2]            del clusters[min_id1]            clusters.append(newCluster)        finalCluster = [traverse(clusters[i]) for i in range(len(clusters))]        return finalCluster

if __name__ == ‘__main__‘:    data = [[123,321,434,4325,345345],[23124,141241,434234,9837489,34743],\            [128937,127,12381,424,8945],[322,4348,5040,8189,2348],\            [51249,42190,2713,2319,4328],[13957,1871829,8712847,34589,30945],            [1234,45094,23409,13495,348052],[49853,3847,4728,4059,5389]]    #print(len(data))    finalCluster = hcluster(data,3)    print(finalCluster)    #print(len(finalCluster[0]))

 

原文地址:https://www.cnblogs.com/limingqi/p/11996796.html

时间: 2024-10-10 09:47:51

聚类算法总结以及python代码实现的相关文章

tf–idf算法解释及其python代码实现(下)

tf–idf算法python代码实现 这是我写的一个tf-idf的核心部分的代码,没有完整实现,当然剩下的事情就非常简单了,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四句话,每句表示一个文档 copus=['我正在学习计算机','它正在吃饭','我的书还在你那儿','今天不上班'] 由于中文需要分词,jieba分词是python里面比较好用的分词工具,所以选用jieba分词,文末是jieba的链接.首先对文档进行分词: i

tf–idf算法解释及其python代码实现(上)

tf–idf算法解释 tf–idf, 是term frequency–inverse document frequency的缩写,它通常用来衡量一个词对在一个语料库中对它所在的文档有多重要,常用在信息检索和文本挖掘中. 一个很自然的想法是在一篇文档中词频越高的词对这篇文档越重要,但同时如果这个词又在非常多的文档中出现的话可能就是很普通的词,没有多少信息,对所在文档贡献不大,例如‘的’这种停用词.所以要综合一个词在所在文档出现次数以及有多少篇文档包含这个词,如果一个词在所在文档出现次数很多同时整个

神经网络和BP算法C及python代码

以上仅给出了代码.具体BP实现原理及神经网络相关知识请见:神经网络和反向传播算法推导 首先是前向传播的计算: 输入: 首先为正整数 n.m.p.t,分别代表特征个数.训练样本个数.隐藏层神经元个数.输出 层神经元个数.其中(1<n<=100,1<m<=1000, 1<p<=100, 1<t<=10). 随后为 m 行,每行有 n+1 个整数.每行代表一个样本中的 n 个特征值 (x 1 , x 2 ,..., x n ) 与样本的 实际观测结果 y.特征值的

K-Means 聚类算法原理分析与代码实现

前言 在前面的文章中,涉及到的机器学习算法均为监督学习算法. 所谓监督学习,就是有训练过程的学习.再确切点,就是有 "分类标签集" 的学习. 现在开始,将进入到非监督学习领域.从经典的聚类问题展开讨论.所谓聚类,就是事先并不知道具体分类方案的分类 (允许知道分类个数). 本文将介绍一个最为经典的聚类算法 - K-Means 聚类算法以及它的两种实现. 现实中的聚类分析问题 - 总统大选 假设 M 国又开始全民选举总统了,目前 Mr.OBM 的投票率为48%(投票数占所有选民人数的百分比

朴素贝叶斯算法简介及python代码实现分析

概念: 贝叶斯定理:贝叶斯理论是以18世纪的一位神学家托马斯.贝叶斯(Thomas Bayes)命名.通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A(发生)的条件下的概率是不一样的:然而,这两者是有确定的关系的,贝叶斯定理就是这种关系的陈述 朴素贝叶斯:朴素贝叶斯方法是基于贝叶斯定理和特征条件独立假设的分类方法.对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布:然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率(Maximum A Posterio

朴素贝叶斯分类算法介绍及python代码实现案例

朴素贝叶斯分类算法 1.朴素贝叶斯分类算法原理 1.1.概述 贝叶斯分类算法是一大类分类算法的总称 贝叶斯分类算法以样本可能属于某类的概率来作为分类依据 朴素贝叶斯分类算法是贝叶斯分类算法中最简单的一种 注:朴素的意思是条件概率独立性 P(A|x1x2x3x4)=p(A|x1)*p(A|x2)p(A|x3)p(A|x4)则为条件概率独立 P(xy|z)=p(xyz)/p(z)=p(xz)/p(z)*p(yz)/p(z) 1.2.算法思想 朴素贝叶斯的思想是这样的: 如果一个事物在一些属性条件发生

排序算法总结以及python代码实现

最近在找工作面试的时候总是会被问到排序算法的种种,现在对排序算法进行一个系统的总结.也算是再复习一遍的,有好多自己也忘得差不多了. 排序有内部排序和外部排序两大类.内部排序值得是所有的排序是在内存中进行:外部排序则是因为数据量太大,一次不能将全部数据放在内存中,在排序过程中,需要访问外存. 关于时间复杂度和空间复杂度 由于时间关系,我没有自己画,以下的表格是在别处转的,详见常用排序算法总结 1.插入排序--直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入

《机器学习实战》之二分K-均值聚类算法的python实现

<机器学习实战>之二分K-均值聚类算法的python实现 上面博文介绍了K-均值聚类算法及其用python实现,上篇博文中的两张截图,我们可以看到,由于K-均值聚类算法中由于初始质心的选取,会造成聚类的局部最优,并不是全局最优,因此,会造成聚类的效果并不理想,为克服K-均值算法收敛于局部最小值的问题,就有了二分K-均值算法. 二分K-均值聚类算法 二分K均值算法是基本K均值算法的直接扩充,其基本思想是:为了得到K个簇,首先将所有点的集合分裂成两个簇,然后从这些簇中选取一个继续分裂,迭代直到产生

Python实现K-means聚类算法

因为自己对python也有一定的了解,之前也用R做过一些数据分析,又恰好看到几篇文章介绍python实现算法的,觉得挺有意思,所以参考了一些书籍来自己实现一个K-means的聚类算法.<Python数据分析基础教程:NumPy学习指南(第2版)>和 < Matplotlib手册>是做数据分析的挺不错的两个入门级教材,推荐给大家. 链接:http://pan.baidu.com/s/1FSheY 密码:ulsa 数据聚类是对于静态数据分析的一门技术,在许多领域内都被广泛地应用,包括机