简介

从9到13章基本介绍的都是监督学习的分类与回归方法,接下来我们来介绍一下非监督学习。

非监督学习只有输入量python isodata非监督分类 非监督分类精度验证_相似性度量,即没有类别,又不需要与数据环境有交互进行增强学习。我们可以认为非监督学习主要是用来识别某一种模式,可以降维、也可以是其它学习模型的输入,如主成分回归等等。

非监督学习的目标大体有两类

  • 聚类:k-means ,高斯混合模型等
  • 维度压缩与成分提取:如因子分析FA、主成分分析PCA,独立成分分析ICA等

关于维度压缩与成分提取,参见第5章,本章只集中介绍一些聚类的方法。

正文

一,传统聚类模型简介

分类

模型名称

时间复杂度

基于划分的

K-means

O(nkt),low,t表示迭代次数

基于划分的

K-Medoid

O(k(n-k)ˆ2),high

基于划分的

PAM

O(kˆ3*nˆ2) ,high

基于划分的

CLARA

O(ksˆ2+k(n-k)) ,middle

基于划分的

CLARANS

O(nˆ2),high

基于划分的

K-Modes

基于划分的

k-prototypes

基于模型的

混合高斯模型GMM

O(nˆ2*kt),high

基于模型的

自组织映射SOM

(layer),high

基于模型的

COBWEB

(distribution),low

基于模型的

ART

(type+layer),middle

基于网格的

STING

O(n),low

基于网格的

CLIQUE

O(n+kˆ2),low

基于密度的

DBSCAN

O(n*logn),middle

基于密度的

OPTICS

O(n*logn),middle

基于密度的

DENCLUE

基于图的

SNN(shared nearest neighbor)

基于图的

CLICK

O(k*f(v, e)),low

基于图的

MST聚类

O(e*logv),middle

基于层级的

凝聚的层次聚类AGNES

基于层级的

分裂的层次聚类DIANA

基于层级的

BIRCH

O(n),low

基于层级的

CURE

O(sˆ2*s),low

基于层级的

ROCK

O(nˆ2*logn),high

基于层级的

Chameleon

O(nˆ2),high

基于模糊理论的

FCM

O(n),low

基于模糊理论的

FCS

(kernel),high

基于模糊理论的

MM

O(vˆ2*n),middle,

二,相似性度量或相异性度量

度量名称

公式

说明

相似性度量

简单匹配系数(SMC)

二元0-1属性的相似性度量

x取0,y取0的属性的个数

x取0,y取1的属性的个数

x取1,y取0的属性的个数

x取1,y取1的属性的个数

相似性度量

Jaccard系数

如果0-1属性是等重要性的如表示两种性别,则用SMC较好。

但是市场研究中往往0-1的重要性是不相等的。

比如1000商品中个,A顾客买了盐和水,B顾客买了盐和面,

那么Jaccard=1/3,而SMC=0.998

相似性度量

Tanimoto系数

相似性度量

余弦相似度

用两个向量的夹角来衡量相似性

相似性度量

相关系数

pearson、spearman、kendall

1- 余弦相似度 ,以及1-相关系数

都可以转化为相异性度量

相异性度量

Minkowski距离

||

当p=1时,曼哈顿距离;

当p=2时,欧式距离;

当p→∞时,切比雪夫距离

相异性度量

Mahalanobis距离

python isodata非监督分类 非监督分类精度验证_监督学习_13

∑为协方差矩阵;

与欧式距离不同的是它考虑到各种特性之间的联系,

并且是尺度无关的(独立于测量尺度)

相异性度量

Hamming距离

两个等长字符串中对应位置的不同字符的个数

batch和catch的汉明距离为1

相异性度量

Bregman散度

python isodata非监督分类 非监督分类精度验证_监督学习_13

python isodata非监督分类 非监督分类精度验证_监督学习_13

python isodata非监督分类 非监督分类精度验证_监督学习_13

python isodata非监督分类 非监督分类精度验证_监督学习_13是函数python isodata非监督分类 非监督分类精度验证_监督学习_13在y点处的线性部分

Bregman散度是衡量一个函数python isodata非监督分类 非监督分类精度验证_监督学习_13

与函数在y点的线性部分之间的差异

Bregman散度的例子

假设python isodata非监督分类 非监督分类精度验证_监督学习_13, Bregman散度为

python isodata非监督分类 非监督分类精度验证_聚类_21

y=1,x=3,时

python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_22


度量有三种对象

  • 点与点之间
  • 点与簇之间
  • 簇与簇之间

上述介绍的主要是一些点与点之间的度量方法,点与簇、簇与簇的度量方法一般是基于点与点之间的度量结果,取最大/最小值,或者加权平均值等等。

三,基于划分的聚类
1,K-means
  • 模型思想

用质心来表示簇(cluster),随机初始化质心之后,不断迭代质心,当质心不在变化或者目标函数收敛时停止迭代。

  • 算法原理

kmeans的计算方法如下:

  • 初始化质心:随机选取k个点作为质心的初始值;
  • 迭代质心
  • 将每个数据划分到最近(距离最小)的质心中,并更新簇
  • 计算每个新的簇的质心值,更新质心值
  • 重复上一步,直到这k个质心不变或者目标函数python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_23收敛时则停止迭代

k均值常见的距离度量、质心与目标函数组合

距离

质心

目标函数

曼哈顿距离python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_23

中位数

最小化对象到质心的python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_23距离和

欧几里得距离的平方python isodata非监督分类 非监督分类精度验证_聚类_26

均值

最小化对象到质心的python isodata非监督分类 非监督分类精度验证_聚类_26距离和

余弦

均值

最大化对象到质心的余弦相似度和

Bregman散度

均值

最小化对象到质心的Bregman散度和

缺点:
  • 选择适当的初始质心是基本K均值过程的关键步骤,虽然都是随机化的选取,但是簇的质量较差,仅可实现局部最优。
  • 因为k均值的目标函数是最小化等尺寸和等密度的球形簇,或者明显分离的簇,对于不满足这些条件的聚类效果不好。而且对异常点、离群点也比较敏感。最后,k均值仅限于具有中心(质心)概念的数据。
改进
  • 二分法,不断二分选取簇中心
簇的评估

用于评估簇的指标一般分成三类:

1). 非监督的
聚类结构的优良性度量,不考虑外部信息。簇的有效性度量常常可以进一步分成两类:簇的凝聚性(cluster cohesion),簇的分离性(cluster separation)。非监督度量通常称为内部指标,因为仅使用出现在数据集中的信息;

2). 监督的
度量聚类算法发现的聚类结构与某种外部结构的匹配程度。例如,熵,它度量簇标号与外部提供的标号的匹配程度。监督度量通常称为外部指标,因为使用了不在数据集中出现的信息;

3). 相对的
比较不同的聚类或簇。不限于一种度量类型及方法的使用;

非监督的评估-轮廓系数(silhouette coefficient)

基于划分的聚类模型,簇有效性评价都是基于凝聚度和分离度概念出发的,轮廓系数即是凝聚度和分离度的组合评价指标。

凝聚度与分离度有两种衡量方式,要么是根据类内以及类间各点距离的加权值;要么是类内各点到质心,以及类间各质心之间的距离值。

python isodata非监督分类 非监督分类精度验证_监督学习_28

python isodata非监督分类 非监督分类精度验证_监督学习_29


在某些情况下,凝聚度和分离度之间也存在很强的联系。即总平方和TSS—每个点到数据的总均值的距离平方和,等于SSE+SSB。这种前提下,最小化SSE(凝聚度)等价于最大化SSB(分离度)。

k均值的轮廓系数是以第一种方式定义凝聚度与分离度的

  • 对于第i个对象的凝聚度:计算它到簇中所有其他对象的平均距离。该值记为python isodata非监督分类 非监督分类精度验证_聚类_26
  • 对于第i个对象的分离度:计算它和不包含该对象的任意簇,计算该对象到给定簇中所有对象的平均距离。遍历计算其他的簇,找出最小值。该值记作python isodata非监督分类 非监督分类精度验证_监督学习_31
  • 对于第i个对象,轮廓系数python isodata非监督分类 非监督分类精度验证_聚类_32;
  • 计算所有点轮廓系数的平均值,得到聚类优良性的总度量python isodata非监督分类 非监督分类精度验证_聚类_33.轮廓系数
  • 通常我们取轮廓系数最大或较大的拐点处对应的分类个数k。
2,k-Medoids
  • 模型思想

与kmeans不同,k中心点算法是用样本中实际的点来作为簇的中心点,用以表示簇(cluster)。随机初始化中心点之后,不断迭代用其他点替换中心点,当中心点不在变化或者目标函数收敛时停止迭代。

  • 算法原理

k-medoids的计算方法如下:

  • 初始化中心点:随机选取k个点作为初始值;
  • 迭代中心点
  • 将每个数据划分到最近(距离最小)的中心点,并更新簇,得到一组目标函数值
  • 随机再选择一个点替换中心点,并重新计算上述值,如果满足目标函数则交换中心点
  • 重复上一步,直到这k个中心点不变或者目标函数收敛时则停止迭代
3,k-medoids思想延伸出的三种算法
PAM算法(Partitioning Around Medoid)
  • 算法原理

选择的中心点集合我们成为S集,未选择的中心点结合我们成为U集

  1. 在第一阶段,我们为初始化集合S,建立一组包含k个中心点对象的集合。
    1.1 S中的第一个点:所有点到该点的距离和最小;
    1.2 U中选取一点python isodata非监督分类 非监督分类精度验证_监督学习_34,作为进入S集的候选对象;
    1.3 U中再选取一点 python isodata非监督分类 非监督分类精度验证_相似性度量_35,并计算python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_36,表示为python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_37点到S集合中各对象距离的最小值
    1.4 如果python isodata非监督分类 非监督分类精度验证_聚类_38,则说明我们选择点python isodata非监督分类 非监督分类精度验证_相似性度量_39是可行的(因为如果点python isodata非监督分类 非监督分类精度验证_相似性度量_39是另一个簇的中心点,那么点python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_37的信息帮我们说明,点python isodata非监督分类 非监督分类精度验证_相似性度量_39表示的簇与S集中最近的那个簇也是有区分度的)我们令python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_43
    1.5 计算所有U集合中的点的累计值, 记为python isodata非监督分类 非监督分类精度验证_聚类_44
    1.6 选取最大化python isodata非监督分类 非监督分类精度验证_聚类_45值的点python isodata非监督分类 非监督分类精度验证_相似性度量_39,更新集合python isodata非监督分类 非监督分类精度验证_聚类_47,python isodata非监督分类 非监督分类精度验证_相似性度量_48
    1.7 重复上述步骤,直到选取k个值
  2. 在第二个阶段,我们通过交换第一阶段中选中的对象与U集合中未选中的对象来提高簇聚合的质量。
    对于python isodata非监督分类 非监督分类精度验证_聚类_49, 我们需要对所有的配对python isodata非监督分类 非监督分类精度验证_监督学习_50,计算目标函数python isodata非监督分类 非监督分类精度验证_监督学习_51. 如果满足目标函数的要求,则把点python isodata非监督分类 非监督分类精度验证_聚类_52从U中移到S中,把点python isodata非监督分类 非监督分类精度验证_相似性度量_39从S中移到U中。
    我们记python isodata非监督分类 非监督分类精度验证_聚类_54,表示为点python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_37支持中心点python isodata非监督分类 非监督分类精度验证_相似性度量_39与候选中心点python isodata非监督分类 非监督分类精度验证_聚类_52互换的代价。
    我们记python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_36表示为点python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_37到S集合中最近点的距离,记python isodata非监督分类 非监督分类精度验证_聚类_60表示为点python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_37到S集合中第二近的点的距离。所以,我们有python isodata非监督分类 非监督分类精度验证_监督学习_62)
    2.1 计算python isodata非监督分类 非监督分类精度验证_聚类_54
    (a). 如果python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_64
    i. 如果 python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_65,则 python isodata非监督分类 非监督分类精度验证_聚类_54=0
    ii. 如果 python isodata非监督分类 非监督分类精度验证_聚类_67,则 python isodata非监督分类 非监督分类精度验证_聚类_54= python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_69
    则,python isodata非监督分类 非监督分类精度验证_聚类_54= min{python isodata非监督分类 非监督分类精度验证_监督学习_71}
    (b). 如果python isodata非监督分类 非监督分类精度验证_聚类_72
    i. 如果 python isodata非监督分类 非监督分类精度验证_监督学习_73,则 python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_74
    ii. 如果 python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_75,则 python isodata非监督分类 非监督分类精度验证_聚类_54 = python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_69
    python isodata非监督分类 非监督分类精度验证_聚类_54 = min{python isodata非监督分类 非监督分类精度验证_相似性度量_79

我们可以通过下图,了解各距离的关系:

python isodata非监督分类 非监督分类精度验证_监督学习_80


2.2 计算所有点的累计python isodata非监督分类 非监督分类精度验证_监督学习_81,即点 python isodata非监督分类 非监督分类精度验证_相似性度量_82互换的目标函数

python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_83

2.3 目标函数最小化python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_84得到的一对点python isodata非监督分类 非监督分类精度验证_相似性度量_82

2.4 判断是否互换
如果python isodata非监督分类 非监督分类精度验证_聚类_86,交换python isodata非监督分类 非监督分类精度验证_相似性度量_82;更新python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_88,返回步骤1
如果python isodata非监督分类 非监督分类精度验证_监督学习_89,停止




CLARA算法 (Clustering LARge Applications)

不考虑整个数据集, 而是选择数据的一小部分作为样本。它从数据集中抽取多个样本集, 对每个样本集使用PAM, 并以最好的聚类作为输出

CLARA 算法的步骤:
  (1) for i = 1 to 5 (选样的次数) ,重复执行下列步骤 :
  (2) 随机地从整个数据库中抽取一个N(例如:(40 + 2 k))个对象的样本,调用PAM方法从样本中找出样本的k个最优的中心点。
  (3)将这k个中心点应用到整个数据库上, 对于每一个非代表对象Oj ,判断它与从样本中选出的哪个代表对象距离最近.
  (4) 计算上一步中得到的聚类的总代价. 若该值小于当前的最小值,用该值替换当前的最小值,保留在这次选样中得到的k个代表对象作为到目前为止得到的最好的代表对象的集合.
  (5) 返回到步骤(1) ,开始下一个循环.
  算法结束后,输出最好的聚类结果。




CLARAS算法 (Clustering Large Applications based on RANdomized Search)

算法引入了图(graph)的概念,寻找k个中心点的过程,可以被抽象的看作是寻找一个特定的图。在这个图中,一个节点(node)代表了一组k个中心点的候选集。所以,PAM算法实际上也是为了找出一个目标代价最小一个图作为聚类的结果。

定义相邻(neighbor),在这个抽象的图中,如果两个节点所代表的k个中心点对象仅相差一个,就认为这两个节点代表的对象互为近邻neighbors。

因为每个节点代表了一组k个中心点,所以每个节点都可以对应的给出一个代价函数,两个近邻节点之间的代价函数差异,也代表了两个节点所相差的两个中心点候选对象相互交换后的代价差异。

(所以,由于近邻的思想,CLARAS算法对变量对象的输入顺序比较敏感.)

PAM相当于是要计算比较所有近邻点得到最优结果。
CLARA相当于是抽样一部分节点后,计算比较每个节点对于的近邻点(neighbors)的结果。
CLARAS是通过动态的抽样,不光抽样每个节点,每个节点下面的近邻点也是抽样选取的,然后再比较结果。

算法具体步骤:

  • 第 1 步输入参数numlocal 和maxneighbor。
  • 第 2 步从 n 个目标中随机地选取k 个目标构成质心集合,并令它们作为current集合。
  • 第 3 步令 j 等于1。
  • 第 4 步从第 2 步中剩下的n–k 个目标集中随机选取一个目标,并用之替换质心集合中随机的某一个质心可得到一个新的质心集合,计算两个质心集合的代价差(这一点和PAM相似,只是变成了随机选取替换对象和被替换对象)。这两个集合也就是抽象图中的近邻节点。
  • 第 5 步如果新的质心集合代价较小则将其赋给current,重置j=1,否则j+=1
  • 第 6 步直到j大于等于maxneighbor,则current为此时的最小代价质心集合
  • 第 7 步重复以上步骤numlocal次,取其中代价最小的质心集合为最终质心集合
  • 第 8 步按照最终质心集合进行划分并输出


4,K-Modes

kmodes思想与kmeans基本一致,只是针对的数据类型不同。kmeans只针对连续型数值数据,对于离散的属性的变量数据来说,差异性度量,即距离的度量方法需要变更,由此延伸出了kmodes模型。

而且,kmeans采用的是簇的质心作为聚类的划分中心,而kmodes采用的是簇的属性的众数作为聚类划分的中心。

kmodes的度量,采用的是Hamming距离,即两个等长字符串中对应位置的不同字符的个数。

算法步骤:

  • 初始化k个类中心:随机确定k个聚类中心python isodata非监督分类 非监督分类精度验证_聚类_90python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_91是长度为M的向量,python isodata非监督分类 非监督分类精度验证_相似性度量_92
  • 对于样本python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_93,分别比较其与k个中心之间的距离(这里的距离为不同属性值的个数
  • python isodata非监督分类 非监督分类精度验证_监督学习_94划分到距离最小的簇,在全部的样本都被划分完毕之后,重新确定簇中心,向量python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_91中的每一个分量都更新为簇i中的众数
  • 重复步骤二和三,直到总距离(各个簇中样本与各自簇中心距离之和)不再降低,返回最后的聚类结果


5,K-Prototypes

结合了kmeans 与 kmodes的思想,用于处理混合了数值型与离散型的数据。如果数据中没有离散的情况,那么kprotoypes方法与kmeans等价。

所以,对于kprototypes方法,差异在于,相异度距离的衡量,与损失代价的目标函数的衡量。

损失函数可以统一的表述为下面形式:

python isodata非监督分类 非监督分类精度验证_监督学习_96


其中,python isodata非监督分类 非监督分类精度验证_聚类_97是划分矩阵,表示变量python isodata非监督分类 非监督分类精度验证_聚类_98属于哪个分类python isodata非监督分类 非监督分类精度验证_相似性度量_99.

python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_100,表示的是硬划分,1表示属于此分类,0表示不属于此分类.

如果python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_101的实数,则表示python isodata非监督分类 非监督分类精度验证_聚类_97为模糊的划分矩阵

(模糊的划分,等到基于模糊的聚类方法时会讲到,本章的方法均运用的是硬划分).根据数据类型,相异度距离的衡量变为:

python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_103


其中,上角标带有‘r’的表示为数值型数据对应的数据与类中心,上角标带有‘c’的表示为离散数据对应的数据与类中心。python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_104表示权重。所以,代价损失函数也拆分成了两部分。

python isodata非监督分类 非监督分类精度验证_聚类_105

kprototype算法的步骤与kmeans基本一致,只是权重python isodata非监督分类 非监督分类精度验证_python isodata非监督分类_104对结果的影响比较大。



综上,对于基于划分的聚类方法,为了解释簇中隐含的信息与规则,我们也可以基于聚类结果,再次引用决策树算法,来归纳并提供簇中的规则信息,以解释簇。
具体决策树的算法,参考,第十章

参考:
A Comprehensive Survey of Clustering Algorithmshttps://www.cs.umb.edu/cs738/pam1.pdfhttp://www.cs.ecu.edu/dingq/CSCI6905/readings/CLARANS.pdfhttps://grid.cs.gsu.edu/~wkim/index_files/papers/kprototype.pdf 数据挖掘导论