「数据挖掘」聚类分析的3大常用算法

「数据挖掘」聚类分析的3大常用算法

文末领取【19份咨询类公司项目案例分析】

01

概念

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

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

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

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

02

常用的聚类算法

1. K-Means划分法

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

  • K-Means算法的目标

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

  • K-Means算法的计算步骤

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

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

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

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

  5. 聚类完成:聚类中心不再发生移动

  • 基于sklearn包的实现

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

「数据挖掘」聚类分析的3大常用算法

选择可建模的变量并降维

<code>

cloumns_fix1

= [

'工作日上班时电话时长'

,

'工作日下半时电话时长'

,/<code>
<code>

'周末电话时长'

,

'国际电话时长'

,

'平均每次通话时长'

]/<code><code>/<code><code>/<code><code>/<code><code>/<code>

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

<code>#绘制散点图查看数据点大致情况

plt

.scatter

(

data_pca_2

[0]

,

data_pca_2

[1]

)/<code>
「数据挖掘」聚类分析的3大常用算法
<code>#预计将数据点分类为

3

类/<code><code>kmmodel = KMeans(n_clusters=

3

) #创建模型/<code><code>kmmodel = kmmodel.fit(

data

[cloumns_fix1]) #训练模型/<code><code>ptarget = kmmodel.predict(

data

[cloumns_fix1]) #对原始数据进行标注/<code>

<code>pd.crosstab(ptarget,ptarget) #交叉表查看各个类别数据的数量/<code>
「数据挖掘」聚类分析的3大常用算法
<code>plt.scatter(data_pca_2[0],data_pca_2[1],c=ptarget)/<code>
「数据挖掘」聚类分析的3大常用算法

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

<code>#查看各类之间的差异/<code><code>dMean = pd.DataFrame(columns=cloumns_fix1+[

'分类'

]) /<code><code>#得到每个类别的均值/<code><code>data_gb = data[cloumns_fix1].groupby(ptarget) #按标注进行分组/<code><code>i =

0

/<code><code>

for

g in data_gb.groups:/<code><code> rMean = data_gb.get_group(g).mean/<code><code> rMean[

'分类'

] = g;/<code><code> dMean = dMean.

append

(rMean, ignore_index=True)/<code><code> subData = data_gb.get_group(g)/<code><code>

for

column in cloumns_fix1:/<code><code> i = i+

1

;/<code><code> p = plt.subplot(

3

,

5

, i)/<code><code> p.set_title(column)/<code><code> p.set_ylabel(str(g) +

"分类"

)/<code><code> plt.hist(subData[column], bins=

20

)/<code>
「数据挖掘」聚类分析的3大常用算法

2. 层次聚类法

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

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

「数据挖掘」聚类分析的3大常用算法
  • 层次聚类算法的步骤:

  1. 每个数据点单独作为一个类

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

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

  • 基于sklearn包的实现

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

<code>

cloumns_fix1

= [

'工作日上班时电话时长'

,

'工作日下半时电话时长'

, /<code><code>

'周末电话时长'

, /<code><code>

'国际电话时长'

,

'平均每次通话时长'

] /<code><code> linkage = hcluster.linkage(data[cloumns_fix1], /<code><code>method=

'centroid'

) /<code><code>/<code>
  • method 类距离计算公式有三种参数

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

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

  3. centroid 两个类所有点的中点的距离

<code>#层次聚类绘图/<code><code>

hcluster

.dendrogram

(linkage) #不设置参数时会将所有点做为一个基础的类进行树结构的绘制/<code>

<code>#由于数据量大,限制类的个数,保留

12

个节点,有括号表示副节点,括号内的数字为该节点内部包含的子节点/<code><code>

hcluster

.dendrogram

(linkage, truncate_mode=

'lastp'

, p=

12

, leaf_font_size=

12

.)/<code>
「数据挖掘」聚类分析的3大常用算法
<code>

对聚类得到的类进行标注 层次聚类的结果,要聚类的个数,划分方法(maxclust,最大划分法)

/<code><code>

ptarget = hcluster.fcluster(linkage, 3,

/<code><code>

criterion=

'maxclust'

)

/<code><code>

/<code><code>

/<code>
「数据挖掘」聚类分析的3大常用算法

绘制图形

<code>

使用主成分分析进行数据降维

/<code><code>

pca_2 = PCA(n_components=2)

/<code><code>

data_pca_2 =

/<code><code>

pd.DataFrame(pca_2.fit_transform(data[cloumns_fix1]))

/<code><code>

plt.scatter(data_pca_2[0], data_pca_2[1],

/<code><code>

c=ptarget)

/<code>
「数据挖掘」聚类分析的3大常用算法

3. DBSCAN密度法

(1) 概念

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


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


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


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


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

(2) DBSCAN算法的步骤

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

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


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

(3) DBSCAN算法优点

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

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

  • 聚类簇的形状没有偏倚

  • 可以在需要是过滤噪声

(4)DBSCAN算法缺点

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

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

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

(5) python中的实现

  • 数学原理实现

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

「数据挖掘」聚类分析的3大常用算法
<code>#计算得到各点间距离的矩阵/<code><code>from sklearn.metrics.pairwise 

import

/<code><code>euclidean_distances /<code><code>dist = euclidean_distances(

data

)/<code>

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

<code>/<code><code>/<code><code>/<code>
<code>/<code><code>/<code><code>/<code><code>/<code><code>/<code><code>/<code><code>/<code><code>/<code><code>/<code><code>/<code><code>/<code>
<code>/<code>

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

<code>/<code><code>/<code><code>/<code>

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

<code>

cluster

= dict /<code><code>i =

0

/<code><code>for row in coreDist:/<code><code> cluster[i] = numpy.where(row0]/<code><code> i = i +

1

/<code>

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

<code>for i in range(len(cluster)):/<code><code> for j in range(len(cluster)): /<code><code> if len(

set

(cluster[j]) &

set

(cluster[i]))>

0

/<code><code>

and

i!=j: /<code><code> cluster[i] =

list

(

set

(cluster[i]) | /<code><code>

set

(cluster[j]))/<code><code> cluster[j] =

list

/<code>

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

<code>result = dict /<code><code>j = 

0

/<code><code>

for

i in

range

(

len

(cluster)): /<code><code>

if

len

(cluster[i])>

0

:/<code><code> result[j] = cluster[i]/<code><code> j = j +

1

/<code><code>#找出每个点所在领域的序号,作为他们最后聚类的结果标记/<code><code>

for

i in

range

(

len

(result)):/<code><code>

for

j in result[i]:/<code><code> data.at[j,

'type'

] = i /<code><code> plt.scatter(data[

'x'

], data[

'y'

], c=data[

'type'

])/<code>
「数据挖掘」聚类分析的3大常用算法
  • 基于sklearn包的实现

<code>eps = 

0.2

/<code><code>MinPts =

5

/<code><code>model = DBSCAN(eps, MinPts)/<code><code>

data

[

'type'

] = model.fit_predict(

data

) /<code><code> plt.scatter(

data

[

'x'

],

data

[

'y'

], c=

data

[

'type'

])/<code>

End.

作者:没有神保佑的瓶子

来源:博客园

https://www.cnblogs.com/rix-yb/p/9851514.html

本文均已和作者授权,如转载请联系原作者

长按下方海报领取【19份咨询类公司项目案例分析】

< 零基础入职数据分析就业班 >

抓住4月复工机会,5月即可入职理想数据分析岗位!

课程专享:趣味月考测试+真实项目作业+1v1生涯规划+班主任辅导学习+资深讲师答疑

加入我们你能得到:

  • 熟练运用SQL、Python、Excel、PPT等数据分析工具

  • 真实数据库实战项目经历

  • 1v1数据职场生涯规划&答疑

「数据挖掘」聚类分析的3大常用算法


分享到:


相關文章: