热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python数据分析:聚类分析(clusteranalysis)

何为聚类分析聚类分析或聚类是对一组对象进行分组的任务,使得同一组(称为聚类)中的对象(在某种意义上)与其他组(聚类)中的对象更相似(在某种意义上)。它是探索性数据挖掘的主要任务

何为聚类分析

聚类分析或聚类是对一组对象进行分组的任务,使得同一组(称为聚类)中的对象(在某种意义上)与其他组(聚类)中的对象更相似(在某种意义上)。它是探索性数据挖掘的主要任务,也是统计
数据分析的常用技术,用于许多领域,包括机器学习,模式识别,图像分析,信息检索,生物信息学,数据压缩和计算机图形学。

聚类分析本身不是一个特定的算法,而是要解决的一般任务。它可以通过各种算法来实现,这些算法在理解群集的构成以及如何有效地找到它们方面存在显着差异。流行的群集概念包括群集成员之间距离较小的群体,数据空间的密集区域,间隔或特定的统计分布。因此,聚类可以表述为多目标优化问题。适当的聚类算法和参数设置(包括距离函数等参数)使用,密度阈值或预期聚类的数量)取决于个体数据集和结果的预期用途。这样的聚类分析不是自动任务,而是涉及试验和失败的知识发现或交互式多目标优化的迭代过程。通常需要修改数据预处理和模型参数,直到结果达到所需的属性。

常见聚类方法

常用的聚类算法分为基于划分、层次、密度、网格、统计学、模型等类型的算法,典型算法包括K均值(经典的聚类算法)、DBSCAN、两步聚类、BIRCH、谱聚类等。

K-means

聚类算法中k-means是最常使用的方法之一,但是k-means要注意数据异常:

  1. 数据异常值。数据中的异常值能明显改变不同点之间的距离相识度,并且这种影响是非常显著的。因此基于距离相似度的判别模式下,异常值的处理必不可少。
  2. 数据的异常量纲。不同的维度和变量之间,如果存在数值规模或量纲的差异,那么在做距离之前需要先将变量归一化或标准化。例如跳出率的数值分布区间是[0,1],订单金额可能是[0,10000 000],而订单数量则是[0,1000],如果没有归一化或标准化操作,那么相似度将主要受到订单金额的影响。

DBSCAN

有异常的数据可以使用DBSCAN聚类方法进行处理,DBSCAN的全称是Density-Based Spatial Clustering of
Applications with Noise,中文含义是“基于密度的带有噪声的空间聚类”。
跟K均值相比,它具有以下优点:

  • 原始数据分布规律没有明显要求,能适应任意数据集分布形状的空间聚类,因此数据集适用性更广,尤其是对非凸装、圆环形等异性簇分布的识别较好。
  • 无需指定聚类数量,对结果的先验要求不高
  • 由于DBSCAN可区分核心对象、边界点和噪点,因此对噪声的过滤效果好,能有效应对数据噪点。

由于他对整个数据集进行操作且聚类时使用了一个全局性的表征密度的参数,因此也存在比较明显的弱点:

  • 对于高纬度问题,基于半径和密度的定义成问题。
  • 当簇的密度变化太大时,聚类结果较差。
  • 当数据量增大时,要求较大的内存支持,I/O消耗也很大。

MiniBatchKMeans

K均值在算法稳定性、效率和准确率(相对于真实标签的判别)上表现非常好,并且在应对大量数据时依然如此。它的算法时间复杂度上界为O(n k
t),其中n是样本量、k是划分的聚类数、t是迭代次数。当聚类数和迭代次数不变时,K均值的算法消耗时间只跟样本量有关,因此会呈线性增长趋势。

但是当面对海量数据时,k均值算法计算速度慢会产生延时,尤其算法被用于做实时性处理时这种弊端尤为明显。针对K均值的这一问题,很多延伸算法出现了,MiniBatchKMeans就是其中一个典型代表。MiniBatchKMeans使用了一个种名为Mini
Batch(分批处理)的方法计算数据点之间的距离。Mini
Batch的好处是计算过程中不必使用所有的数据样本,而是从不同类别的样本中抽取一部分样本(而非全部样本)作为代表参与聚类算法过程。由于计算样本量少,所以会相应减少运行时间;但另一方面,由于是抽样方法,抽样样本很难完全代表整体样本的全部特征,因此会带来准确度的小幅度下降,但是并不明显。

谱聚类

在大数据背景下,有很多高纬度数据场景,如电子商务交易数据、web文本数据日益丰富。高维数据聚类时耗时长、聚类结果准确性和稳定性都不尽如人意。因为,在高维数据,基于距离的相似度计算效率极低;特征值过多在所有维度上存在簇的可能性非常低;由于稀疏性和紧邻特性,基于距离的相似度几乎为0,导致高维空间很难出现数据簇。这时我们可以选着使用子空间聚类,或是降维处理。

子空间聚类算法是在高维数据空间中对传统聚类算法的一种扩展,其思想是选取与给定簇密切相关的维,然后在对应的子空间进行聚类。比如谱聚类就是一种子空间聚类方法,由于选择相关维的方法以及评估子空间的方法需要自定义,因此这种方法对操作者的要求较高。

使用聚类分析中间预处理

  1. 图像压缩
    用较少的数据量来表示原有的像素矩阵的过程,这个过程称为图像编码。数据图像的显著特点是数据量庞大,需要占用相当大的储存空间,这给图像的存储、计算、传输等带来了不便。因此,现在大多数数字网络下的图像都会经过压缩后再做进一步应用,图像压缩的方法之一便是聚类算法。
    在使用聚类算法做图像压缩时,我们会定义K个颜色数(例如128种颜色),颜色数就是聚类类别的数量;K均值聚类算法会把类似的颜色分别放在K个簇中,然后每个簇使用一种颜色来代替原始颜色,那么结果就是有多少个簇,就生成了多少种颜色构成的图像,由此实现图像压缩。

  2. 图像分割
    图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣的目标技术和过程,这是图像处理和分析的关键步骤。图像分割后提取出的目标可以用于图像语义识别,图像搜索等领域。例如从图像中分割出前景人脸信息,然后做人脸识别。聚类算法是图像分割方法的一种,其实施的关键是通过不同区域间明显不同的图像色彩特征做聚类,聚类数量就是要分割的区域的数量。

  3. 图像理解
    在图像理解中,有一种称为基于区域的提取方法。基于区域的提取方法是在图像分割和对象识别的前提下进行的,利用对象模板、场景分类器等,通过识别对象及对象之间的拓扑关系挖掘语义,生成对应的场景语义信息。例如,先以颜色、形状等特征对分割后的图像区域进行聚类,形成少量BLOB;然后通过CMRM模型计算出BLOB与某些关键词共同出现的概率。

  4. 异常检测
    异常检测有多种实施方法,其中常用的方法是基于距离的异常检测方法。即使数据集不满足任何特定分布模型,它仍能有效地发现离群点,特别是当空间维度比较高时,算法的效率比基于密度的方法要高得多。算法具体实现时,首先算出数据样本间的距离(如曼哈顿距离、欧氏距离等),然后对数据做预处理后就可以根据距离的定义来检测异常值。
    例如,可以使用K-means的聚类可以将离中心店最远的类或者不属于任何一个类的数据点提取出来,然后将其定义为异常值。

聚类算法的选择:

  • 数据为高维数据,那么选取子空间聚类(如谱聚类)
  • 数据量在100万条以内,那么使用k均值较好;如果数据量超过100万条,那么可以考虑使用Mini Batch KMeans
  • 如果数据中存在噪点,那么可以使用基于密度的DBSCAN
  • 如果最求更高的分类准确度,那么选择谱聚类将比K均值准确度更好

python代码实现

    import numpy as np
    import pandas as pd
    from sklearn.cluster import KMeans
    from sklearn import metrics
    import matplotlib.pyplot as plt
    from sklearn.datasets import make_blobs
    %matplotlib inline
    
    # 数据准备
    data = make_blobs(n_samples=2000, centers=[[1,1], [-1, -1]], cluster_std=0.7, random_state=2018)
    X = data[0]
    y = data[1]
    
    #设置聚类数量
    n_clusters = 2
    
    # 建立聚类模型对象
    kmeans = KMeans(n_clusters=n_clusters, random_state=2018)
    # 训练聚类模型
    kmeans.fit(X)
    
    # 预测聚类模型
    pre_y = kmeans.predict(X)
    
    ### 模型效果指标评估 ###
    # 样本距离最近的聚类中心的总和
    inertias = kmeans.inertia_
    
    # 调整后的兰德指数
    adjusted_rand_s = metrics.adjusted_rand_score(y, pre_y)
    
    # 互信息
    mutual_info_s = metrics.mutual_info_score(y, pre_y)
    
    # 调整后的互信息
    adjusted_mutual_info_s = metrics.adjusted_mutual_info_score(y, pre_y)
    
    # 同质化得分
    homogeneity_s = metrics.homogeneity_score(y, pre_y)
    
    # 完整性得分
    completeness_s = metrics.completeness_score(y, pre_y)
    
    # V-measure得分
    v_measure_s = metrics.v_measure_score(y, pre_y)
    
    # 平均轮廓系数
    silhouette_s = metrics.silhouette_score(X, pre_y, metric=\'euclidean\')
    
    # Calinski 和 Harabaz 得分
    calinski_harabaz_s = metrics.calinski_harabaz_score(X, pre_y)
    
    df_metrics = pd.DataFrame([[inertias, adjusted_rand_s,mutual_info_s, adjusted_mutual_info_s, homogeneity_s,completeness_s,v_measure_s, silhouette_s ,calinski_harabaz_s]],
                             columns=[\'ine\',\'tARI\',\'tMI\',\'tAMI\',\'thomo\',\'tcomp\',\'tv_m\',\'tsilh\',\'tc&h\'])
    
    df_metrics

在这里插入图片描述

    ## 模型可视化##
    centers = kmeans.cluster_centers_
    # 颜色设置
    colors = [\'green\', \'pink\']
    # 创建画布
    plt.figure(figsize=(12,6))
    titles = [\'Real\', \'Predict\']
    for j, y_ in enumerate([y, pre_y]):
        plt.subplot(1,2, j+1)
        plt.title(titles[j])
        # 循环读类别
        for i in range(n_clusters):
            # 找到相同的索引
            index_sets = np.where(y_ == i)
            # 将相同类的数据划分为一个聚类子集
            cluster = X[index_sets]
            # 展示样本点
            plt.scatter(cluster[:, 0], cluster[:, 1], c=colors[i], marker=\'.\')
            if j==1:          
            # 簇中心
                plt.plot(centers[i][0], centers[i][1], \'o\',markerfacecolor=colors[i],markeredgecolor=\'k\', markersize=6)
    plt.savefig(\'xx.png\')
    plt.show()
    

![在这里插入图片描述](https://img-blog.csdnimg.cn/20181130164219386.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RvbnlkejA1MjM=,size_16,color_FFFFFF,t_70)

评估指标解析:

  • inertias:inertias是K均值模型对象的属性,表示样本距离最近的聚类中心的总和,它是作为在没有真实分类结果标签下的非监督式评估指标。该值越小越好,值越小证明样本在类间的分布越集中,即类内的距离越小。
  • adjusted_rand_s:调整后的兰德指数(Adjusted Rand Index),兰德指数通过考虑在预测和真实聚类中在相同或不同聚类中分配的所有样本对和计数对来计算两个聚类之间的相似性度量。调整后的兰德指数通过对兰德指数的调整得到独立于样本量和类别的接近于0的值,其取值范围为[-1, 1],负数代表结果不好,越接近于1越好意味着聚类结果与真实情况越吻合。
  • mutual_info_s:互信息(Mutual Information, MI),互信息是一个随机变量中包含的关于另一个随机变量的信息量,在这里指的是相同数据的两个标签之间的相似度的量度,结果是非负值。
  • adjusted_mutual_info_s:调整后的互信息(Adjusted Mutual Information, AMI),调整后的互信息是对互信息评分的调整得分。它考虑到对于具有更大数量的聚类群,通常MI较高,而不管实际上是否有更多的信息共享,它通过调整聚类群的概率来纠正这种影响。当两个聚类集相同(即完全匹配)时,AMI返回值为1;随机分区(独立标签)平均预期AMI约为0,也可能为负数。
  • homogeneity_s:同质化得分(Homogeneity),如果所有的聚类都只包含属于单个类的成员的数据点,则聚类结果将满足同质性。其取值范围[0,1]值越大意味着聚类结果与真实情况越吻合。
  • completeness_s:完整性得分(Completeness),如果作为给定类的成员的所有数据点是相同集群的元素,则聚类结果满足完整性。其取值范围[0,1],值越大意味着聚类结果与真实情况越吻合。
  • v_measure_s:它是同质化和完整性之间的谐波平均值,v = 2 (均匀性 完整性)/(均匀性+完整性)。其取值范围[0,1],值越大意味着聚类结果与真实情况越吻合。
  • silhouette_s:轮廓系数(Silhouette),它用来计算所有样本的平均轮廓系数,使用平均群内距离和每个样本的平均最近簇距离来计算,它是一种非监督式评估指标。其最高值为1,最差值为-1,0附近的值表示重叠的聚类,负值通常表示样本已被分配到错误的集群。
  • calinski_harabaz_s:该分数定义为群内离散与簇间离散的比值,它是一种非监督式评估指标。

**参考:
《python数据分析与数据化运营》 宋天龙 **

在这里插入图片描述


推荐阅读
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • cs231n Lecture 3 线性分类笔记(一)
    内容列表线性分类器简介线性评分函数阐明线性分类器损失函数多类SVMSoftmax分类器SVM和Softmax的比较基于Web的可交互线性分类器原型小结注:中文翻译 ... [详细]
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
  • [翻译]PyCairo指南裁剪和masking
    裁剪和masking在PyCairo指南的这个部分,我么将讨论裁剪和masking操作。裁剪裁剪就是将图形的绘制限定在一定的区域内。这样做有一些效率的因素࿰ ... [详细]
author-avatar
美好时光33_862
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有