专栏名称: 数据分析1480
积土成山,积水成渊!!定期与大家分享数据分析和挖掘方面的干货,包括分析工具R与Python的使用、数据分析的案例、及最新的数据领域资讯。
目录
相关文章推荐
余杭发布  ·  又有补贴!最高达30% ·  16 小时前  
杭州本地宝  ·  杭州9个绝美赏梅地点 ·  2 天前  
余杭时报  ·  最新“白名单”!涉及杭州多家房屋中介 ·  3 天前  
51好读  ›  专栏  ›  数据分析1480

数据挖掘 | 数据分析师都在看的聚类分析知识点总汇

数据分析1480  · 公众号  ·  · 2020-03-27 08:30

正文



概 念




聚类分析是按照个体的特征将他们分类,让同一个类别内的个体之间具有较高的相似度,不同类别之间具有较大的差异性。 聚类分析属于无监督学习。 聚类对象可以分为两类:


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

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


常用的聚类算法




  • K-Means划分法

  • 层次聚类法

  • DBSCAN密度法


1. K-Means划分法


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


(1)K-Means算法的目标


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


(2)K-Means算法的计算步骤


  • 取得K个初始质心: 从数据中随机抽取K个点作为初始聚类的中心,来代表各个类

  • 把每个点划分进相应的类: 根据欧式距离最小的原则,把每个点划分进距离最近的类中

  • 重新计算质心: 根据均值等方法,重新计算每个类的质心

  • 迭代计算质心: 重复第二步和第三步,迭代计算

  • 聚类完成: 聚类中不在发生移动


(3)基于sklearn包的实现


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



选择可建模的变量并降维


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


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


#绘制散点图查看数据点大致情况plt.scatter(data_pca_2[0],data_pca_2[1])




#预计将数据点分类为3类kmmodel = KMeans(n_clusters=3) #创建模型kmmodel = kmmodel.fit(data[cloumns_fix1]) #训练模型ptarget = kmmodel.predict(data[cloumns_fix1]) #对原始数据进行标注
pd.crosstab(ptarget,ptarget) #交叉表查看各个类别数据的数量




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



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


#查看各类之间的差异dMean = pd.DataFrame(columns=cloumns_fix1+['分类']) #得到每个类别的均值data_gb = data[cloumns_fix1].groupby(ptarget) #按标注进行分组
i = 0for g in data_gb.groups: rMean = data_gb.get_group(g).mean() rMean['分类'] = g;         dMean = dMean.append(rMean, ignore_index=True)         subData = data_gb.get_group(g)                for column in cloumns_fix1:                 i = i+1;                 p = plt.subplot(35, i)                 p.set_title(column)                 p.set_ylabel(str(g) + "分类")                 plt.hist(subData[column], bins=20)




2. 层次聚类法


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


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



(1)层次聚类算法的步骤


  • 每个数据点单独作为一个类

  • 计算各点之间的距离(相似度)

  • 按照距离从大到小(相似度从强到弱)连接成对(连接后按两点的均值作为新类继续计算),得到树结构


(2)基于sklearn包的实现


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


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


linkage = scipy.cluster.hierarchy.linkage(data, method='single')

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


  • single  两个类之间最短距离的点的距离

  • complete  两个类之间最长距离的点的距离

  • centroid  两个类所有点的中点的距离


#层次聚类绘图hcluster.dendrogram(linkage)  #不设置参数时会将所有点做为一个基础的类进行树结构的绘制#由于数据量大,限制类的个数,保留12个节点,有括号表示副节点,括号内的数字为该节点内部包含的子节点hcluster.dendrogram(linkage, truncate_mode='lastp', p=12, leaf_font_size=12.)


#对聚类得到的类进行标注       层次聚类的结果,要聚类的个数,划分方法(maxclust,最大划分法)ptarget = hcluster.fcluster(linkage, 3, criterion='maxclust')#查看各类别中样本含量pd.crosstab(ptarget,ptarget)



绘制图形:


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



3. DBSCAN密度法


(1)概念


  • 中文全称: 基于密度的带噪声的空间聚类应用算法, 它是将簇定义为密度相联的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据集中发现任意形状的聚类。


  • 密度:空间中任意一点的密度是以该点为圆心,以Eps为半径的园区域内包含的点数目。


  • 邻域:空间中任意一点的邻域是以该店为圆心,以Eps为半径的园区域内包含的点集合。


  • 核心点:空间中某一点的密度,如果大于某一给定阈值MinPts,则称该点为核心点。(小于MinPts则称边界点)


  • 噪声点: 既不是核心点,也不是边界点的任意点


(2)DBSCAN算法的步骤


  • 通过检查数据集中每点的Eps领域来搜索簇,如果点p的Eps领域内包含的点多于MinPts个,则创建一个以p为核心的簇

  • 通过迭代聚集这些核心点p距离Eps内的点,然后合并成为新的簇(可能)

  • 当没有新点添加到新的簇时,聚类完成


(3)DBSCAN算法优点


  • 聚类速度快且能够有效处理噪声点发现任意形状的空间聚类

  • 不需要输入要划分的聚类个数

  • 聚类簇的形状没有偏移

  • 可以在需要时过滤噪声


(4)DBSCAN算法缺点


  • 数据量大时,需要较大的内存和计算时间

  • 当空间聚类的密度不均匀、聚类间距差较大时,得到的聚类质量较差(MinPts与Eps选取困难)

  • 算法效果依赖距离公式选择,实际应用中常使用欧式距离, 对于高纬度数据,存在“维度灾难”

python中的实



1. 数学原理实现


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







请到「今天看啥」查看全文