数据挖掘——聚类分析总结

聚类分析

一、概念

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

  聚类分析属于无监督学习

  聚类对象可以分为Q型聚类和R型聚类

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

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

二、常用的聚类算法

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

1、K-Means划分法

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

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

算法原理见 http://www.aboutyun.com/thread-18178-1-1.html【转】

K-Means算法的计算步骤

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

基于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 = 0
for 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(3, 5, i)
        p.set_title(column)
        p.set_ylabel(str(g) + "分类")
        plt.hist(subData[column], bins=20)


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密度法 

概念:

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

  密度:空间中任意一点的密度是以该点为圆心,以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)数学原理实现

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

#计算得到各点间距离的矩阵
from sklearn.metrics.pairwise import euclidean_distances
dist = euclidean_distances(data)

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

#设置Eps和MinPtseps = 0.2MinPts = 5

ptses = []
for row in dist:   #密度    density = np.sum(row<eps)
    pts = 0
    if density>MinPts:    #核心点,密度大于5              pts = 1
    elif density>1 :   #边界点,密度大于1小于5
        pts = 2
    else:    #噪声点,密度为1
        pts = 0
    ptses.append(pts)#得到每个点的分类

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

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

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

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

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

for i in range(len(cluster)):
    for j in range(len(cluster)):
        if len(set(cluster[j]) & set(cluster[i]))>0 and i!=j:
            cluster[i] = list(set(cluster[i]) | set(cluster[j]))
            cluster[j] = list()

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

result = dict()
j = 0
for i in range(len(cluster)):
  if len(cluster[i])>0:
    result[j] = cluster[i]
    j = j + 1

#找出每个点所在领域的序号,作为他们最后聚类的结果标记
for i in range(len(result)):
    for j in result[i]:
        data.at[j, ‘type‘] = i

plt.scatter(data[‘x‘], data[‘y‘], c=data[‘type‘])


 2)基于sklearn包的实现

eps = 0.2
MinPts = 5

model = DBSCAN(eps, MinPts)

data[‘type‘] = model.fit_predict(data)

plt.scatter(data[‘x‘],  data[‘y‘], c=data[‘type‘])

原文地址:https://www.cnblogs.com/rix-yb/p/9851514.html

时间: 2024-10-28 22:58:47

数据挖掘——聚类分析总结的相关文章

数据挖掘-聚类分析

聚类分析是一种非监督的学习,分类是一种监督学习,就是用已经知道的类别的训练数据得到一个分类的模型,所以聚类与分类的主要区别在于是否需要预先定义好类别,也就是说聚类分析只是依靠数据本身来确定数据之间的关系的,所以聚类分析有很大的优越性特别是适合处理大量的原始的数据 聚类分析方法的性能指标:1.可扩展性,2,自适应性,3,鲁棒性4,可解释性 聚类使用的数据类是:数据矩阵 相异度矩阵 规范化是在中心化的基础上再做变换,确保变量的变化范围相等,常用的规范化方法有最大值归一化,总和规范化,均值标准差规范化

数据挖掘-聚类分析(Python实现K-Means算法)

概念: 聚类分析(cluster analysis ):是一组将研究对象分为相对同质的群组(clusters)的统计分析技术.聚类分析也叫分类分析,或者数值分类.聚类的输入是一组未被标记的样本,聚类根据数据自身的距离或者相似度将其划分成若干个组,划分的原则是组内距离最小化而组间(外部)距离最大化.聚类和分类的不同在于:聚类所要求划分的类是未知的. 聚类度量的方法:分距离和相似度来度量. ? ? 聚类研究分析的方法: 1.层次的方法(hierarchical  method) 2.划分方法(par

【分享】数据挖掘学习资料免费下载

 Artificial Intelligence - Wiley - Data Mining - Concepts Models Methods and Algorithms - 2003.chm 8.4 MB  IEEE - Finding Patterns in Three Dimensional Graphs Algorithms and Applications to Scientific Data Mining.pdf 561.8 KB  Mining The Web - Discov

【数据挖掘技术】聚类分析

聚类(Clustering)分析有一个通俗的解释和比喻,那就是“物以类聚,人以群分”.针对几个特定的业务指标,可以将观察对象的群体按照相似性和相异性进行不同群组的划分.经过划分后,每个群组内部个对象间的相似度会很高,而在不同群组之间的对象彼此间将具有很高的相异度. 聚类技术一方面本身就是一种模型技术,通过有效聚类后的结果常常可以直接指导落地应用实践:另一方面聚类技术又常常作为数据分析过程中前期进行数据摸底和数据清洗.数据整理(数据转换)的工具,在实践应用中有多样性.多元性等特点. 一.聚类分析的

微软数据挖掘算法:Microsoft顺序分析和聚类分析算法(8)

前言 本篇文章继续我们的微软挖掘系列算法总结,前几篇文章已经将相关的主要算法做了详细的介绍,我为了展示方便,特地的整理了一个目录提纲篇:大数据时代:深入浅出微软数据挖掘算法总结连载,有兴趣的童鞋可以点击查阅,本篇我们将要总结的算法为:Microsoft顺序分析和聚类分析算法,此算法为上一篇中的关联规则分析算法的一个延伸,为关联规则分析算法所形成的种类进行了更细粒度的挖掘,挖掘出不同种类内部的事例间的顺序原则,进而用以引导用户进行消费. 应用场景介绍 Microsoft顺序分析和聚类分析算法,根据

【读书笔记-数据挖掘概念与技术】高级聚类分析

1   基于概率模型的聚类 例子: a.评论产品,一个评论可能设计多种产品,如一个评论谈论摄像机与计算机的兼容性,怎么办?该评论与这两个簇相关,而并不互斥地属于任何一个簇. b.用户在购买商品时,检索的信息中既订购了一部数据相机,并且同时比较了多种笔记本电脑,怎么办?这种会话应该在某种程度上数据这两个簇. 1.1   模糊簇 这节的例子还不错. 1.2   基于概率模型的聚类 对象以概率的方法参与多个簇. 混合模型假定观测对象集是来自多个概率簇的实例的混合. 以单变量高斯混合模型为例,假定每个簇

数据挖掘十大经典算法

一. C4.5  C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3 算法.   C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进: 1) 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足: 2) 在树构造过程中进行剪枝: 3) 能够完成对连续属性的离散化处理: 4) 能够对不完整数据进行处理. C4.5算法有如下优点:产生的分类规则易于理解,准确率较高.其缺点是:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导

2017.06.29数据挖掘基础概念第十,十一章

第十章63.什么是聚类分析 一个把数据对象划分成子集的过程.每一个子集市一个簇,使得簇中的对象彼此相似,但与其他簇中的对象不相似.由聚类分析产生的簇的集合称做一个聚类.64.数据挖掘对聚类的要求 1.可伸缩性 2.处理不同属性类型的能力 3.发现任意形状的簇 4.对于确定输入参数的领域知识的要求 5.出来噪声数据的能力 6.增量聚类和对输入次序不敏感 7.聚类高维数据的能力 8.基于约束的聚类 9.可解释性和可用性 10.划分准则 11.簇的分离性 12.相似性度量 13.聚类空间65.基本聚类

R语言数据挖掘实战系列(1)

R语言数据挖掘实战(1) 一.数据挖掘基础 数据挖掘:从数据中"淘金",从大量数据(包括文本)中挖掘出隐含的.未知的.对决策有潜在价值的关系.模式和趋势,并用这些知识和规则建立用于决策支持的模型,提供预测性决策支持的方法.工具和过程. 数据挖掘的任务 利用分类与预测.聚类分析.关联规则.时序模式.偏差检测.智能推荐等方法,帮助企业提取数据中蕴含的商业价值,提高企业的竞争力. 数据挖掘建模过程 定义挖掘目标,即决定到底想干什么? 数据取样.抽取一个与挖掘目标相关的样本数据子集.抽取数据的