导航:首页 > 源码编译 > 聚类与分类的算法

聚类与分类的算法

发布时间:2024-07-10 22:48:37

⑴ 八:聚类算法K-means(20191223-29)

学习内容:无监督聚类算法K-Means

k-means:模型原理、收敛过程、超参数的选择

聚类分析是在数据中发现数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好。

不同的簇类型: 聚类旨在发现有用的对象簇,在现实中我们用到很多的簇的类型,使用不同的簇类型划分数据的结果是不同的。

基于原型的: 簇是对象的集合,其中每个对象到定义该簇的 原型 的距离比其他簇的原型距离更近,如(b)所示的原型即为中心点,在一个簇中的数据到其中心点比到另一个簇的中心点更近。这是一种常见的 基于中心的簇 ,最常用的K-Means就是这样的一种簇类型。 这样的簇趋向于球形。

基于密度的 :簇是对象的密度区域,(d)所示的是基于密度的簇,当簇不规则或相互盘绕,并且有早上和离群点事,常常使用基于密度的簇定义。

关于更多的簇介绍参考《数据挖掘导论》。

基本的聚类分析算法

     1. K均值: 基于原型的、划分的距离技术,它试图发现用户指定个数(K)的簇。

     2. 凝聚的层次距离: 思想是开始时,每个点都作为一个单点簇,然后,重复的合并两个最靠近的簇,直到尝试单个、包含所有点的簇。

     3. DBSCAN: 一种基于密度的划分距离的算法,簇的个数有算法自动的确定,低密度中的点被视为噪声而忽略,因此其不产生完全聚类。

不同的距离量度会对距离的结果产生影响,常见的距离量度如下所示:

优点:易于实现 

缺点:可能收敛于局部最小值,在大规模数据收敛慢

算法思想:

选择K个点作为初始质心 

repeat

    将每个点指派到最近的质心,形成K个簇 

    重新计算每个簇的质心  

until 簇不发生变化或达到最大迭代次数

这里的“重新计算每个簇的质心”,是根据目标函数来计算的,因此在开始时要考虑 距离度量和目标函数。

考虑欧几里得距离的数据,使用 误差平方和(Sum of the Squared Error,SSE) 作为聚类的目标函数,两次运行K均值产生的两个不同的簇集,使用SSE最小的那个。

k表示k个聚类中心,ci表示第几个中心,dist表示的是欧几里得距离。 

这里有一个问题就是为什么,我们更新质心是让所有的点的平均值,这里就是SSE所决定的。

k均值算法非常简单且使用广泛,但是其有主要的两个缺陷:

1. K值需要预先给定 ,属于预先知识,很多情况下K值的估计是非常困难的,对于像计算全部微信用户的交往圈这样的场景就完全的没办法用K-Means进行。对于可以确定K值不会太大但不明确精确的K值的场景,可以进行迭代运算,然后找出Cost Function最小时所对应的K值,这个值往往能较好的描述有多少个簇类。

2. K-Means算法对初始选取的聚类中心点是敏感的 ,不同的随机种子点得到的聚类结果完全不同

3. K均值算法并不是很所有的数据类型。 它不能处理非球形簇、不同尺寸和不同密度的簇,银冠指定足够大的簇的个数是他通常可以发现纯子簇。

4. 对离群点的数据进行聚类时,K均值也有问题 ,这种情况下,离群点检测和删除有很大的帮助。

下面对初始质心的选择进行讨论:

当初始质心是随机的进行初始化的时候,K均值的每次运行将会产生不同的SSE,而且随机的选择初始质心结果可能很糟糕,可能只能得到局部的最优解,而无法得到全局的最优解。

多次运行,每次使用一组不同的随机初始质心,然后选择一个具有最小的SSE的簇集。该策略非常的简单,但是效果可能不是很好,这取决于数据集合寻找的簇的个数。

关于更多,参考《数据挖掘导论》

为了克服K-Means算法收敛于局部最小值的问题,提出了一种 二分K-均值(bisecting K-means)

将所有的点看成是一个簇

当簇小于数目k时

    对于每一个簇

        计算总误差

        在给定的簇上进行K-均值聚类,k值为2        计算将该簇划分成两个簇后总误差

    选择是的误差最小的那个簇进行划分

在原始的K-means算法中,每一次的划分所有的样本都要参与运算,如果数据量非常大的话,这个时间是非常高的,因此有了一种分批处理的改进算法。

使用Mini Batch(分批处理)的方法对数据点之间的距离进行计算。

Mini Batch的好处:不必使用所有的数据样本,而是从不同类别的样本中抽取一部分样本来代表各自类型进行计算。n 由于计算样本量少,所以会相应的减少运行时间n 但另一方面抽样也必然会带来准确度的下降。

聚类试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集成为一个“簇”。通过这样的划分,每个簇可能对应于一些潜在的概念(也就是类别);需说明的是,这些概念对聚类算法而言事先是未知的,聚类过程仅能自动形成簇结构,簇对应的概念语义由使用者来把握和命名。

聚类是无监督的学习算法,分类是有监督的学习算法。所谓有监督就是有已知标签的训练集(也就是说提前知道训练集里的数据属于哪个类别),机器学习算法在训练集上学习到相应的参数,构建模型,然后应用到测试集上。而聚类算法是没有标签的,聚类的时候,需要实现的目标只是把相似的东西聚到一起。

聚类的目的是把相似的样本聚到一起,而将不相似的样本分开,类似于“物以类聚”,很直观的想法是同一个簇中的相似度要尽可能高,而簇与簇之间的相似度要尽可能的低。

性能度量大概可分为两类: 一是外部指标, 二是内部指标 。

外部指标:将聚类结果和某个“参考模型”进行比较。

内部指标:不利用任何参考模型,直接考察聚类结果。

对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大

初学者会很容易就把K-Means和KNN搞混,其实两者的差别还是很大的。

K-Means是无监督学习的聚类算法,没有样本输出;而KNN是监督学习的分类算法,有对应的类别输出。KNN基本不需要训练,对测试集里面的点,只需要找到在训练集中最近的k个点,用这最近的k个点的类别来决定测试点的类别。而K-Means则有明显的训练过程,找到k个类别的最佳质心,从而决定样本的簇类别。

当然,两者也有一些相似点,两个算法都包含一个过程,即找出和某一个点最近的点。两者都利用了最近邻(nearest neighbors)的思想。

优点:

简单, 易于理解和实现 ;收敛快,一般仅需5-10次迭代即可,高效

缺点:

    1,对K值得选取把握不同对结果有很大的不同

    2,对于初始点的选取敏感,不同的随机初始点得到的聚类结果可能完全不同

    3,对于不是凸的数据集比较难收敛

    4,对噪点过于敏感,因为算法是根据基于均值的

    5,结果不一定是全局最优,只能保证局部最优

    6,对球形簇的分组效果较好,对非球型簇、不同尺寸、不同密度的簇分组效果不好。

K-means算法简单理解,易于实现(局部最优),却会有对初始点、噪声点敏感等问题;还容易和监督学习的分类算法KNN混淆。

参考阅读:

1.《 深入理解K-Means聚类算法 》

2.《 K-Means 》

⑵ knn和kmeans的区别

knn属于监督学习,类别是已知的,通过对已知分类的数据进行训练和学习,找到这些不同类的特征,再对未分类的数据进行分类。kmeans属于非监督学习,事先不知道数据会分为几类,通过聚类分析将数据聚合成几个群体。

knn和kmeans的区别

1.KNN算法是分类算法,分类算法肯定是需要有学习语料,然后通过学习语料的学习之后的模板来匹配我们的测试语料集,将测试语料集合进行按照预先学习的语料模板来分类

2Kmeans算法是聚类算法,聚类算法与分类算法最大的区别是聚类算法没有学习语料集合。

K-means算法是聚类分析中使用最广泛的算法之一。它把n个对象根据他们的属性分为k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。

Kmeans算法的缺陷

聚类中心的个数K 需要事先给定,但在实际中这个 K 值的选定是非常难以估计的,很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适

Kmeans需要人为地确定初始聚类中心,不同的初始聚类中心可能导致完全不同的聚类结果。(可以使用Kmeans++算法来解决)

针对上述第2个缺陷,可以使用Kmeans++算法来解决

K-Means ++ 算法

k-means++算法选择初始seeds的基本思想就是:初始的聚类中心之间的相互距离要尽可能的远。

从输入的数据点集合中随机选择一个点作为第一个聚类中心

对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x)

选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大

重复2和3直到k个聚类中心被选出来

利用这k个初始的聚类中心来运行标准的k-means算法

从上面的算法描述上可以看到,算法的关键是第3步,如何将D(x)反映到点被选择的概率上,一种算法如下:

先从我们的数据库随机挑个随机点当“种子点”

对于每个点,我们都计算其和最近的一个“种子点”的距离D(x)并保存在一个数组里,然后把这些距离加起来得到Sum(D(x))。

然后,再取一个随机值,用权重的方式来取计算下一个“种子点”。这个算法的实现是,先取一个能落在Sum(D(x))中的随机值Random,然后用Random -= D(x),直到其<=0,此时的点就是下一个“种子点”。

重复2和3直到k个聚类中心被选出来

利用这k个初始的聚类中心来运行标准的k-means算法

⑶ 数据挖掘 聚类算法概述

文 | 宿痕
来源 | 知乎
本篇重点介绍聚类算法的原理,应用流程、使用技巧、评估方法、应用案例等。具体的算法细节可以多查阅相关的资料。聚类的主要用途就是客户分群。
1.聚类 VS 分类
分类是“监督学习”,事先知道有哪些类别可以分。

聚类是“无监督学习”,事先不知道将要分成哪些类。

举个例子,比如苹果、香蕉、猕猴桃、手机、电话机。
根据特征的不同,我们聚类会分为【苹果、香蕉、猕猴桃】为水果的一类,和【手机、电话机】为数码产品的一类。
而分类的话,就是我们在判断“草莓”的时候,把它归为“水果”一类。
所以通俗的解释就是:分类是从训练集学习对数据的判断能力,再去做未知数据的分类判断;而聚类就是把相似的东西分为一类,它不需要训练数据进行学习。
学术解释:分类是指分析数据库中的一组对象,找出其共同属性。然后根据分类模型,把它们划分为不同的类别。分类数据首先根据训练数据建立分类模型,然后根据这些分类描述分类数据库中的测试数据或产生更恰当的描述。
聚类是指数据库中的数据可以划分为一系列有意义的子集,即类。在同一类别中,个体之间的距离较小,而不同类别上的个体之间的距离偏大。聚类分析通常称为“无监督学习”。
2.聚类的常见应用
我们在实际情况的中的应用会有:
marketing:客户分群
insurance:寻找汽车保险高索赔客户群
urban planning:寻找相同类型的房产
比如你做买家分析、卖家分析时,一定会听到客户分群的概念,用标准分为高价值客户、一般价值客户和潜在用户等,对于不同价值的客户提供不同的营销方案;

还有像在保险公司,那些高索赔的客户是保险公司最care的问题,这个就是影响到保险公司的盈利问题;
还有在做房产的时候,根据房产的地理位置、价格、周边设施等情况聚类热房产区域和冷房产区域。

3.k-means
(1)假定K个clusters(2)目标:寻找紧致的聚类
a.随机初始化clusters

b.分配数据到最近的cluster

c.重复计算clusters

d.repeat直到收敛

优点:局部最优
缺点:对于非凸的cluster有问题
其中K=?
K<=sample size
取决于数据的分布和期望的resolution
AIC,DIC
层次聚类避免了这个问题
4.评估聚类
鲁棒性?
聚类如何,是否过度聚合?
很多时候是取决于聚合后要干什么。
5.case案例
case 1:卖家分群云图

作者:宿痕 授权转载
原文链接:http://zhuanlan.hu.com/dataman/20397891

⑷ 数据挖掘干货总结(四)--聚类算法

本文共计2680字,预计阅读时长七分钟

聚类算法

 

本质

将数据划分到不同的类里,使相似的数据在同一类里,不相似的数据在不同类里

 

分类算法用来解决什么问题

文本聚类、图像聚类和商品聚类,便于发现规律,以解决数据稀疏问题

聚类算法基础知识

1. 层次聚类 vs 非层次聚类

– 不同类之间有无包含关系

2. 硬聚类 vs 软聚类

– 硬聚类:每个对象只属于一个类

– 软聚类:每个对象以某个概率属于每个类

3. 用向量表示对象

– 每个对象用一个向量表示,可以视为高维空间的一个点

– 所有对象形成数据空间(矩阵)

– 相似度计算:Cosine、点积、质心距离

4. 用矩阵列出对象之间的距离、相似度

5. 用字典保存上述矩阵(节省空间)

    D={(1,1):0,(1,2):2,(1,3):6...(5,5):0}

6. 评价方法

– 内部评价法(Internal Evalution):

• 没有外部标准,非监督式

• 同类是否相似,跨类是否相异

DB值越小聚类效果越好,反之,越不好

– 外部评价法(External Evalution):

• 准确度(accuracy): (C11+C22) / (C11 + C12 + C21 + C22)

• 精度(Precision): C11 / (C11 + C21 )

• 召回(Recall): C11 / (C11 + C12 )

• F值(F-measure):

β表示对精度P的重视程度,越大越重视,默认设置为1,即变成了F值,F较高时则能说明聚类效果较好。

有哪些聚类算法


主要分为 层次化聚类算法 划分式聚类算法 基于密度的聚类算法 基于网格的聚类算法 基于模型的聚类算法等

4.1 层次化聚类算法

又称树聚类算法,透过一种层次架构方式,反复将数据进行分裂或聚合。典型的有BIRCH算法,CURE算法,CHAMELEON算法,Sequence data rough clustering算法,Between groups average算法,Furthest neighbor算法,Neares neighbor算法等。

凝聚型层次聚类

先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇,直到所有对象都在一个簇中,或者某个终结条件被满足。

算法流程:

1. 将每个对象看作一类,计算两两之间的最小距离;

2. 将距离最小的两个类合并成一个新类;

3. 重新计算新类与所有类之间的距离;

4. 重复2、3,直到所有类最后合并成一类。

特点:

1. 算法简单

2. 层次用于概念聚类(生成概念、文档层次树)

3. 聚类对象的两种表示法都适用

4. 处理大小不同的簇

5. 簇选取步骤在树状图生成之后

4.2 划分式聚类算法

预先指定聚类数目或聚类中心,反复迭代逐步降低目标函数误差值直至收敛,得到最终结果。K-means,K-modes-Huang,K-means-CP,MDS_CLUSTER, Feature weighted fuzzy clustering,CLARANS等

经典K-means:

算法流程:

1. 随机地选择k个对象,每个对象初始地代表了一个簇的中心;

2. 对剩余的每个对象,根据其与各簇中心的距离,将它赋给最近的簇;

3. 重新计算每个簇的平均值,更新为新的簇中心;

4. 不断重复2、3,直到准则函数收敛。

特点:

1.K的选择

2.中心点的选择

– 随机

– 多轮随机:选择最小的WCSS

3.优点

– 算法简单、有效

– 时间复杂度:O(nkt)

4.缺点

– 不适于处理球面数据

– 密度、大小不同的聚类,受K的限制,难于发现自然的聚类


4.3 基于模型的聚类算法

为每簇假定了一个模型,寻找数据对给定模型的最佳拟合,同一”类“的数据属于同一种概率分布,即假设数据是根据潜在的概率分布生成的。主要有基于统计学模型的方法和基于神经网络模型的方法,尤其以基于概率模型的方法居多。一个基于模型的算法可能通过构建反应数据点空间分布的密度函数来定位聚类。基于模型的聚类试图优化给定的数据和某些数据模型之间的适应性。

SOM 神经网络算法

该算法假设在输入对象中存在一些拓扑结构或顺序,可以实现从输入空间(n维)到输出平面(2维)的降维映射,其映射具有拓扑特征保持性质,与实际的大脑处理有很强的理论联系。

SOM网络包含输入层和输出层。输入层对应一个高维的输入向量,输出层由一系列组织在2维网格上的有序节点构成,输入节点与输出节点通过权重向量连接。学习过程中,找到与之距离最短的输出层单元,即获胜单元,对其更新。同时,将邻近区域的权值更新,使输出节点保持输入向量的拓扑特征。

算法流程:

1. 网络初始化,对输出层每个节点权重赋初值;

2. 将输入样本中随机选取输入向量,找到与输入向量距离最小的权重向量;

3. 定义获胜单元,在获胜单元的邻近区域调整权重使其向输入向量靠拢;

4. 提供新样本、进行训练;

5. 收缩邻域半径、减小学习率、重复,直到小于允许值,输出聚类结果。

4.4 基于密度聚类算法

只要邻近区域的密度(对象或数据点的数目)超过某个阈值,就继续聚类,擅于解决不规则形状的聚类问题,广泛应用于空间信息处理,SGC,GCHL,DBSCAN算法、OPTICS算法、DENCLUE算法。

DBSCAN:

对于集中区域效果较好,为了发现任意形状的簇,这类方法将簇看做是数据空间中被低密度区域分割开的稠密对象区域;一种基于高密度连通区域的基于密度的聚类方法,该算法将具有足够高密度的区域划分为簇,并在具有噪声的空间数据中发现任意形状的簇。

4.5 基于网格的聚类算法

    基于网格的方法把对象空间量化为有限数目的单元,形成一个网格结构。所有的聚类操作都在这个网格结构(即量化空间)上进行。这种方法的主要优点是它的处理 速度很快,其处理速度独立于数据对象的数目,只与量化空间中每一维的单元数目有关。但这种算法效率的提高是以聚类结果的精确性为代价的。经常与基于密度的算法结合使用。代表算法有STING算法、CLIQUE算法、WAVE-CLUSTER算法等。 

⑸ 分类和聚类的区别及各自的常见算法

1、分类和聚类的区别:
Classification (分类),对于一个classifier,通常需要你告诉它“这个东西被分为某某类”这样一些例子,理想情况下,一个 classifier 会从它得到的训练集中进行“学习”,从而具备对未知数据进行分类的能力,这种提供训练数据的过程通常叫做supervised learning (监督学习),
Clustering (聚类),简单地说就是把相似的东西分到一组,聚类的时候,我们并不关心某一类是什么,我们需要实现的目标只是把相似的东西聚到一起。因此,一个聚类算法通常只需要知道如何计算相似度就可以开始工作了,因此 clustering 通常并不需要使用训练数据进行学习,这在Machine Learning中被称作unsupervised learning (无监督学习).
2、常见的分类与聚类算法
所谓分类,简单来说,就是根据文本的特征或属性,划分到已有的类别中。如在自然语言处理NLP中,我们经常提到的文本分类便就是一个分类问题,一般的模式分类方法都可用于文本分类研究。常用的分类算法包括:决策树分类法,朴素贝叶斯分类算法(native Bayesian classifier)、基于支持向量机(SVM)的分类器,神经网络法,k-最近邻法(k-nearestneighbor,kNN),模糊分类法等等。
分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应。但是很多时候上述条件得不到满足,尤其是在处理海量数据的时候,如果通过预处理使得数据满足分类算法的要求,则代价非常大,这时候可以考虑使用聚类算法。
而K均值(K-mensclustering)聚类则是最典型的聚类算法(当然,除此之外,还有很多诸如属于划分法K中心点(K-MEDOIDS)算法、CLARANS算法;属于层次法的BIRCH算法、CURE算法、CHAMELEON算法等;基于密度的方法:DBSCAN算法、OPTICS算法、DENCLUE算法等;基于网格的方法:STING算法、CLIQUE算法、WAVE-CLUSTER算法;基于模型的方法)。

⑹ 聚类算法有哪些分类

聚类算法的分类有:

1、划分法

划分法(partitioning methods),给定一个有N个元组或者纪录的数据集,分裂法将构造K个分组,每一个分组就代表一个聚类,K小于N。而且这K个分组满足下列条件:

(1) 每一个分组至少包含一个数据纪录;

(2)每一个数据纪录属于且仅属于一个分组(注意:这个要求在某些模糊聚类算法中可以放宽);

2、层次法

层次法(hierarchical methods),这种方法对给定的数据集进行层次似的分解,直到某种条件满足为止。具体又可分为“自底向上”和“自顶向下”两种方案。

例如,在“自底向上”方案中,初始时每一个数据纪录都组成一个单独的组,在接下来的迭代中,它把那些相互邻近的组合并成一个组,直到所有的记录组成一个分组或者某个条件满足为止。

3、密度算法

基于密度的方法(density-based methods),基于密度的方法与其它方法的一个根本区别是:它不是基于各种各样的距离的,而是基于密度的。这样就能克服基于距离的算法只能发现“类圆形”的聚类的缺点。

4、图论聚类法

图论聚类方法解决的第一步是建立与问题相适应的图,图的节点对应于被分析数据的最小单元,图的边(或弧)对应于最小处理单元数据之间的相似性度量。因此,每一个最小处理单元数据之间都会有一个度量表达,这就确保了数据的局部特性比较易于处理。图论聚类法是以样本数据的局域连接特征作为聚类的主要信息源,因而其主要优点是易于处理局部数据的特性。

5、网格算法

基于网格的方法(grid-based methods),这种方法首先将数据空间划分成为有限个单元(cell)的网格结构,所有的处理都是以单个的单元为对象的。这么处理的一个突出的优点就是处理速度很快,通常这是与目标数据库中记录的个数无关的,它只与把数据空间分为多少个单元有关。

代表算法有:STING算法、CLIQUE算法、WAVE-CLUSTER算法;

6、模型算法

基于模型的方法(model-based methods),基于模型的方法给每一个聚类假定一个模型,然后去寻找能够很好的满足这个模型的数据集。这样一个模型可能是数据点在空间中的密度分布函数或者其它。它的一个潜在的假定就是:目标数据集是由一系列的概率分布所决定的。

通常有两种尝试方向:统计的方案和神经网络的方案。

(6)聚类与分类的算法扩展阅读:

聚类算法的要求:

1、可伸缩性

许多聚类算法在小于 200 个数据对象的小数据集合上工作得很好;但是,一个大规模数据库可能包含几百万个对象,在这样的大数据集合样本上进行聚类可能会导致有偏的结果。

我们需要具有高度可伸缩性的聚类算法。

2、不同属性

许多算法被设计用来聚类数值类型的数据。但是,应用可能要求聚类其他类型的数据,如二元类型(binary),分类/标称类型(categorical/nominal),序数型(ordinal)数据,或者这些数据类型的混合。

3、任意形状

许多聚类算法基于欧几里得或者曼哈顿距离度量来决定聚类。基于这样的距离度量的算法趋向于发现具有相近尺度和密度的球状簇。但是,一个簇可能是任意形状的。提出能发现任意形状簇的算法是很重要的。

4、领域最小化

许多聚类算法在聚类分析中要求用户输入一定的参数,例如希望产生的簇的数目。聚类结果对于输入参数十分敏感。参数通常很难确定,特别是对于包含高维对象的数据集来说。这样不仅加重了用户的负担,也使得聚类的质量难以控制。

5、处理“噪声”

绝大多数现实中的数据库都包含了孤立点,缺失,或者错误的数据。一些聚类算法对于这样的数据敏感,可能导致低质量的聚类结果。

6、记录顺序

一些聚类算法对于输入数据的顺序是敏感的。例如,同一个数据集合,当以不同的顺序交给同一个算法时,可能生成差别很大的聚类结果。开发对数据输入顺序不敏感的算法具有重要的意义。

⑺ Kmeans聚类算法简介(有点枯燥)

1. Kmeans聚类算法简介

由于具有出色的速度和良好的可扩展性,Kmeans聚类算法算得上是最着名的聚类方法。Kmeans算法是一个重复移动类中心点的过程,把类的中心点,也称重心(centroids),移动到其包含成员的平均位置,然后重新划分其内部成员。k是算法计算出的超参数,表示类的数量;Kmeans可以自动分配样本到不同的类,但是不能决定究竟要分几个类。k必须是一个比训练集样本数小的正整数。有时,类的数量是由问题内容指定的。例如,一个鞋厂有三种新款式,它想知道每种新款式都有哪些潜在客户,于是它调研客户,然后从数据里找出三类。也有一些问题没有指定聚类的数量,最优的聚类数量是不确定的。后面我将会详细介绍一些方法来估计最优聚类数量。

Kmeans的参数是类的重心位置和其内部观测值的位置。与广义线性模型和决策树类似,Kmeans参数的最优解也是以成本函数最小化为目标。Kmeans成本函数公式如下:

μiμi是第kk个类的重心位置。成本函数是各个类畸变程度(distortions)之和。每个类的畸变程度等于该类重心与其内部成员位置距离的平方和。若类内部的成员彼此间越紧凑则类的畸变程度越小,反之,若类内部的成员彼此间越分散则类的畸变程度越大。求解成本函数最小化的参数就是一个重复配置每个类包含的观测值,并不断移动类重心的过程。首先,类的重心是随机确定的位置。实际上,重心位置等于随机选择的观测值的位置。每次迭代的时候,Kmeans会把观测值分配到离它们最近的类,然后把重心移动到该类全部成员位置的平均值那里。

2. K值的确定

2.1 根据问题内容确定

这种方法就不多讲了,文章开篇就举了一个例子。

2.2 肘部法则

如果问题中没有指定kk的值,可以通过肘部法则这一技术来估计聚类数量。肘部法则会把不同kk值的成本函数值画出来。随着kk值的增大,平均畸变程度会减小;每个类包含的样本数会减少,于是样本离其重心会更近。但是,随着kk值继续增大,平均畸变程度的改善效果会不断减低。kk值增大过程中,畸变程度的改善效果下降幅度最大的位置对应的kk值就是肘部。为了让读者看的更加明白,下面让我们通过一张图用肘部法则来确定最佳的kk值。下图数据明显可分成两类:

从图中可以看出,k值从1到2时,平均畸变程度变化最大。超过2以后,平均畸变程度变化显着降低。因此最佳的k是2。

2.3 与层次聚类结合

经常会产生较好的聚类结果的一个有趣策略是,首先采用层次凝聚算法决定结果粗的数目,并找到一个初始聚类,然后用迭代重定位来改进该聚类。

2.4 稳定性方法

稳定性方法对一个数据集进行2次重采样产生2个数据子集,再用相同的聚类算法对2个数据子集进行聚类,产生2个具有kk个聚类的聚类结果,计算2个聚类结果的相似度的分布情况。2个聚类结果具有高的相似度说明kk个聚类反映了稳定的聚类结构,其相似度可以用来估计聚类个数。采用次方法试探多个kk,找到合适的k值。

2.5 系统演化方法

系统演化方法将一个数据集视为伪热力学系统,当数据集被划分为kk个聚类时称系统处于状态kk。系统由初始状态k=1k=1出发,经过分裂过程和合并过程,系统将演化到它的稳定平衡状态 kiki ,其所对应的聚类结构决定了最优类数 kiki 。系统演化方法能提供关于所有聚类之间的相对边界距离或可分程度,它适用于明显分离的聚类结构和轻微重叠的聚类结构。

2.6 使用canopy算法进行初始划分

基于Canopy Method的聚类算法将聚类过程分为两个阶段

(1) 聚类最耗费计算的地方是计算对象相似性的时候,Canopy Method在第一阶段选择简单、计算代价较低的方法计算对象相似性,将相似的对象放在一个子集中,这个子集被叫做Canopy,通过一系列计算得到若干Canopy,Canopy之间可以是重叠的,但不会存在某个对象不属于任何Canopy的情况,可以把这一阶段看做数据预处理;

(2) 在各个Canopy内使用传统的聚类方法(如Kmeans),不属于同一Canopy的对象之间不进行相似性计算。

从这个方法起码可以看出两点好处:首先,Canopy不要太大且Canopy之间重叠的不要太多的话会大大减少后续需要计算相似性的对象的个数;其次,类似于Kmeans这样的聚类方法是需要人为指出K的值的,通过(1)得到的Canopy个数完全可以作为这个k值,一定程度上减少了选择k的盲目性。

其他方法如贝叶斯信息准则方法(BIC)可参看文献[4]。

3. 初始质心的选取

选择适当的初始质心是基本kmeans算法的关键步骤。常见的方法是随机的选取初始中心,但是这样簇的质量常常很差。处理选取初始质心问题的一种常用技术是:多次运行,每次使用一组不同的随机初始质心,然后选取具有最小SSE(误差的平方和)的簇集。这种策略简单,但是效果可能不好,这取决于数据集和寻找的簇的个数。

第二种有效的方法是,取一个样本,并使用层次聚类技术对它聚类。从层次聚类中提取kk个簇,并用这些簇的质心作为初始质心。该方法通常很有效,但仅对下列情况有效:(1)样本相对较小,例如数百到数千(层次聚类开销较大);(2) kk相对于样本大小较小。

第三种选择初始质心的方法,随机地选择第一个点,或取所有点的质心作为第一个点。然后,对于每个后继初始质心,选择离已经选取过的初始质心最远的点。使用这种方法,确保了选择的初始质心不仅是随机的,而且是散开的。但是,这种方法可能选中离群点。此外,求离当前初始质心集最远的点开销也非常大。为了克服这个问题,通常该方法用于点样本。由于离群点很少(多了就不是离群点了),它们多半不会在随机样本中出现。计算量也大幅减少。

第四种方法就是上面提到的canopy算法。

4. 距离的度量

常用的距离度量方法包括:欧几里得距离和余弦相似度。两者都是评定个体间差异的大小的。

欧氏距离是最常见的距离度量,而余弦相似度则是最常见的相似度度量,很多的距离度量和相似度度量都是基于这两者的变形和衍生,所以下面重点比较下两者在衡量个体差异时实现方式和应用环境上的区别。

借助三维坐标系来看下欧氏距离和余弦相似度的区别:

从图上可以看出距离度量衡量的是空间各点间的绝对距离,跟各个点所在的位置坐标(即个体特征维度的数值)直接相关;而余弦相似度衡量的是空间向量的夹角,更加的是体现在方向上的差异,而不是位置。如果保持A点的位置不变,B点朝原方向远离坐标轴原点,那么这个时候余弦相似cosθ是保持不变的,因为夹角不变,而A、B两点的距离显然在发生改变,这就是欧氏距离和余弦相似度的不同之处。

根据欧氏距离和余弦相似度各自的计算方式和衡量特征,分别适用于不同的数据分析模型:欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异;而余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦相似度对绝对数值不敏感)。

因为欧几里得距离度量会受指标不同单位刻度的影响,所以一般需要先进行标准化,同时距离越大,个体间差异越大;空间向量余弦夹角的相似度度量不会受指标刻度的影响,余弦值落于区间[-1,1],值越大,差异越小。但是针对具体应用,什么情况下使用欧氏距离,什么情况下使用余弦相似度?

从几何意义上来说,n维向量空间的一条线段作为底边和原点组成的三角形,其顶角大小是不确定的。也就是说对于两条空间向量,即使两点距离一定,他们的夹角余弦值也可以随意变化。感性的认识,当两用户评分趋势一致时,但是评分值差距很大,余弦相似度倾向给出更优解。举个极端的例子,两用户只对两件商品评分,向量分别为(3,3)和(5,5),这两位用户的认知其实是一样的,但是欧式距离给出的解显然没有余弦值合理。

5. 聚类效果评估

我们把机器学习定义为对系统的设计和学习,通过对经验数据的学习,将任务效果的不断改善作为一个度量标准。Kmeans是一种非监督学习,没有标签和其他信息来比较聚类结果。但是,我们还是有一些指标可以评估算法的性能。我们已经介绍过类的畸变程度的度量方法。本节为将介绍另一种聚类算法效果评估方法称为轮廓系数(Silhouette Coefficient)。轮廓系数是类的密集与分散程度的评价指标。它会随着类的规模增大而增大。彼此相距很远,本身很密集的类,其轮廓系数较大,彼此集中,本身很大的类,其轮廓系数较小。轮廓系数是通过所有样本计算出来的,计算每个样本分数的均值,计算公式如下:

aa是每一个类中样本彼此距离的均值,bb是一个类中样本与其最近的那个类的所有样本的距离的均值。

6. Kmeans算法流程

输入:聚类个数k,数据集XmxnXmxn。 

输出:满足方差最小标准的k个聚类。

(1) 选择k个初始中心点,例如c[0]=X[0] , … , c[k-1]=X[k-1];

(2) 对于X[0]….X[n],分别与c[0]…c[k-1]比较,假定与c[i]差值最少,就标记为i;

(3) 对于所有标记为i点,重新计算c[i]={ 所有标记为i的样本的每个特征的均值};

(4) 重复(2)(3),直到所有c[i]值的变化小于给定阈值或者达到最大迭代次数。

Kmeans的时间复杂度:O(tkmn),空间复杂度:O((m+k)n)。其中,t为迭代次数,k为簇的数目,m为样本数,n为特征数。

7. Kmeans算法优缺点

7.1 优点

(1). 算法原理简单。需要调节的超参数就是一个k。

(2). 由具有出色的速度和良好的可扩展性。

7.2 缺点

(1). 在 Kmeans 算法中 kk 需要事先确定,这个 kk 值的选定有时候是比较难确定。

(2). 在 Kmeans 算法中,首先需要初始k个聚类中心,然后以此来确定一个初始划分,然后对初始划分进行优化。这个初始聚类中心的选择对聚类结果有较大的影响,一旦初始值选择的不好,可能无法得到有效的聚类结果。多设置一些不同的初值,对比最后的运算结果,一直到结果趋于稳定结束。

(3). 该算法需要不断地进行样本分类调整,不断地计算调整后的新的聚类中心,因此当数据量非常大时,算法的时间开销是非常大的。

(4). 对离群点很敏感。

(5). 从数据表示角度来说,在 Kmeans 中,我们用单个点来对 cluster 进行建模,这实际上是一种最简化的数据建模形式。这种用点来对 cluster 进行建模实际上就已经假设了各 cluster的数据是呈圆形(或者高维球形)或者方形等分布的。不能发现非凸形状的簇。但在实际生活中,很少能有这种情况。所以在 GMM 中,使用了一种更加一般的数据表示,也就是高斯分布。

(6). 从数据先验的角度来说,在 Kmeans 中,我们假设各个 cluster 的先验概率是一样的,但是各个 cluster 的数据量可能是不均匀的。举个例子,cluster A 中包含了10000个样本,cluster B 中只包含了100个。那么对于一个新的样本,在不考虑其与A cluster、 B cluster 相似度的情况,其属于 cluster A 的概率肯定是要大于 cluster B的。

(7). 在 Kmeans 中,通常采用欧氏距离来衡量样本与各个 cluster 的相似度。这种距离实际上假设了数据的各个维度对于相似度的衡量作用是一样的。但在 GMM 中,相似度的衡量使用的是后验概率 αcG(x|μc,∑c)αcG(x|μc,∑c) ,通过引入协方差矩阵,我们就可以对各维度数据的不同重要性进行建模。

(8). 在 Kmeans 中,各个样本点只属于与其相似度最高的那个 cluster ,这实际上是一种 hard clustering 。

针对Kmeans算法的缺点,很多前辈提出了一些改进的算法。例如 K-modes 算法,实现对离散数据的快速聚类,保留了Kmeans算法的效率同时将Kmeans的应用范围扩大到离散数据。还有K-Prototype算法,可以对离散与数值属性两种混合的数据进行聚类,在K-prototype中定义了一个对数值与离散属性都计算的相异性度量标准。当然还有其它的一些算法,这里我 就不一一列举了。

Kmeans 与 GMM 更像是一种 top-down 的思想,它们首先要解决的问题是,确定 cluster 数量,也就是 k 的取值。在确定了 k 后,再来进行数据的聚类。而 hierarchical clustering 则是一种 bottom-up 的形式,先有数据,然后通过不断选取最相似的数据进行聚类。

阅读全文

与聚类与分类的算法相关的资料

热点内容
android兼容测试工具 浏览:92
云服务器不支持虚拟化怎么办 浏览:187
加密方式的演变 浏览:364
java常用算法pdf 浏览:734
服务器数据遇到异常什么原因 浏览:450
phpexif信息 浏览:542
单片机三字节浮点数 浏览:756
命令与征服泰伯利亚战争下载 浏览:378
c窗口界面编程 浏览:23
hypermill编程能做模板吗 浏览:782
计算机网络最经典的算法 浏览:628
华为思科的配置命令 浏览:869
linux设置光盘启动 浏览:361
程序员俱乐部注册 浏览:19
洗洁精鸡蛋盘解压视频 浏览:294
企业内网加密app 浏览:49
腾讯云服务器怎么设置本地网络 浏览:625
日常程序员 浏览:515
哪个pe有bit加密功能 浏览:110
rust服务器是用什么ip 浏览:694