精华内容
下载资源
问答
  • 聚类算法应用场景实例十则

    千次阅读 2017-06-15 07:03:58
    本文整理了10个天池、DataCastle、DataFountain等中出现的,可使用聚类算法处理的问题场景实例。 1 基于用户位置信息的商业选址  随着信息技术的快速发展,移动设备和移动互联网已经普及到千家万户。...

    本文整理了10个天池、DataCastle、DataFountain等中出现的,可使用聚类算法处理的问题场景实例。

    1 基于用户位置信息的商业选址

            随着信息技术的快速发展,移动设备和移动互联网已经普及到千家万户。在用户使用移动网络时,会自然的留下用户的位置信息。随着近年来GIS地理信息技术的不断完善普及,结合用户位置和GIS地理信息将带来创新应用。如百度与万达进行合作,通过定位用户的位置,结合万达的商户信息,向用户推送位置营销服务,提升商户效益。

            希望通过大量移动设备用户的位置信息,为某连锁餐饮机构提供新店选址。

    2 中文地址标准化处理

            地址是一个涵盖丰富信息的变量,但长期以来由于中文处理的复杂性、国内中文地址命名的不规范性,使地址中蕴含的丰富信息不能被深度分析挖掘。通过对地址进行标准化的处理,使基于地址的多维度量化挖掘分析成为可能,为不同场景模式下的电子商务应用挖掘提供了更加丰富的方法和手段,因此具有重要的现实意义。

    3 国家电网用户画像

            随着电力体制改革向纵深推进,售电侧逐步向社会资本放开,当下的粗放式经营和统一式客户服务内容及模式,难以应对日益增长的个性化、精准化客户服务体验要求。如何充分利用现有数据资源,深入挖掘客户潜在需求,改善供电服务质量,增强客户黏性,对公司未来发展至关重要。

            对电力服务具有较强敏感度的客户对于电费计量、供电质量、电力营销等各方面服务的质量及方式上往往具备更高的要求,成为各级电力公司关注的重点客户。经过多年的发展与沉淀,目前国家电网积累了全网4亿多客户档案数据和海量供电服务信息,以及公司营销、电网生产等数据,可以有效的支撑海量电力数据分析。

            因此,国家电网公司希望通过大数据分析技术,科学的开展电力敏感客户分析,以准确地识别敏感客户,并量化敏感程度,进而支撑有针对性的精细化客户服务策略,控制电力服务人工成本、提升企业公众形象。

    4 非人恶意流量识别

            2016年第一季度Facebook发文称,其Atlas DSP平台半年的流量质量测试结果显示,由机器人模拟和黑IP等手段导致的非人恶意流量高达75% . 仅2016上半年,AdMaster反作弊解决方案认定平均每天能有高达 28% 的作弊流量。低质量虚假流量的问题一直存在,这也是过去十年间数字营销行业一直在博弈的问题。基于AdMaster海量监测数据,50%以上的项目均存在作弊嫌疑;不同项目中,作弊流量占广告投放5%到95%不等;其中垂直类和网盟类媒体的作弊流量占比最高;PC端作弊流量比例显著高于移动端和智能电视平台。广告监测行为数据被越来越多地用于建模和做决策,例如绘制用户画像,跨设备识别对应用户等。作弊行为,恶意曝光,网络爬虫,误导点击,甚至是在用户完全无感知的情况下被控制访问等产生的不由用户主观发出的行为给数据带来了巨大的噪声,给模型训练造成了很大影响。

            希望基于给定的数据,建立一个模型来识别和标记作弊流量,去除数据的噪声,从而更好的使用数据,使得广告主的利益最大化。

    5 求职信息完善

            有大约10万分优质简历,其中部分简历包含完整的字段,部分简历在学历、公司规模、薪水、职位名称等字段有些置空项。希望对数据进行学习、编码与测试,挖掘出职位路径的走向与规律,形成算法模型,再对数据中置空的信息进行预测。

    搜索引擎查询聚类以进行流量推荐

            在搜索引擎中, 很多网民的查询意图的比较类似的,对这些查询进行聚类,一方面可以使用类内部的词进行关键词推荐;另一方面, 如果聚类过程实现自动化,则也有助于新话题的发现;同时还有助于减少存储空间等。

    生物种群固有结构认知

            对动植物分类和对基因进行分类,获取对种群固有结构的认识。

    保险投保者分组

            通过一个高的平均消费来鉴定汽车保险单持有者的分组,同时根据住宅类型,价值,地理位置来鉴定一个城市的房产分组。

    网站关键词来源聚类整和

            以领域特征明显的词和短语作为聚类对象,在分类系统的大规模层级分类语料库中,利用文本分类的特征提取算法进行词语的领域聚类,通过控制词语频率的影响,分别获取领域通用词和领域专类词。

    10 图像分割

            图像分割广泛应用于医学、交通、军事等领域。图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。聚类算法先将图像空间中的像素用对应的特征空间点表示,根据它们在特征空间的聚集对特征空间进行分割,然后将它们映射回原图像空间,得到分割结果。

    展开全文
  • KMeans聚类算法应用

    2020-02-22 00:26:00
    KMeans聚类算法应用 1999年31个省份平均每人全年消费支出 import numpy as np from sklearn.cluster import KMeans def loadData(filePath): #利用loadData读取数据 fr = open(filePath,'r+') #r+:读写打开一个...

    KMeans聚类算法应用

    1999年31个省份平均每人全年消费支出

    import numpy as np
    from sklearn.cluster import KMeans
     
     
    def loadData(filePath):         #利用loadData读取数据
        fr = open(filePath,'r+')     #r+:读写打开一个文本文件
        lines = fr.readlines()          #readlines()方法用于读取所有行(直到结束符 EOF)并返回列表
        retData = []                      #用来存储城市各项消费信息
        retCityName = []                      #用来储存城市名称
        for line in lines:
            items = line.strip().split(",")     #把每行每个字符分开,变成一个个list
            retCityName.append(items[0])           #把item第一个字符串添加到retCityName数组后面
            retData.append([float(items[i]) for i in range(1,len(items))])#len返回列表长度将数据储存在data
        return retData,retCityName           #返回城市名称及消费数据
     
         
    if __name__ == '__main__':
        data,cityName = loadData('city.txt')   
        km = KMeans(n_clusters=5)          #设置五个簇中心
        label = km.fit_predict(data)         #计算簇中心给簇分配序号返回到label标签中
        expenses = np.sum(km.cluster_centers_,axis=1)      #横向计算每个城市的总开销,并把它归类到相应的簇里面并求平均,得到expense[i]从0到4
        print(expenses)
        CityCluster = [[],[],[],[],[]]
        for i in range(len(cityName)):        #将城市按label分为指定的簇
            CityCluster[label[i]].append(cityName[i])         #将每个簇的城市输出
        for i in range(len(CityCluster)):                    #将每个簇平均消费输出
            print("Expenses:%.2f" % expenses[i])
            print(CityCluster[i])
    
    

    实验过程:

    1.建立工程,导入相关sklearn相关包
    2.加载数据,创建K-Means实例,并进行训练,获得标签:

         1. 利用loadData读取数据
         2. 调用Kmeans() fit_predict()进行计算
         3. 设置簇的个数
         4. 将每个簇的数据进行输出
    

    参数说明

    1. n_clusters:用于指定簇聚类中心个数
    2. data:加载的数据(数据与py文件放在同一个文件夹中)
    3. axis=1:按行进行求和
    4. fit_predict():计算簇中心以及为簇分配序号
    5. readlines():一次读取整个文件 readline() 每次只读取一行,速度慢得多,仅当没有内存储存文件时,才应使用。

    注:加载程序时的报错问题

    ValueError:setting an array element with a sequence.

    发现错误之后,我利用Pycharm进行一步一步的debug,跟踪data的变化情况。在这里插入图片描述
    随后发现,是由于前后数组shape不一致导致的,只有一致时才能使用append,之后便意识到可能是数据出现了问题。果然,txt数据每行的末尾出现了空格。清除掉即可。

    展开全文
  • 聚类算法之层次聚类算法应用举例 1.假设有N个待聚类的样本,对于层次聚类来说,步骤: 1、(初始化)把每个样本归为一类,计算每两个类之间的距离,也就是样本与样本之间的相似度; 2、寻找各个类之间最近的两...
    聚类算法之层次聚类算法和应用举例
    1.假设有N个待聚类的样本,对于层次聚类来说,步骤:
    1、(初始化)把每个样本归为一类,计算每两个类之间的距离,也就是样本与样本之间的相似度;
    2、寻找各个类之间最近的两个类,把他们归为一类(这样类的总数就少了一个);
    3、重新计算新生成的这个类与各个旧类之间的相似度;
    4、重复2和3直到所有样本点都归为一类,结束

    2.描述:
    整个聚类过程其实是建立了一棵树,在建立的过程中,可以通过在第二步上设置一个阈值,当最近的两个类的距离大于这个阈值,则认为迭代可以终止。另外关键的一步就是第三步,如何判断两个类之间的相似度有不少种方法。这里介绍一下三种:
    SingleLinkage:又叫做 nearest-neighbor ,就是取两个类中距离最近的两个样本的距离作为这两个集合的距离,也就是说,最近两个样本之间的距离越小,这两个类之间的相似度就越大。容易造成一种叫做 Chaining 的效果,两个 cluster 明明从“大局”上离得比较远,但是由于其中个别的点距离比较近就被合并了,并且这样合并之后 Chaining 效应会进一步扩大,最后会得到比较松散的 cluster 。
    CompleteLinkage:这个则完全是 Single Linkage 的反面极端,取两个集合中距离最远的两个点的距离作为两个集合的距离。其效果也是刚好相反的,限制非常大,两个 cluster 即使已经很接近了,但是只要有不配合的点存在,就顽固到底,老死不相合并,也是不太好的办法。这两种相似度的定义方法的共同问题就是指考虑了某个有特点的数据,而没有考虑类内数据的整体特点。
    Average-linkage:这种方法就是把两个集合中的点两两的距离全部放在一起求一个平均值,相对也能得到合适一点的结果。
    average-linkage的一个变种就是取两两距离的中值,与取均值相比更加能够解除个别偏离样本对结果的干扰。
    3.Python例子代码:
    未完待续。。。。。。



    展开全文
  • 机器学习之聚类算法应用

    千次阅读 2020-01-07 12:52:29
    文章目录1 概述1.1 无监督学习与聚类算法1.2 sklearn中常用的聚类算法2 sklearn中生成测试数据函数介绍2.1 make_classification2.2 make_moons2.3 make_moons2.4 make_blobs3 使用sklearn聚类示例3.1 簇数据聚类3.2 ...

    1 概述

    本专题重点在于使用sklearn进行聚类分析,不涉及聚类算法的原理介绍。

    1.1 无监督学习与聚类算法

    在机器学习当中,有相当一部分算法属于“无监督学习”,无监督算法在训练的时候只需要特征矩阵X,不需要标签。聚类算法就是无监督学习的代表算法。

    聚类算法又叫“无监督分类”,其目的是将数据划分为有意义或者有用的组(簇)。这种划分可以基于业务的需求或者建模的需求来完成,也可以单纯的帮助我们探索数据的自然结构和分布。比如在商业中,如果我们的手头有大量的客户信息,我们可以使用聚类将客户划分为若干组,以便进一步分析和开展营销活动,最有名的客户价值判断模型RFM就常和聚类分析共同使用。再比如,聚类可以用于降维和矢量量化(vector quantization),可以将高位特征压缩到一列当中,常常用于图像,声音,视频等非结构化数据,可以大幅压缩数据量。

    聚类分类
    核心将数据分成多组
    探索每个组的数据是否有联系
    从已经分组的数据中去学习
    把新数据放到已经分好的组中去
    学习类型无监督,不需要标签进行训练有监督,需要标签
    典型算法K-Means, DBSCAN, 层次聚类, 谱聚类决策树, 贝叶斯, 逻辑回归, SVM
    算法输出聚类的结果是不确定的
    不一定总是能够反映数据的真实分类
    分类结果是确定的
    分类的优劣是客观的

    1.2 sklearn中常用的聚类算法

    sklearn中的聚类算法有两种表现形式,一种是类,需要实例化,训练并使用接口和属性来调用。另一种是函数,只需要输入特征矩阵和超参数即可返回聚类的结果和各种指标。

    含义输入
    cluster.AffinityPropagation执行亲和传播数据聚类[damping, …]
    cluster.AgglomerativeClustering凝聚聚类[…]
    cluster.BirchBirch聚类算法[threshold, branching_factor, …]
    cluster.DBSCANDBSCAN聚类算法[eps, min_samples, metrix, …]
    cluster.FeatureAgglomeration凝聚特征[n_clusters, …]
    cluster.KMeansK均值聚类[n_clusters, init, n_init, …]
    cluster.MiniBatchKMeans小批量K均值聚类[n_clusters, init, …]
    cluster.MeanShift使用平坦核函数的平均移位聚类[bandwidth, seeds, …]
    cluster.SpectralClustering谱聚类[n_clusters, …]

    1.3 sklearn中聚类使用示例

    1.3.1 聚类示例

    以KMeans为例,在sklearn中进行聚类步骤如下:

    from sklearn.datasets import make_blobs
    from sklearn.cluster import KMeans
    
    x = make_blobs(n_samples=1000, n_features=2, centers = 4, cluster_std=2.0)[0]
    ## 方式1:使用fit函数训练,然后调用cluster1.labels_得到每个数据对应的簇编号(0,1,2,...)
    cluster1 = KMeans(n_clusters = 4, random_state=10).fit(x)
    y_pred = cluster1.labels_
    
    ## 方式2:使用fit_predict直接获得每个数据对应簇编号
    y_pred = KMeans(n_clusters = 4, random_state=10).fit_predit(x)
    
    ## 以上两个方法得到的结果完全一致。
    

    1.3.2 重要属性

    • culster_centers_ - 簇心:返回每个簇心的坐标
    • inertia - 总距离平方和:越小越好

    2 sklearn中生成测试数据函数介绍

    生成数据的函数主要有:sklearn.datasets.make_classification, sklearn.datasets.make_circles, sklearn.datasets.make_moons以及sklearn.datasets.make_blobs。这里简单介绍每一个函数,具体参数见官方文档。

    2.1 make_classification

    主要用来生成分类数据,用法示例:

    x = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_repeated=0, n_clusters_per_class=1)
    

    示例:

    from sklearn.datasets import make_classification, make_circles, make_moons
    import matplotlib.pyplot as plt
    import numpy as np
    
    fig = plt.figure(figsize=(15,5))
    fig.add_subplot(1,3,1)
    x = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_repeated=0, n_clusters_per_class=1)
    plt.plot(x[0][:,0], x[0][:,1], 'b.')
    plt.title('make_classification')
    
    fig.add_subplot(1,3,2)
    x = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_repeated=0, n_clusters_per_class=2)
    plt.plot(x[0][:,0], x[0][:,1], 'b.')
    plt.title('make_classification')
    
    fig.add_subplot(1,3,3)
    x = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_repeated=0, n_clusters_per_class=2)
    plt.plot(x[0][:,0], x[0][:,1], 'b.')
    plt.title('make_classification')
    

    在这里插入图片描述

    2.2 make_moons

    用来生成月牙形数据,用法示例:

    x = make_moons(n_samples=1000, noise=0.1)
    

    示例:

    from sklearn.datasets import make_moons
    import matplotlib.pyplot as plt
    import numpy as np
    
    fig = plt.figure(figsize=(15,5))
    fig.add_subplot(1,3,1)
    x = make_moons(n_samples=1000, noise=0)
    plt.plot(x[0][:,0], x[0][:,1], 'b.')
    plt.title('Make_moons(noise=0)')
    
    fig.add_subplot(1,3,2)
    x = make_moons(n_samples=1000, noise=0.1)
    plt.plot(x[0][:,0], x[0][:,1], 'b.')
    plt.title('Make_moons(noise=0.1)')
    
    fig.add_subplot(1,3,3)
    x = make_moons(n_samples=1000, noise=0.5)
    plt.plot(x[0][:,0], x[0][:,1], 'b.')
    plt.title('Make_moons(noise=0.5)')
    

    在这里插入图片描述

    2.3 make_moons

    用来生成环形数据,用法示例:

    x = make_circles(n_samples=1000, noise=0.05, factor=0.6)
    

    示例:

    from sklearn.datasets import make_circles
    import matplotlib.pyplot as plt
    import numpy as np
    
    fig = plt.figure(figsize=(15,5))
    fig.add_subplot(1,3,1)
    x = make_circles(n_samples=1000, noise=0)
    plt.plot(x[0][:,0], x[0][:,1], 'b.')
    plt.title('make_circles(noise=0)')
    
    fig.add_subplot(1,3,2)
    x = make_circles(n_samples=1000, noise=0.05, factor=0.6)
    plt.plot(x[0][:,0], x[0][:,1], 'b.')
    plt.title('make_circles(noise=0.1)')
    
    fig.add_subplot(1,3,3)
    x = make_circles(n_samples=1000, noise=0.5)
    plt.plot(x[0][:,0], x[0][:,1], 'b.')
    plt.title('make_circles(noise=0.5)')
    

    在这里插入图片描述

    2.4 make_blobs

    用来生成簇数据,用法示例:

    x = make_blobs(n_samples=1000, n_features=2, centers = 3)
    

    示例:

    from sklearn.datasets import make_blobs
    import matplotlib.pyplot as plt
    import numpy as np
    
    fig = plt.figure(figsize=(15,5))
    fig.add_subplot(1,3,1)
    x = make_blobs(n_samples=1000, n_features=2, centers = 2)
    plt.plot(x[0][:,0], x[0][:,1], 'b.')
    plt.title('make_blobs')
    
    fig.add_subplot(1,3,2)
    x = make_blobs(n_samples=1000, n_features=2, centers = 3)
    plt.plot(x[0][:,0], x[0][:,1], 'b.')
    plt.title('make_blobs')
    
    fig.add_subplot(1,3,3)
    x = make_blobs(n_samples=1000, n_features=2, centers = 4)
    plt.plot(x[0][:,0], x[0][:,1], 'b.')
    plt.title('make_blobs')
    

    在这里插入图片描述

    3 使用sklearn聚类示例

    使用常用的六个聚类算法,并将聚类结果使用PCA降维后可视化。

    3.1 簇数据聚类

    from sklearn.datasets import make_circles
    import matplotlib.pyplot as plt
    import numpy as np
    from sklearn.cluster import KMeans, DBSCAN, SpectralClustering, Birch, MeanShift, AgglomerativeClustering
    from sklearn.decomposition import PCA
    import pandas as pd
    
    x = make_blobs(n_samples=1000, n_features=2, centers = 4, cluster_std=2.0)[0]
    pca = PCA(n_components=2)
    pca_result = pca.fit_transform(x)
    fig = plt.figure(figsize=(15,10))
    
    model = AgglomerativeClustering(n_clusters = 4)
    y_pred = model.fit_predict(x)
    fig.add_subplot(2,3,1)
    plt.scatter(pca_result[:,0], pca_result[:,1], marker='.', c=y_pred)
    plt.title('AgglomerativeClustering')
    
    model = KMeans(n_clusters = 4, random_state=10)
    y_pred = model.fit_predict(x)
    fig.add_subplot(2,3,2)
    plt.scatter(pca_result[:,0], pca_result[:,1], marker='.', c=y_pred)
    plt.title('KMeans')
    
    model = DBSCAN(eps=0.1)
    model.fit(x)
    y_pred = model.labels_
    fig.add_subplot(2,3,3)
    plt.scatter(pca_result[:,0], pca_result[:,1], marker='.', c=y_pred)
    plt.title('DBSCAN')
    
    model = SpectralClustering(n_clusters = 4, random_state=10)
    y_pred = model.fit_predict(x)
    fig.add_subplot(2,3,4)
    plt.scatter(pca_result[:,0], pca_result[:,1], marker='.', c=y_pred)
    plt.title('SpectralClustering')
    
    model = Birch(n_clusters=4)
    model.fit(x)
    y_pred = model.labels_
    fig.add_subplot(2,3,5)
    plt.scatter(pca_result[:,0], pca_result[:,1], marker='.', c=y_pred)
    plt.title('Birch')
    
    model = MeanShift()
    model.fit(x)
    y_pred = model.labels_
    fig.add_subplot(2,3,6)
    plt.scatter(pca_result[:,0], pca_result[:,1], marker='.', c=y_pred)
    plt.title('MeanShift')
    

    在这里插入图片描述

    3.2 月牙形数据聚类

    代码基本类似,直接放结果了

    在这里插入图片描述

    3.3 环形数据聚类

    在这里插入图片描述

    4 各聚类算法在各种簇分布下的聚类效果对比

    这里使用sklearn官方的示例代码演示一下效果。

    print(__doc__)
    
    import time
    
    import numpy as np
    import matplotlib.pyplot as plt
    
    from sklearn import cluster, datasets
    from sklearn.neighbors import kneighbors_graph
    from sklearn.preprocessing import StandardScaler
    
    np.random.seed(0)
    
    # Generate datasets. We choose the size big enough to see the scalability
    # of the algorithms, but not too big to avoid too long running times
    n_samples = 1500
    noisy_circles = datasets.make_circles(n_samples=n_samples, factor=.5,
                                          noise=.05)
    noisy_moons = datasets.make_moons(n_samples=n_samples, noise=.05)
    blobs = datasets.make_blobs(n_samples=n_samples, random_state=8)
    no_structure = np.random.rand(n_samples, 2), None
    
    colors = np.array([x for x in 'bgrcmykbgrcmykbgrcmykbgrcmyk'])
    colors = np.hstack([colors] * 20)
    
    clustering_names = [
        'MiniBatchKMeans', 'AffinityPropagation', 'MeanShift',
        'SpectralClustering', 'Ward', 'AgglomerativeClustering',
        'DBSCAN', 'Birch']
    
    plt.figure(figsize=(len(clustering_names) * 2 + 3, 9.5))
    plt.subplots_adjust(left=.02, right=.98, bottom=.001, top=.96, wspace=.05,
                        hspace=.01)
    
    plot_num = 1
    
    datasets = [noisy_circles, noisy_moons, blobs, no_structure]
    for i_dataset, dataset in enumerate(datasets):
        X, y = dataset
        # normalize dataset for easier parameter selection
        X = StandardScaler().fit_transform(X)
    
        # estimate bandwidth for mean shift
        bandwidth = cluster.estimate_bandwidth(X, quantile=0.3)
    
        # connectivity matrix for structured Ward
        connectivity = kneighbors_graph(X, n_neighbors=10, include_self=False)
        # make connectivity symmetric
        connectivity = 0.5 * (connectivity + connectivity.T)
    
        # create clustering estimators
        ms = cluster.MeanShift(bandwidth=bandwidth, bin_seeding=True)
        two_means = cluster.MiniBatchKMeans(n_clusters=2)
        ward = cluster.AgglomerativeClustering(n_clusters=2, linkage='ward',
                                               connectivity=connectivity)
        spectral = cluster.SpectralClustering(n_clusters=2,
                                              eigen_solver='arpack',
                                              affinity="nearest_neighbors")
        dbscan = cluster.DBSCAN(eps=.2)
        affinity_propagation = cluster.AffinityPropagation(damping=.9,
                                                           preference=-200)
    
        average_linkage = cluster.AgglomerativeClustering(
            linkage="average", affinity="cityblock", n_clusters=2,
            connectivity=connectivity)
    
        birch = cluster.Birch(n_clusters=2)
        clustering_algorithms = [
            two_means, affinity_propagation, ms, spectral, ward, average_linkage,
            dbscan, birch]
    
        for name, algorithm in zip(clustering_names, clustering_algorithms):
            # predict cluster memberships
            t0 = time.time()
            algorithm.fit(X)
            t1 = time.time()
            if hasattr(algorithm, 'labels_'):
                y_pred = algorithm.labels_.astype(np.int)
            else:
                y_pred = algorithm.predict(X)
    
            # plot
            plt.subplot(4, len(clustering_algorithms), plot_num)
            if i_dataset == 0:
                plt.title(name, size=18)
            plt.scatter(X[:, 0], X[:, 1], color=colors[y_pred].tolist(), s=10)
    
            if hasattr(algorithm, 'cluster_centers_'):
                centers = algorithm.cluster_centers_
                center_colors = colors[:len(centers)]
                plt.scatter(centers[:, 0], centers[:, 1], s=100, c=center_colors)
            plt.xlim(-2, 2)
            plt.ylim(-2, 2)
            plt.xticks(())
            plt.yticks(())
            plt.text(.99, .01, ('%.2fs' % (t1 - t0)).lstrip('0'),
                     transform=plt.gca().transAxes, size=15,
                     horizontalalignment='right')
            plot_num += 1
    
    plt.show()
    

    在这里插入图片描述

    5 聚类算法的模型评估指标

    本节参考自:【机器学习】菜菜的sklearn课堂06 - 聚类算法与KMeans

    不同于分类模型和回归,聚类算法的模型评估不是一件简单的事情。在分类问题中,有直接结果作为输出,而且分类问题的结果有正误之分,所以可以使用预测准确度,混淆矩阵,ROC曲线等指标来进行评估。在回归问题中有均方误差,RSE,MSE等损失函数衡量模型的拟合程度。那么如何衡量聚类算法的效果呢?

    面试高危问题:如何衡量聚类算法的效果?
    像KMeans这种聚类算法,其目标是确保“簇内差异小,簇间差异大“,因此可以通过衡量簇内差异来衡量聚类的效果,sklearn自带的inertia就是用距离来衡量簇内差异的指标,因此能否使用inertia来作为聚类的衡量指标呢?inertia越小模型就越好吗?

    inertia可以作为指标,但是这个指标的缺点和极限太大。

    • 它不是有界的,我们只知道inertia越小越好,但是我们并不知道一个较小的inertia是否已经达到了模型的极限
    • 它的计算太容易收到特征数目的影响,数据维度很大的时候,inertia的计算量会爆炸,不适合评估模型
    • inertia对数据的分布有假设,假设数据满足凸分布,并且假设数据是各向同性的(isotropic),即数据的属性在不同方向上代表着相同的含义。但是现实中的数据往往不是这样的。所以使用inertia作为评估指标,会让聚类算法在一些细长簇,环形簇或者不规则性状的流行时表现不佳。

    那么可以使用什么指标呢?

    5.1 当真实标签已知的时候

    虽然聚类的过程中不输入真实标签,但这不代表数据集中没有真实标签。如果拥有真实的标签,我们更倾向于使用分类算法,但仍然可以使用聚类算法对其进行分类。常用的衡量带标签数据聚类效果的方法有以下三种:

    模型评估指标说明
    互信息分

    普通互信息分
    metrics.adjusted_mutual_info_score(y_pred, y_true)
    调整的互信息分
    metrics.mutual_info_score(y_pred, y_true)
    标准化互信息分
    metrics.normalized_mutual_info_score(y_pred, y_true)
    取值范围在(0,1),越接近1聚类效果越好
    V-measure:基于条件上分析的一系列直观度量

    同质性、完整性、同质性和完整性的调和平均(V-measure)
    metrics.homogeneity_score(y_true, y_pred)
    metrics.completeness_score(y_true, y_pred)
    metrics.v_measure(y_true, y_pred)
    取值范围在(0,1),越接近1聚类效果越好
    调整兰德系数

    metrics.adjusted_rand_score(y_true, y_pred)
    取值在(-1,1)之间,负值象征着簇内的点差异巨大,越接近1表示聚类效果越好。

    5.2 当真实标签未知的时候:轮廓系数

    5.2.1 轮廓系数介绍

    在99%的情况下,我们是对没有真实标签的数据进行探索,并不知道数据的真实类别。这样的聚类,是完全依赖于评价簇内的稠密程度(簇内差异小)和簇间的离散程度(簇间差异大)来评估聚类的效果,其中轮廓系数是最常用的聚类算法的评价指标。它是对每个样本来定义的,能够同时衡量:

    • 样本与其自身所在的簇中的其他样本的相似度a,等于样本与统一簇中所有其他点之间的平均距离
    • 样本与其他簇中样本的相似度b,等于样本与下一个最近的簇中的所有点之间的平均距离

    我们希望b永远大于a,并且越大越好,因此单个样本的轮廓系数计算为:
    s = b − a m a x ( a , b ) s=\frac{b-a}{max(a,b)} s=max(a,b)ba
    这个公式可以被解析为:如果 a < b , s = 1 − a / b a<b,s=1-a/b a<b,s=1a/b,如果 a = b , s = 0 a=b,s=0 a=b,s=0,如果 a > b , s = b / a − 1 a>b,s=b/a-1 a>b,s=b/a1。因此轮廓系数的范围是(-1,1),其值越接近1表示样本与自己所在的簇中的样本很相似,并且与其他簇中的样本不相似,当样本点与簇外的样本更相似的时候,轮廓系数为负数。当轮廓系数为0的时候,表示两个簇中的样本相似度一致,两个簇本应该是一个簇。因此轮廓系数越接近1越好,越大越好

    在sklearn中可以使用metrics中的silhouette_score来计算轮廓系数,它返回的是一个数据集中所有样本的轮廓系数的均值。在metrics中的sihouette_samples的参数余轮廓系数一致,能够返回数据集中每个样本自己的轮廓系数。用法如下:

    from sklearn.metrics import silhouette_score
    from sklearn.datasets import make_blobs
    from sklearn.cluster import KMeans
    
    x = make_blobs(n_samples=1000, n_features=2, centers = 4, cluster_std=2.0)[0]
    y_pred = KMeans(n_clusters = 4, random_state=10).fit_predict(x)
    silhouette_score(x, y_pred)
    
    # >>> 0.4359497951008228
    

    轮廓系数有很多优点,它在有限空间中取值,是的我们对模型的聚类效果有一个参考。并且轮廓系数对数据的分布没有假设,因此在很多的数据集上都表现良好,它在每一个簇的分割比较清晰时表现最好。

    但是轮廓系数也有缺陷,它在凸型的数据上表面会虚高,比如基于密度进行聚类,或通过DBSCAN获得的聚类结果,如果使用轮廓系数来衡量,会表现出比真是聚类效果更高的分数。

    5.2.2 使用轮廓系数可视化图像辅助选择簇的个数

    这里参考【机器学习】菜菜的sklearn课堂06 - 聚类算法与KMeans提供的可视化代码,能够生成很完整且漂亮的可视化图片,如下图所示。关于生该图的完整代码见我的下一篇博客:
    在这里插入图片描述

    5.3 当真实标签未知时的其他评价指标

    除了轮廓系数是最常用的,还有卡林斯基-哈拉巴斯指数(Calinski-Harabaz index,简称CHI,也被称为方差比标准),戴维斯-布尔丁指数(Davies-Bouldin)以及权变矩阵(Contingency Matrix)可以使用。

    标签未知时的评估指标
    卡林斯基-哈拉巴斯指数:sklearn.metrics.calinski_harabaz_score(x, y_pred)
    戴维斯-布尔丁指数:sklearn.metrics.davies_bouldin_score(x, y_pred)
    权变矩阵:sklearn.metrics.cluster.contingency_matrix(x, y_pred)

    (完)

    展开全文
  • 基于聚类算法的IMT-2030应用场景初步研究.pdf
  • 聚类算法及其应用

    千次阅读 2020-05-02 01:10:06
    1. 聚类算法都是无监督学习吗? 什么是聚类算法?聚类是一种机器学习技术,它涉及到数据点的分组。给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组。理论上,同一组中的数据点应该具有相似的...
  • Kmeans聚类算法应用

    千次阅读 2019-11-06 16:55:17
    文章目录Kmeans聚类算法应用1. Kmeans聚类算法原理1.2 算法图示1.3 算法要点1.3.1 核心思想1.3.2 算法步骤图解1.3.3 算法实现步骤2. Kmeans分类算法Python实战2.1 需求2.2 python代码实现2.2.1 利用numpy手动实现...
  • 聚类算法应用

    万次阅读 2016-06-23 19:37:24
    聚类算法的提出比较早,是数据挖掘的一个重要模块,可以对大量数据分类并概括出每一类的特点。目前也有很多种聚类算法,包括划分法、层次法、基于密度的方法、基于网格的方法等。实际生产中,很少有只用聚类算法
  • 聚类算法

    2020-12-11 18:16:29
    1. 简介 1.1 现实中的应用 用户画像,广告推荐,Data Segmentation,搜索引擎的流量推荐,恶意流量...聚类算法是无监督的学习算法,而分类算法属于监督的学习算法。 1.4 聚类算法api初步使用 sklearn.cluster.KMean
  • 七、聚类算法应用

    千次阅读 2018-07-27 12:39:34
    聚类算法准确率不太高,很少单独使用,但是会用来提供一些特征。 一、聚类算法简介 是一种无监督学习,只有数据x,没有标签y 试图通过数据间的关系发现一定的模式 可以作为监督学习中稀疏特征的预处理 比如有200...
  • k-means算法是非监督聚类最常用的一种方法,因其算法简单和很好的适用于大样本数据,广泛应用于不同领域,本文详细总结了k-means聚类算法原理 。 目录 1. k-means聚类算法原理 2. k-means聚类算法步骤 3. k-...
  • 机器学习算法应用场景

    千次阅读 2017-10-22 11:06:35
    本文整理了60个机器学习算法应用场景实例,含分类算法应用场景20个、回归算法应用场景20个、聚类算法应用场景10个以及关联规则应用场景10个。包含了天池、DataCastle、DataFountain中所有竞赛场景。 ...
  • 在统计和数据挖掘中,近邻传播(AP)是基于数据点之间的“消息传递”概念的聚类算法。与聚类算法如ķ-means或ķ-medoids,近邻传播不需要簇的数目来确定或运行算法之前估计。类似于k-medoids,近邻传播找到“范例”...
  • DBSCAN聚类算法的理解与应用

    千次阅读 多人点赞 2020-11-27 22:27:23
    在前面的文章中,我们讲了KNN算法的原理与简单应用,KNN一种有监督学习的分类算法,也就是说该算法首先需要训练数据来进行学习之后才能对数据进行分类。在本文中我们讲到的DBSCAN聚类算法...
  • 常用聚类算法

    2020-06-22 15:33:21
    k-means作为经典的聚类算法,应用范围很广,但是在运行前要指定聚类的数量n,这个值对于最终的计算结果有很大的影响.而现在也没有通用的方法来得到这个值. 本文介绍了包括k-means在内的多种聚类算法,可以在实际中灵活...
  • 聚类算法

    2020-08-03 11:31:32
    聚类算法建立在谱图理论基础上,与传统的聚类算法相比,它具有能在任意形状的样本空间上聚类且收敛于全局最优解的优点。 该算法首先根据给定的样本数据集定义一个描述成对数据点相似度的亲合矩阵,并且计算矩阵的...
  • 机器学习算法应用场景实例六十则

    千次阅读 2020-12-17 14:47:57
    原文链接:https://blog.csdn.net/liulingyuan6/article/details/53648273本文整理了60个机器学习算法应用场景实例,含分类算法应用场景20个、回归算法应用场景20个、聚类算法应用场景10个以及关联规则应用场景10个...
  • 机器学习算法应用场景60例

    千次阅读 2019-08-11 18:18:58
            本文整理了60个机器学习算法应用场景实例,含分类算法应用场景20个、回归算法应用场景20个、聚类算法应用场景10个以及关联规则应用场景10个。包含了天池...
  • 机器学习算法应用场景实例

    千次阅读 2020-04-03 17:56:45
    本文整理了60个机器学习算法应用场景实例,含分类算法应用场景20个、回归算法应用场景20个、聚类算法应用场景10个以及关联规则应用场景10个。包含了天池、DataCastle、DataFountain中所有竞赛场景。 目录 1 分类...
  • 机器学习 聚类算法

    2021-09-07 17:41:20
    聚类算法 学习目标 掌握KMeans算法的基本原理 知道聚类算法的概念 了解聚类算法和分类算法的最大区别 KMeans算法Sklearn关键API实战 了解聚类的其他算法 1. 为什么学习聚类算法 在没有具体类别标签列或结果的前提...
  • K-means算法,是一种使用广泛的最基础的聚类算法,一般作为掌握聚类算法的第一个算法,是无监督的聚类算法,算法简单,聚类效果好,即使是在巨大的数据集上也 非常容易部署实施。正因为如此,它在很多领域都得到的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,317
精华内容 9,726
关键字:

聚类算法应用场景