精华内容
下载资源
问答
  • from sklearn.cluster import KMeans from sklearn.metrics import silhouette_samples, silhouette_score from matplotlib import pyplot as plt from matplotlib import cm import numpy as np from sklearn....

    1.导入相应包

    from sklearn.cluster import KMeans
    from sklearn.metrics import silhouette_samples, silhouette_score
    from matplotlib import pyplot as plt
    from matplotlib import cm
    import numpy as np
    from sklearn.datasets import make_blobs
    

    2.生成数据集

    X, y = make_blobs(n_features=2, centers=4, n_samples=500, random_state=1)
    

    3.绘图(比较复杂,看注释)

    #绘制在n_clusters不同情况下的轮廓图与效果图
    for n_clusters in [2, 3, 4, 5, 6, 7]:
        n_clusters = n_clusters
        #创建画布
        fig, (ax1, ax2) = plt.subplots(1, 2)
        #设置画布大小
        fig.set_size_inches(18, 7)
        #设置横轴和纵轴作图范围,注意和xticks区别
        ax1.set_xlim([-0.1, 1])
        #这里是样本数加间隔数(这里设置为10)
        ax1.set_ylim([0, X.shape[0] + (n_clusters + 1) * 10])
        #建立模型并训练
        clusterer = KMeans(n_clusters=n_clusters, random_state=10).fit(X)
        #得到标签
        cluster_labels = clusterer.labels_
        #获得平均轮廓系数
        silhouette_avg = silhouette_score(X, cluster_labels)
        #输出
        print("For n_clusters =", n_clusters,
                "The average silhouette_score is", silhouette_avg)
        #获得每个样本的轮廓系数
        sample_silhouette_values = silhouette_samples(X, cluster_labels)
        #为了不贴着x轴画图,设置距离10cm
        y_lower = 10
        #画出每个簇的轮廓图
        for i in range(n_clusters):
        	#第i个簇的值
            ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i]
            #排序
            ith_cluster_silhouette_values.sort()
            #设置y曲线长度
            size_cluster_i = ith_cluster_silhouette_values.shape[0]
            y_upper = y_lower + size_cluster_i
            #设置colormap
            color = cm.nipy_spectral(float(i) / n_clusters)
            #绘制轮廓这里fill_betweenx是通过x坐标长度绘制,fill_betweeny则是按y坐标来绘制
            ax1.fill_betweenx(np.arange(y_lower, y_upper), ith_cluster_silhouette_values, facecolor=color, alpha=0.7)
            #写上文字前两参数时坐标,后面是文字
            ax1.text(-0.05, y_lower + 0.5 * size_cluster_i, str(i))
            #设置下一个的y_lower
            y_lower = y_upper + 10
        ax1.set_title("The silhouette plot for the various clusters.")
        ax1.set_xlabel("The silhouette coefficient values")
        ax1.set_ylabel('Cluster label')
        #绘制虚直线
        ax1.axvline(x=silhouette_avg, color='red', linestyle="--")
        ax1.set_yticks([])
        ax1.set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1])
        colors = cm.nipy_spectral(cluster_labels.astype(float) / n_clusters)
        ax2.scatter(X[:, 0], X[:, 1], marker='o', s=8, c=colors)
        centers = clusterer.cluster_centers_
        ax2.scatter(centers[:, 0], centers[:, 1], marker='x', c='red', alpha=1, s=200)
        ax2.set_title("The visualization of the clustered data.")
        ax2.set_xlabel("Feature space for the 1st feature")
        ax2.set_ylabel("Feature space for the 2nd feature")
        #设置大标题
        plt.suptitle(("Silhouette analysis for KMeans clustering on sample data with n_clusters = %d" % n_clusters),
                     fontsize=14, fontweight='bold')
        plt.show()
    

    绘制图像如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • kmeans通常在数据分析前期使用,选取适当的k,将数据分类后,而后分类研究不一样聚类下数据的特色。html本文记录学习kmeans算法相关的内容,包括算法原理,收敛性,效果评估聚,最后带上R语言的例子,做为备忘。java...

    前言javascript

    kmeans是最简单的聚类算法之一,可是运用十分普遍。最近在工做中也常常遇到这个算法。kmeans通常在数据分析前期使用,选取适当的k,将数据分类后,而后分类研究不一样聚类下数据的特色。html

    本文记录学习kmeans算法相关的内容,包括算法原理,收敛性,效果评估聚,最后带上R语言的例子,做为备忘。java

    算法原理算法

    kmeans的计算方法以下:shell

    1 随机选取k个中心点app

    2 遍历全部数据,将每一个数据划分到最近的中心点中机器学习

    3 计算每一个聚类的平均值,并做为新的中心点ide

    4 重复2-3,直到这k个中线点再也不变化(收敛了),或执行了足够多的迭代函数

    时间复杂度:O(I*n*k*m)post

    空间复杂度:O(n*m)

    其中m为每一个元素字段个数,n为数据量,I为跌打个数。通常I,k,m都可认为是常量,因此时间和空间复杂度能够简化为O(n),即线性的。

    算法收敛

    从kmeans的算法能够发现,SSE实际上是一个严格的坐标降低(Coordinate Decendet)过程。设目标函数SSE以下:

    SSE(59157e8da2ea4ccd90879455.html,59157e8da2ea4ccd90879455.html,…,59157e8da2ea4ccd90879455.html) = 59157e8da2ea4ccd90879455.html

    采用欧式距离做为变量之间的聚类函数。每次朝一个变量59157e8da2ea4ccd90879455.html的方向找到最优解,也就是求偏倒数,而后等于0,可得

    c_i=59157e8da2ea4ccd90879455.html 其中m是c_i所在的簇的元素的个数

    也就是当前聚类的均值就是当前方向的最优解(最小值),这与kmeans的每一次迭代过程同样。因此,这样保证SSE每一次迭代时,都会减少,最终使SSE收敛。

    因为SSE是一个非凸函数(non-convex function),因此SSE不能保证找到全局最优解,只能确保局部最优解。可是能够重复执行几回kmeans,选取SSE最小的一次做为最终的聚类结果。

    0-1规格化

    因为数据之间量纲的不相同,不方便比较。举个例子,好比游戏用户的在线时长和活跃天数,前者单位是秒,数值通常都是几千,然后者单位是天,数值通常在个位或十位,若是用这两个变量来表征用户的活跃状况,显然活跃天数的做用基本上能够忽略。因此,须要将数据统一放到0~1的范围,将其转化为无量纲的纯数值,便于不一样单位或量级的指标可以进行比较和加权。具体计算方法以下:

    59157e8da2ea4ccd90879455.html

    其中59157e8da2ea4ccd90879455.html属于A。

    轮廓系数

    轮廓系数(Silhouette Coefficient)结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果。该值处于-1~1之间,值越大,表示聚类效果越好。具体计算方法以下:

    对于第i个元素x_i,计算x_i与其同一个簇内的全部其余元素距离的平均值,记做a_i,用于量化簇内的凝聚度。

    选取x_i外的一个簇b,计算x_i与b中全部点的平均距离,遍历全部其余簇,找到最近的这个平均距离,记做b_i,用于量化簇之间分离度。

    对于元素x_i,轮廓系数s_i = (b_i – a_i)/max(a_i,b_i)

    计算全部x的轮廓系数,求出平均值即为当前聚类的总体轮廓系数

    从上面的公式,不难发现若s_i小于0,说明x_i与其簇内元素的平均距离小于最近的其余簇,表示聚类效果很差。若是a_i趋于0,或者b_i足够大,那么s_i趋近与1,说明聚类效果比较好。

    K值选取

    在实际应用中,因为Kmean通常做为数据预处理,或者用于辅助分类贴标签。因此k通常不会设置很大。能够经过枚举,令k从2到一个固定值如10,在每一个k值上重复运行数次kmeans(避免局部最优解),并计算当前k的平均轮廓系数,最后选取轮廓系数最大的值对应的k做为最终的集群数目。

    实际应用

    下面经过例子(R实现,完整代码见附件)讲解kmeans使用方法,会将上面提到的内容所有串起来

    加载实验数据iris,这个数据在机器学习领域使用比较频繁,主要是经过画的几个部分的大小,对花的品种分类,实验中须要使用fpc库估计轮廓系数,若是没有能够经过install.packages安装。

    对iris的4个feature作数据正规化,每一个feature均是花的某个不为的尺寸。

    评估k,因为通常K不会太大,太大了也不易于理解,因此遍历K为2到8。因为kmeans具备必定随机性,并非每次都收敛到全局最小,因此针对每个k值,重复执行30次,取并计算轮廓系数,最终取平均做为最终评价标准,能够看到以下的示意图,

    59157e8da2ea4ccd90879455.html

    当k取2时,有最大的轮廓系数,虽然实际上有3个种类。

    聚类完成后,有源原始数据是4纬,没法可视化,因此经过多维定标(Multidimensional scaling)将纬度将至2为,查看聚类效果,以下

    59157e8da2ea4ccd90879455.html

    能够发现原始分类中和聚类中左边那一簇的效果仍是拟合的很好的,右测原始数据就连在一块儿,kmeans没法很好的区分,须要寻求其余方法。

    kmeans最佳实践

    1. 随机选取训练数据中的k个点做为起始点

    2. 当k值选定后,随机计算n次,取获得最小开销函数值的k做为最终聚类结果,避免随机引发的局部最优解

    3. 手肘法选取k值:绘制出k--开销函数闪点图,看到有明显拐点(以下)的地方,设为k值,能够结合轮廓系数。

    4. k值有时候须要根据应用场景选取,而不能彻底的依据评估参数选取。

    59157e8da2ea4ccd90879455.html

    参考

    展开全文
  • Kmeans是我接触的第一个机器学习算法,原理简单,却很实用,只要一想到聚类,基本上没有Kmeans解决不了的问题(此处略有夸张~~),本篇整理了Kmeans聚类原理,评判标准以及Sklearn实现过程 一、Kmeans聚类原理 用...

    数据分析目录(文末有超级彩蛋!):
    一、Excel系列——四大常用函数及十大高级图表
    二、SQL系列——性能优化/多表关联/窗口分析函数等
    三、统计学系列——概率论/置信区间/相关/抽样等
    四、Pandas系列——数据读取/清洗/规整/分析实战等
    五、Python做图系列——箱型图/散点图/回归图/热力图等
    六、业务积累系列——流水预测/精细化运营/排序算法等
    七、Kmeans系列——原理/评价指标/RFM实战等
    八、决策树系列——算法原理/调参/python实现/项目实战
    九、贝叶斯系列——算法原理/3种模型/文本分类实战
    十、神经网络系列——BP算法原理/最小二乘法/项目实战

    Kmeans是我接触的第一个机器学习算法,原理简单,却很实用,只要一想到聚类,基本上没有Kmeans解决不了的问题(此处略有夸张~~),本篇整理了Kmeans聚类原理,评判标准以及Sklearn实现过程(文末有大礼赠送

    一、Kmeans聚类原理

    用大白话来说,Kmeans分为三步

    1、待分类的样本向量化,投射到坐标轴上,先定分几个类(假设3类),随机找3个点做为初始聚类中心,分别计算每个点到3个中心的距离,哪个最近,这个点就属于哪个类了;

    2、据第一步分好的类对其内部点求均值,重新做为聚类中心,再计算一遍所有点到这几个中心的距离,重新聚类,这时肯定会有一些点叛逃,没关系,就让他走! 忠诚的还是会留下来的!

    3、就这么一直迭代,直到再也没有点移动或者达到设定的标准了,就可以结束啦!


    回想一下我们学过的二维笛卡尔坐标系,如果2个点的横纵坐标差距很小,从空间上看两个点就会挨得特别近,这个其实就是聚类的核心思想,衡量2个点之间差距的就叫做欧氏距离:( (x1-x2)^ 2+(y1-y2) ^ 2 ) ^1/2,扩大到多维,就是各维度坐标相减后求平方和再开方

    这里有一个疑问,为什么聚类和分类都是以欧氏距离或者其它距离,而在推荐系统中余弦相似度却用的比较多?

    经过深思熟虑之后,我认为主要还是业务需求不同造成的:

    聚类是想将用户按特定标准分成几类,然后针对不同的类型采用不同的运营方式,这叫做精细化运营,因此每个指标都很接近的,那必须是一类人了,比如每个月购买金额在10万以上,登录天数在20天以上,这很明显就是很有钱的忠诚用户,这个群体就是必须要小心翼翼地呵护的。而推荐系统其实不是为了找到各方面都很接近的人,而是找到同样喜欢一些东西的人,那喜欢怎么衡量,余弦相似度就是绝佳的评判标准,它只看夹角,不看距离,不管一个月花10万,还是一个月花1千,只要两人买的最多的都是同一件商品,那么就代表两人对这个商品的喜欢程度就是一样的。

    二、Kmeans评判标准

    Kmeans聚类前要考虑几个问题:

    1、数据是否有聚类的趋势
    如果是纯随机,那么不管怎么调参,聚类的效果均是不好的,聚类趋势怎么判定,用霍普金斯统计量,取任意N个点与最近向量的距离和,再取N个点与最近向量的距离和,前者除了两者的和,如果纯随机则在0.5附近,有聚类趋势的话会趋近于1或0

    2、如何确定分几类?
    一般有2种方法,1是经验法,分类数=样本数/2再开根号,当然这也没啥理论依据;另一种更科学的方法叫肘方法,先分1类,2类,3类,N类,分别计算不同分类下所有点到各自聚类中心的距离,可以想到肯定是分1类距离最大,分到N类距离为0(每个点都是一个类),当从1类变成2类,距离会迅速减小,2类变成3类,3类变成4类,直到分到某个数时,发现其减少的量会变得很缓,达到一个拐点,那这个拐点就是最佳的分类数,如果画图就像一个手肘,于是美其名曰:轴方法

    3、如何评判分类质量?
    不像其它监督学习可以用测试集直接进行质量评判,聚类没有样本输出,但可以根据簇内稠密度和簇外分散度来衡量,一般有2种,而这2种Sklearn中都有。
    一个是轮廓系数,向量与簇内部各点距离求均值,衡量簇内部的紧凑程度,再与簇外部所有点的距离求均值,衡量簇外部的分散程度,后者减掉前者,再除了两者的最大值,结果在[-1,1]之间,如果趋近于1,那是分得相当好了,如果是负数,那啥也别说了,直接重来吧~~在Sklearn中是用silhouette_score()计算所有点的平均轮廓系数,而silhouette_samples()返回每个点的轮廓系数
    另一个是Calinski-Harabaz(CH),用的是簇间的协方差矩阵与簇内的协方差矩阵相除,如果前者越大,后者越小,那么分值越大,分类越好,在sklearn中et是是用metrics.calinski_harabaz_score.

    三、Sklearn实现

    1、主要参数介绍

    1. n_clusters: K值,这个值一般需要结合第3点的评判标准,找到最佳的K
      2)max_iter: 最大的迭代次数,一般如果是凸数据集的话可以不管这个值,如果数据集不是凸的,可能很难收敛,此时可以指定最大的迭代次数让算法可以及时退出循环。
      3)n_init:用不同的初始化质心运行算法的次数。由于K-Means是结果受初始值影响的局部最优的迭代算法,因此需要多跑几次以选择一个较好的聚类效果,默认是10,一般不需要改。如果你的k值较大,则可以适当增大这个值。
      4)init: 初始值选择的方式,一般默认’k-means++’。

    2、使用数据生成器生成聚类数据,采用CH分数和散点图评判聚类结果

    from sklearn.cluster import KMeans
    from sklearn.datasets import make_blobs
    from sklearn import metrics
    import matplotlib.pyplot as plt
    from sklearn import datasets
    
    x,y = make_blobs(n_samples=1000,n_features=2,centers=4,cluster_std=[0.2,0.3,0.5,0.4],shuffle=True,random_state=9)
    print(x[:5])
    score = []
    
    fig = plt.figure(figsize=(20,20))
    ax1 = fig.add_subplot(221)
    plt.scatter(x[:,0],x[:,1],c=y)
    plt.title('原始(设定分4类)')
    
    ax2 = fig.add_subplot(222)
    clf = KMeans(n_clusters=3,max_iter=1000)
    pred = clf.fit_predict(x)
    score.append(metrics.calinski_harabaz_score(x,pred))
    plt.scatter(x[:,0],x[:,1],c=pred)
    plt.title('Kmeans分3类')
    
    ax3 = fig.add_subplot(223)
    clf = KMeans(n_clusters=4,max_iter=1000)
    pred = clf.fit_predict(x)
    score.append(metrics.calinski_harabaz_score(x,pred))
    plt.scatter(x[:,0],x[:,1],c=pred)
    plt.title('Kmeans分4类')
    
    ax4 = fig.add_subplot(224)
    clf = KMeans(n_clusters=6,max_iter=1000)
    pred = clf.fit_predict(x)
    score.append(metrics.calinski_harabaz_score(x,pred))
    plt.scatter(x[:,0],x[:,1],c=pred)
    plt.title('Kmeans分6类')
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['font.serif'] = ['SimHei']  # 设置正常显示中文
    plt.show()
    print(score)
    

    在这里插入图片描述
    在这里插入图片描述
    从CH分数看,分4类是最高的,这与预期设定的4类结果是一致的,从散点图上也能看出,分4类也是最好的。当特征超过2维后,我们肉眼已经无法直观判断时,CH分数可以做为很实用的替代方法


    本人互联网数据分析师,目前已出ExcelSQLPandasMatplotlibSeaborn机器学习统计学个性推荐关联算法工作总结系列。


    微信搜索 " 数据小斑马" 公众号,回复“数据分析"就可以免费领取数据分析升级打怪 15本必备教材

    在这里插入图片描述

    展开全文
  • 轮廓系数确定kmeans的K值

    千次阅读 2020-01-06 11:43:51
    轮廓系数确定kmeans的K值 方法: 1,计算样本i到同簇其他样本的平均距离ai。ai 越小,说明样本i越应该被聚类到该簇。将ai 称为样本i的簇内不相似度。 簇C中所有样本的a i 均值称为簇C的簇不相似度。 2,计算样本i到...

    轮廓系数确定kmeans的K值

    方法:
    1,计算样本i到同簇其他样本的平均距离ai。ai 越小,说明样本i越应该被聚类到该簇。将ai 称为样本i的簇内不相似度。
    簇C中所有样本的a i 均值称为簇C的簇不相似度
    2,计算样本i到其他某簇Cj 的所有样本的平均距离bij,称为样本i与簇Cj 的不相似度。定义为样本i的簇间不相似度:bi =min{bi1, bi2, …, bik}
    bi越大,说明样本i越不属于其他簇。
    3,根据样本i的簇内不相似度a i 和簇间不相似度b i ,定义样本i的轮廓系数:
    在这里插入图片描述
    4,判断:
    si接近1,则说明样本i聚类合理;
    si接近-1,则说明样本i更应该分类到另外的簇;
    若si 近似为0,则说明样本i在两个簇的边界上。
    所有样本的s i 的均值称为聚类结果的轮廓系数,是该聚类是否合理、有效的度量。

    做出学习曲线:
    https://blog.csdn.net/qq_15738501/article/details/79036255

    https://blog.csdn.net/u012679583/article/details/80316619

    展开全文
  • kmeans是最简单的聚类算法之一,但是运用十分广泛。最近在工作中也经常遇到这个算法。kmeans一般在数据分析前期使用,选取适当的k,将数据分类后,然后分类研究不同聚类下数据的特点。 本文记录学习kmeans算法相关的...
  • Section I: Brief Introduction on KMeans Cluster The K-Means algorithm belongs to the category of prototype-based clustering. Prototype-based clustering means that each cluster is represented by a ...
  • 1、导库 from sklearn.cluster import KMeans from sklearn.metrics import silhouette_samples, silhouette_score import matplotlib.pyplot as plt ...# 想要知道每个聚出来的类的轮廓系数是多少,还想要一个.
  • 利用 手肘法SSE 和 轮廓系数 检验。 本文运用SSE(簇内误方差)和轮廓系数两种检验方法,对三、(2)python实现完整的K-means算法进行K值检验。 完整代码如下: (1) SSE。 SSE利用计算误方差和,来实现对不同K值的选取...
  • Kmeans2Pmml.py # -*- coding:utf-8 -*- import pandas from sklearn.model_selection import train_test_split import numpy as np # 导入numpy库 import matplotlib.pyplot as plt # 导入matplotlib库 from ...
  • 1、基于python实现K-Means ...语法:from sklearn.cluster imports KMeans model = KMeans(n_clusters=k) model.fit(data) y_pred = model.predict(data) 属性: cluster_centers_:簇中心【数组】 centro
  • kmeans是最简单的聚类算法之一,但是运用十分广泛。最近在工作中也经常遇到这个算法。kmeans一般在数据分析前期使用,选取适当的k,将数据分类后,然后分类研究不同聚类下数据的特点。 本文记录学习kmeans算法...

空空如也

空空如也

1 2 3 4 5 6
收藏数 115
精华内容 46
关键字:

kmeans轮廓系数