一文概览无监督聚类算法有多少 | 算法基础(10)

2020-08-04 17:02:51 浏览数 (1)

今天,你算法了没?

关注:九三智能控,每天学点AI算法

1.聚类算法概述

数据聚类算法可以分为划分法、层次法、密度算法、图论聚类算法、网格算法、模型算法,通过对样品或指标进行分类的一种多元统计分析方法,在许多领域受到广泛应用,包括机器学习,数据挖掘,模式识别 ,图像分析以及生物信息。聚类是把相似的对象通过静态分类的方法分成不同的组别或者更多的子集(subset),这样让在同一个子集中的成员对象都有相似的一些属性。

2.划分法

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

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

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

对于给定的K,算法首先给出一个初始的分组方法,以后通过反复迭代的方法改变分组,使得每一次改进之后的分组方案都较前一次好,而所谓好的标准就是:同一分组中的记录越近越好,而不同分组中的纪录越远越好

  大部分划分方法是基于距离的。给定要构建的分区数k,划分方法首先创建一个初始化划分。然后,它采用一种迭代的重定位技术,通过把对象从一个组移动到另一个组来进行划分。一个好的划分的一般准备是:同一个簇中的对象尽可能相互接近或相关,而不同的簇中的对象尽可能远离或不同。还有许多评判划分质量的其他准则。传统的划分方法可以扩展到子空间聚类,而不是搜索整个数据空间。当存在很多属性并且数据稀疏时,这是有用的。为了达到全局最优,基于划分的聚类可能需要穷举所有可能的划分,计算量极大。实际上,大多数应用都采用了流行的启发式方法,如k-均值和k-中心算法,渐近的提高聚类质量,逼近局部最优解。这些启发式聚类方法很适合发现中小规模的数据库中小规模的数据库中的球状簇。为了发现具有复杂形状的簇和对超大型数据集进行聚类,需要进一步扩展基于划分的方法。基于这个基本思想的算法有:

a.k-means:是一种典型的划分聚类算法,它用一个聚类的中心来代表一个簇,即在迭代过程中选择的聚点不一定是聚类中的一个点,该算法只能处理数值型数据。

b.k-modes:K-Means:算法的扩展,采用简单匹配方法来度量分类型数据的相似度。

c.k-prototypes:结合了K-Means和K-Modes两种算法,能够处理混合型数据。

d.k-medoids:在迭代过程中选择簇中的某点作为聚点,PAM是典型的k-medoids算法。

e.CLARA: CLARA算法在PAM的基础上采用了抽样技术,能够处理大规模数据。

f.CLARANS: CLARANS算法融合了PAM和CLARA两者的优点,是第一个用于空间数据库的聚类算法。

g.Focused CLARAN:采用了空间索引技术提高了CLARANS算法的效率。

h.PCM:模糊集合理论引入聚类分析中并提出了PCM模糊聚类算法。

3.层次法

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

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

  代表算法有:

a.CURE:采用抽样技术先对数据集D随机抽取样本,再采用分区技术对样本进行分区,然后对每个分区局部聚类,最后对局部聚类进行全局聚类。

  b.ROCK:也采用了随机抽样技术,该算法在计算两个对象的相似度时,同时考虑了周围对象的影响。

  c.CHEMALOEN:首先由数据集构造成一个K-最近邻图Gk ,再通过一个图的划分算法将图Gk 划分成大量的子图,每个子图代表一个初始子簇,最后用一个凝聚的层次聚类算法反复合并子簇,找到真正的结果簇。

  d.SBAC: SBAC算法则在计算对象间相似度时,考虑了属性特征对于体现对象本质的重要程度,对于更能体现对象本质的属性赋予较高的权值。

  e.BIRCH: BIRCH算法利用树结构对数据集进行处理,叶结点存储一个聚类,用中心和半径表示,顺序处理每一个对象,并把它划分到距离最近的结点,该算法也可以作为其他聚类算法的预处理过程。

  f.BUBBLE: BUBBLE算法则把BIRCH算法的中心和半径概念推广到普通的距离空间。

  g.BUBBLE-FM: BUBBLE-FM算法通过减少距离的计算次数,提高了BUBBLE算法的效率。

4.密度算法

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

  这个方法的指导思想就是,只要一个区域中的点的密度大过某个阈值,就把它加到与之相近的聚类中去

  代表算法有:

a.DBSCAN: DBSCAN算法是一种典型的基于密度的聚类算法,该算法采用空间索引技术来搜索对象的邻域,引入了“核心对象”和“密度可达”等概念,从核心对象出发,把所有密度可达的对象组成一个簇。

 b.GDBSCAN:算法通过泛化DBSCAN算法中邻域的概念,以适应空间对象的特点。

 c.OPTICS: OPTICS算法结合了聚类的自动性和交互性,先生成聚类的次序,可以对不同的聚类设置不同的参数,来得到用户满意的结果。

  d.FDC: FDC算法通过构造k-d tree把整个数据空间划分成若干个矩形空间,当空间维数较少时可以大大提高DBSCAN的效率。

5.图论聚类法

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

6.网格算法

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

  代表算法有:

a.STING:利用网格单元保存数据统计信息,从而实现多分辨率的聚类

  b.WaveCluster:在聚类分析中引入了小波变换的原理,主要应用于信号处理领域。(备注:小波算法在信号处理,图形图像,加密解密等领域有重要应用。)

  c.CLIQUE:是一种结合了网格和密度的聚类算法。

7.基于模型的聚类算法

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

  通常有两种尝试方向:统计的方案和神经网络的方案,其中基于统计方案的聚类算法又有如下几种:

a.COBWeb: COBWeb是一个通用的概念聚类方法,它用分类树的形式表现层次聚类。  

b.AutoClass:是以概率混合模型为基础,利用属性的概率分布来描述聚类,该方法能够处理混合型的数据,但要求各属性相互独立。

  而基于神经网络方案的聚类算法又有:自组织神经网络SOM,该方法的基本思想是--由外界输入不同的样本到人工的自组织映射网络中,一开始时,输入样本引起输出兴奋细胞的位置各不相同,但自组织后会形成一些细胞群,它们分别代表了输入样本,反映了输入样本的特征。

8.用户行为聚类案例

利用用户行为数据(trip.csv),对用户行为进行聚类,聚成不同类型行为 。 利用Python的scikit-learn包中的Kmeans算法进行聚类算法的应用练习。并利用scikit-learn包中的PCA算法来对聚类后的数据进行降维,然后画图展示出聚类效果。

将用于聚类的数据的特征的维度降至2维,并输出降维后的数据,形成一个dataframe名字new_pca

画图来展示聚类效果(可用如下代码):

代码语言:javascript复制
import matplotlib.pyplot asplt

  d = new_pca[new_df['jllable'] == 0]

  plt.plot(d[0], d[1], 'r.')

  d = new_pca[new_df['jllable'] == 1]

  plt.plot(d[0], d[1], 'go')

  d = new_pca[new_df['jllable'] == 2]

  plt.plot(d[0], d[1], 'b*')

  plt.gcf().savefig('D:/workspace/python/Practice/ddsx/kmeans.png')

  plt.show()

python实现代码如下:

from sklearn.cluster import KMeans

from sklearn.decomposition import PCA

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

df=pd.read_csv('trip.csv', header=0, encoding='utf-8')

df1=df.ix[:,2:]

kmeans = KMeans(n_clusters=3, random_state=10).fit(df1)

df1['jllable']=kmeans.labels_

df_count_type=df1.groupby('jllable').apply(np.size)



##各个类别的数目

df_count_type

##聚类中心

kmeans.cluster_centers_

##新的dataframe,命名为new_df ,并输出到本地,命名为new_df.csv。

new_df=df1[:]

new_df

new_df.to_csv('new_df.csv')

##将用于聚类的数据的特征的维度降至2维,并输出降维后的数据,形成一个dataframe名字new_pca

pca = PCA(n_components=2)

new_pca = pd.DataFrame(pca.fit_transform(new_df))

##可视化

d = new_pca[new_df['jllable'] == 0]

plt.plot(d[0], d[1], 'r.')

d = new_pca[new_df['jllable'] == 1]

plt.plot(d[0], d[1], 'go')

d = new_pca[new_df['jllable'] == 2]

plt.plot(d[0], d[1], 'b*')

plt.gcf().savefig('kmeans.png')

plt.show()

0 人点赞