数据挖掘之聚类分析总结(建议收藏)

大数据
聚类分析是按照个体的特征将他们分类,让同一个类别内的个体之间具有较高的相似度,不同类别之间具有较大的差异性。

聚类分析

一、概念

聚类分析是按照个体的特征将他们分类,让同一个类别内的个体之间具有较高的相似度,不同类别之间具有较大的差异性

  • 聚类分析属于无监督学习
  • 聚类对象可以分为Q型聚类和R型聚类

Q型聚类:样本/记录聚类 以距离为相似性指标 (欧氏距离、欧氏平方距离、马氏距离、明式距离等)

R型聚类:指标/变量聚类 以相似系数为相似性指标 (皮尔逊相关系数、夹角余弦、指数相关系数等)

二、常用的聚类算法

  • K-Means划分法
  • 层次聚类法
  • DBSCAN密度法

1、K-Means划分法

K表示聚类算法中类的个数,Means表示均值算法,K-Means即是用均值算法把数据分成K个类的算法。

K-Means算法的目标,是把n个样本点划分到k个类中,使得每个点都属于离它最近的质心(一个类内部所有样本点的均值)对应的类,以之作为聚类的标准。

K-Means算法的计算步骤

  • 取得k个初始质心:从数据中随机抽取k个点作为初始聚类的中心,来代表各个类
  • 把每个点划分进相应的类:根据欧式距离最小原则,把每个点划分进距离最近的类中
  • 重新计算质心:根据均值等方法,重新计算每个类的质心
  • 迭代计算质心:重复第二步和第三步,迭代计算
  • 聚类完成:聚类中心不再发生移动

基于sklearn包的实现

导入一份如下数据,经过各变量间的散点图和相关系数,发现工作日上班电话时长与总电话时长存在强正相关关系。

数据挖掘——聚类分析总结(建议收藏)

选择可建模的变量并降维。

  1. cloumns_fix1 = ['工作日上班时电话时长''工作日下半时电话时长',  
  2.     '周末电话时长''国际电话时长''平均每次通话时长'
  3.  
  4. #数据降维 
  5. pca_2 = PCA(n_components=2) 
  6. data_pca_2 = pd.DataFrame(pca_2.fit_transform(data[cloumns_fix1])) 

通过sklearn包中的K-Means方法构建模型。

  1. #绘制散点图查看数据点大致情况 
  2. plt.scatter(data_pca_2[0],data_pca_2[1]) 
  3.  
  4. #预计将数据点分类为3类 
  5. kmmodel = KMeans(n_clusters=3) #创建模型 
  6. kmmodel = kmmodel.fit(data[cloumns_fix1]) #训练模型 
  7. ptarget = kmmodel.predict(data[cloumns_fix1]) #对原始数据进行标注 
  8.  
  9. pd.crosstab(ptarget,ptarget) #交叉表查看各个类别数据的数量 

plt.scatter(data_pca_2[0],data_pca_2[1],c=ptarget)#查看聚类的分布情况。

数据挖掘——聚类分析总结(建议收藏)

最后,可以通过直方图查看各聚类间的差异。

  1. #查看各类之间的差异 
  2. dMean = pd.DataFrame(columns=cloumns_fix1+['分类']) #得到每个类别的均值 
  3. data_gb = data[cloumns_fix1].groupby(ptarget) #按标注进行分组 
  4.  
  5. i = 0 
  6. for g in data_gb.groups: 
  7.     rMean = data_gb.get_group(g).mean()  
  8.     rMean['分类'] = g; 
  9.     dMean = dMean.append(rMean, ignore_index=True
  10.     subData = data_gb.get_group(g) 
  11.     for column in cloumns_fix1: 
  12.         i = i+1; 
  13.         p = plt.subplot(3, 5, i) 
  14.         p.set_title(column
  15.         p.set_ylabel(str(g) + "分类"
  16.         plt.hist(subData[column], bins=20) 
数据挖掘——聚类分析总结(建议收藏)

2、 层次聚类法

层次聚类算法又称为树聚类算法,它根据数据之间的距离,透过一种层次架构方式,反复将数据进行聚合,创建一个层次以分解给定的数据集。层次聚类算法常用于一维数据的自动分组。

层次聚类算法是一种很直观的聚类算法,基本思想是通过数据间的相似性,按相似性由高到低排序后重新连接各个节点,整个过程就是建立一个树结构,如下图:

数据挖掘——聚类分析总结(建议收藏)

层次聚类算法的步骤:

  • 每个数据点单独作为一个类
  • 计算各点之间的距离(相似度)
  • 按照距离从小到大(相似度从强到弱)连接成对(连接后按两点的均值作为新类继续计算),得到树结构

基于sklearn包的实现

使用K-Means聚类案例中的数据。

  1. cloumns_fix1 = ['工作日上班时电话时长''工作日下半时电话时长',  
  2.     '周末电话时长',  
  3.     '国际电话时长''平均每次通话时长'
  4.  
  5. linkage = hcluster.linkage(data[cloumns_fix1], method='centroid') #中心点距离计算,得到矩阵 
  1. linkage = scipy.cluster.hierarchy.linkage(data, method='single'

method 类距离计算公式有三种参数:

  • single 两个类之间最短距离的点的距离
  • complete 两个类之间最长距离的点的距离
  • centroid 两个类所有点的中点的距离
  1. #层次聚类绘图 
  2. hcluster.dendrogram(linkage)  #不设置参数时会将所有点做为一个基础的类进行树结构的绘制 
  3.  
  4. #由于数据量大,限制类的个数,保留12个节点,有括号表示副节点,括号内的数字为该节点内部包含的子节点 
  5. hcluster.dendrogram(linkage, truncate_mode='lastp', p=12, leaf_font_size=12.) 
数据挖掘——聚类分析总结(建议收藏)

 

  1. #对聚类得到的类进行标注 层次聚类的结果,要聚类的个数,划分方法 
  2. (maxclust,最大划分法)ptarget = hcluster.fcluster(linkage, 3,  
  3. criterion='maxclust')#查看各类别中样本含量 
  4. pd.crosstab(ptarget,ptarget) 
数据挖掘——聚类分析总结(建议收藏)

绘制图形

  1. #使用主成分分析进行数据降维 
  2. pca_2 = PCA(n_components=2) 
  3. data_pca_2 = pd.DataFrame(pca_2.fit_transform(data[cloumns_fix1])) 
  4.  
  5. plt.scatter(data_pca_2[0], data_pca_2[1], c=ptarget) #绘制图形 

3、 DBSCAN密度法

概念:

  • 中文全称:基于密度的带噪声的空间聚类应用算法,它是将簇定义为密度相联的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据集中发现任意形状的聚类。
  • 密度:空间中任意一点的密度是以该点为圆心,以Eps为半径的园区域内包含的点数目。
  • 邻域:空间中任意一点的邻域是以该店为圆心,以Eps为半径的园区域内包含的点集合。
  • 核心点:空间中某一点的密度,如果大于某一给定阈值MinPts,则称该点为核心点。(小于MinPts则称边界点)
  • 噪声点:既不是核心点,也不是边界点的任意点

DBSCAN算法的步骤:

  • 通过检查数据集中每点的Eps邻域来搜索簇,如果点p的Eps邻域内包含的点多于MinPts个,则创建一个以p为核心的簇
  • 通过迭代聚集这些核心点p距离Eps内的点,然后合并成为新的簇(可能)
  • 当没有新点添加到新的簇时,聚类完成

DBSCAN算法优点:

  • 聚类速度快且能够有效处理噪声点发现任意形状的空间聚类
  • 不需要输入要划分的聚类个数
  • 聚类簇的形状没有偏倚
  • 可以在需要是过滤噪声

DBSCAN算法缺点:

  • 数据量大时,需要较大的内存和计算时间
  • 当空间聚类的密度不均匀、聚类间距差较大时,得到的聚类质量较差(MinPts与Eps选取困难)
  • 算法效果依赖距离公式选择,实际应用中常使用欧式距离,对于高纬度数据,存在“维度灾难” https://baike.baidu.com/item/维数灾难/6788619?fr=aladdin

python中的实现

1)数学原理实现

导入一份如下分布的数据点的集合。

数据挖掘——聚类分析总结(建议收藏)
  1. #计算得到各点间距离的矩阵 
  2. from sklearn.metrics.pairwise import euclidean_distances 
  3. dist = euclidean_distances(data) 

将所有点进行分类,得到核心点、边界点和噪声点。

  1. #设置Eps和MinPts 
  2. eps = 0.2 
  3. MinPts = 5 
  4.  
  5. ptses = [] 
  6. for row in dist:   #密度    density = np.sum(row<eps)  
  7.     pts = 0 
  8.     if density>MinPts:    #核心点,密度大于5       
  9.         pts = 1 
  10.     elif density>1 :   #边界点,密度大于1小于5 
  11.         pts = 2 
  12.     else:    #噪声点,密度为1 
  13.         pts = 0 
  14.     ptses.append(pts) 
  15. #得到每个点的分类 

以防万一,将噪声点进行过滤,并计算新的距离矩阵。

  1. #把噪声点过滤掉,因为噪声点无法聚类,它们独自一类 
  2. corePoints = data[pandas.Series(ptses)!=0] 
  3. coreDist = euclidean_distances(corePoints) 

以每个点为核心,得到该点的邻域。

  1. cluster = dict() 
  2. i = 0 
  3. for row in coreDist:  
  4.     cluster[i] = numpy.where(row<eps)[0] 
  5.     i = i + 1 

然后,将有交集的邻域,都合并为新的领域。

  1. for i in range(len(cluster)): 
  2.     for j in range(len(cluster)): 
  3.         if len(set(cluster[j]) & set(cluster[i]))>0 and i!=j: 
  4.             cluster[i] = list(set(cluster[i]) | set(cluster[j])) 
  5.             cluster[j] = list() 

最后,找出独立(也就是没有交集)的邻域,就是我们最后的聚类的结果了。

  1. result = dict() 
  2. j = 0 
  3. for i in range(len(cluster)): 
  4.   if len(cluster[i])>0: 
  5.     result[j] = cluster[i] 
  6.     j = j + 1 
  7.  
  8. #找出每个点所在领域的序号,作为他们最后聚类的结果标记 
  9. for i in range(len(result)): 
  10.     for j in result[i]: 
  11.         data.at[j, 'type'] = i 
  12.   
  13. plt.scatter(data['x'], data['y'], c=data['type']) 
数据挖掘——聚类分析总结(建议收藏)

2)基于sklearn包的实现

  1. eps = 0.2 
  2. MinPts = 5 
  3.  
  4. model = DBSCAN(eps, MinPts) 
  5.  
  6. data['type'] = model.fit_predict(data) 
  7.  
  8. plt.scatter(data['x'],  data['y'], c=data['type']) 

 

责任编辑:未丽燕 来源: 今日头条
相关推荐

2021-01-26 09:25:02

Nginx开源软件服务器

2015-10-30 11:52:09

数据挖掘术语

2022-05-18 11:35:17

Python字符串

2022-03-08 23:46:06

数据分析大数据

2022-07-20 00:15:48

SQL数据库编程语言

2016-08-28 12:31:22

2024-08-20 08:22:21

2020-06-19 09:55:00

Redis数据库字符串

2020-12-09 16:57:15

数据分析大数据

2022-03-09 18:09:47

前端CSS代码

2021-09-23 17:10:48

Python可视化漏斗图

2022-03-24 07:38:07

注解SpringBoot项目

2022-08-24 11:54:10

Pandas可视化

2021-05-27 05:34:22

Git开源控制系统

2012-12-10 13:24:15

回归分析数据挖掘

2020-07-23 09:15:25

Python机器学习聚类分析

2014-07-18 09:51:05

挖掘数据分析

2022-06-17 10:52:01

数据存储采集

2020-12-18 08:03:00

插件MyBatis Executor

2021-10-28 19:22:35

数据分析
点赞
收藏

51CTO技术栈公众号