精华内容
下载资源
问答
  • R语言Kmeans聚类、抽取聚类簇:fpc包的kmeansruns函数通过Calinski-Harabasz准则和平均轮廓系数(ASW)为...
    2021-11-23 21:48:43

    R语言Kmeans聚类、抽取Kmeans聚类找到的聚类簇:fpc包的kmeansruns函数通过Calinski-Harabasz准则和平均轮廓系数(Average average silhouette width “ASW”)为Kmeans选择最优的聚类K值、并与层次聚类的最佳K值进行比较

     

    目录

    更多相关内容
  • 谱聚类和计算轮廓系数评估聚类效果代码 matlab,可以提供借鉴参考
  • 10)) plt.plot(t+1,S_D,ms=11,lw=4, marker='^',color='b', label='CluBagging模型') plt.xticks(np.arange(len(S_D))+1,np.arange(len(S_D))+1) plt.xlabel("聚类簇数k") plt.ylabel("平均轮廓系数Silhouette") plt...
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib import rc
    import matplotlib as mpl
    import matplotlib.font_manager as fm
    myfont=fm.FontProperties(fname='C:/Windows/Fonts/msyh.ttc')
    mpl.rcParams['axes.unicode_minus']=False
    plt.rcParams['font.sans-serif'] = 'SimHei'
    rc('mathtext', default='regular')
    
    S_D=[0,0.2525,0.2787,0.3440,0.3731,0.3952,0.3726,0.3332,0.3478,0.3214] 
    
    t = np.arange(len(S_D))
    fig = plt.figure(figsize=(15,10))
    plt.plot(t+1,S_D,ms=11,lw=4, marker='^',color='b',
             label='CluBagging模型')
    plt.xticks(np.arange(len(S_D))+1,np.arange(len(S_D))+1)
    plt.xlabel("聚类簇数k")
    plt.ylabel("平均轮廓系数Silhouette")
    plt.legend(prop=myfont,loc='best') 
    plt.rcParams.update({'font.size': 25})
    
    展开全文
  • # print(kmeans_temp) score = silhouette_score(data_matrix, kmeans_temp) # 得到每个K下的平均轮廓系数 # 获取最佳k值 if score > max_score: # 如果平均轮廓系数更高 max_score = score # 保存更高的系数值 best...

    一、基于K-Means获取最佳K值

    score_list = []
    max_score = -1
    for k in range(2, 6):  # 2,3,4,5
        kmeans_model = KMeans(n_clusters=k)  # 建模
        kmeans_temp = kmeans_model.fit_predict(data_matrix)  # 计算点距离
        # print(kmeans_temp)
        score = silhouette_score(data_matrix, kmeans_temp)  # 得到每个K下的平均轮廓系数
        # 获取最佳k值
        if score > max_score:  # 如果平均轮廓系数更高
            max_score = score  # 保存更高的系数值
            best_k = k  # 保存最佳的k值
            labels_temp = kmeans_temp  # 保存标签数据
        # print(k, score)
        score_list.append([k, score])  # 存每一次的k值和对应的平均轮廓系数
    # print('{:*^60}'.format('所有的k值以及对应平均轮廓系数'))
    print(score_list)
    print('最佳K值:', best_k)
    

    结果

    [[2, 0.3865549293769709], [3, 0.45864450618656805], [4, 0.5020981194788054], [5, 0.48003589664576785]]
    最佳K值: 4
    

    二、聚类结果分析

    • 合并数据与聚类标签
     # 将聚类标签转化为df
    cluster_labels = pd.DataFrame(labels_temp, columns=['clusters']) 
     # 整合原始数据与聚类标签
    merge_data = pd.concat((data, cluster_labels), axis=1) 
    
    • 统计各聚类下的样本量
    cluster_counts = pd.DataFrame(merge_data['渠道代号'].groupby(merge_data['clusters'])
                                  .count()).T.rename({'渠道代号': 'counts'})
    print(cluster_counts)
    

    结果

    clusters    0    1    2   3
    counts    349  313  154  73
    
    • 统计各聚类下的样本占比
    cluster_percents = (cluster_counts / len(data)).round(3).rename({'counts': 'percentage'})
    print(cluster_percents)
    

    结果

    clusters        0      1      2      3
    percentage  0.393  0.352  0.173  0.082
    
    • 查看各聚类的特征
    # 查看各聚类的特征,对数值类型查看均值,对文本类型查看众数
    features = []
    for label in range(best_k):
        label_data = merge_data[merge_data['clusters'] == label]
    
        # 数值类特征的均值
        p1_data = label_data.iloc[:, 1:7]  # 筛选出数值类特征
        p1_des = p1_data.describe().round(3)  # 获取描述性统计信息
        p1_mean = p1_des.iloc[1, :]  # 获取均值数据
    
        # 字符类特征的众数
        p2_data = label_data.iloc[:, 7:12]  # 筛选出字符类特征
        p2_des = p2_data.describe()  # 获取描述性统计信息
        p2_mode = p2_des.iloc[2, :]  # 获取频数最高的标签
    
        # 横向拼接2类不同特征的数据
        merge_line = pd.concat((p1_mean, p2_mode), axis=0)
        # 纵向拼接4类簇的统计数据
        features.append(merge_line)
    # 数据合并与展示
    cluster_pd = pd.DataFrame(features).T
    all_cluster_pd = pd.concat((cluster_counts, cluster_percents, cluster_pd), axis=0)
    print(all_cluster_pd)
    

    结果

                      0        1        2        3
    counts           73      349      313      154
    percentage    0.082    0.393    0.352    0.173
    日均UV        1401.53  300.205  572.521  613.836
    平均注册率         0.001    0.001    0.001    0.003
    平均搜索量         0.033    0.016    0.051     0.02
    访问深度          1.727     2.27    2.145     2.19
    订单转化率         0.002    0.002    0.004    0.003
    投放总时间        15.603    15.35   17.125   15.682
    素材类型            swf      jpg      swf      jpg
    广告类型           tips       横幅      不确定   banner
    合作方式            cpm      cpc      roi      cpc
    广告尺寸        450*300   600*90   600*90  308*388
    广告卖点             打折       直降       打折       满减
    

    K-Means建模分析完成

    数据文件

    展开全文
  • 能够经过枚举,令k从2到一个固定值如10,在每一个k值上重复运行数次kmeans(避免局部最优解),并计算当前k的平均轮廓系数,最后选取轮廓系数最大的值对应的k做为最终的集群数目。 实际应用 下面经过例子(R实现,完整...

    前言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

    参考

    展开全文
  • 如果一个簇中的大多数样本具有比较高的轮廓系数,则簇会有较高的总轮廓系数,则整个数据集的平均轮廓系数越高,则聚类是合适的。如果许多样本点具有低轮廓系数甚至负值,则聚类是不合适的,聚类的超参数K可能设定得...
  • 机器学习之K均值的SSE和轮廓系数

    千次阅读 2021-02-19 09:35:12
    SSE(sum of the squared errors)是对簇松散度的衡量,作为目标函数其实是一个严格的坐标下降(Coordinate Decendet)过程。SSE不能保证找到全局最优解,...平均轮廓系数的取值范围为[-1,1],系数越大,聚类效果越好。
  • 轮廓系数是评估聚类效果的指标,取值范围为[-1,1],越接近1表示聚类效果越好。 在聚类时可用于聚类个数的选择。通过遍历簇数,计算对应轮廓系数,选择轮廓系数最大时对应的聚类模型。 Kmeans聚类:对于初始的中心个...
  • 聚类结果评价指标——轮廓系数 某个点的轮廓系数定义为: s=disMeanout−disMeaninmax(disMeanout,disMeanin)s =\frac{disMean_{out} - disMean_{in}}{max(disMean_{out}, disMean_{in})}s=max(disMeanout​,...
  • 含义轮廓系数(Silhouette Coefficient),是聚类效果好坏的一种评价方式。可见轮廓系数的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优。计算步骤1)对于簇中的每个向量,分别计算它们的轮廓系数。对于...
  • 计算它与所在聚类其它样本的平均距离a,以及该样本与距离最近的另一个聚类中所有样本的平均距离b,该样本的轮廓系数为(b-a)/max(a, b),将整个样本空间中所有样本的轮廓系数取算数平均值,作为聚类划分的性能指标s。...
  • 在学习使用k-means算法进行负载聚类分析时看到了这样的图,查了之后大仙是用轮廓系数来评估分类结果的准确度或者称合适度。 定义 轮廓系数结合了凝聚度和分离度,其计算步骤如下: 1.对于第i个对象,计算它到...
  • 一、轮廓系数含义: 轮廓系数(Silhouette Coefficient),是聚类效果好坏的一种评价方式。 最佳值为1,最差值为-1。接近0的值表示重叠的群集。负值通常表示样本已分配给错误的聚类,因为不同的聚类更为相​​似 ...
  • 聚类评估:轮廓系数 计算样本到同簇其他样本的平均距离ai, ai越小,说明样本越应该被聚类到该簇 计算样本到其他簇样本的平均距离bi,这个称为样本与簇Cj的不相似度 s(i) = (b(i) - a(i)) / max(b(i), a(i)) si ...
  • 当 k=6 时,SEE 的值会低很多,但此时平均轮廓系数的值非常高,仅仅比 k=2 时的值低一点。因此,k=6 是最佳的选择。 . 2 python中的分群质量 主要参考来自官方文档: Clustering 部分内容来源于: 机器...
  • 可以通过枚举,令k从2到一个固定值如10,在每个k值上重复运行数次kmeans(避免局部最优解),并计算当前k的平均轮廓系数,最后选取轮廓系数最大的值对应的k作为最终的集群数目。   实际应用 下面通过...
  • Kmeans聚类③——Kmeans聚类原理&轮廓系数&Sklearn实现

    万次阅读 多人点赞 2019-06-15 10:40:31
    如果是负数,那啥也别说了,直接重来吧~~在Sklearn中是用silhouette_score()计算所有点的平均轮廓系数,而silhouette_samples()返回每个点的轮廓系数 另一个是Calinski-Harabaz(CH),用的是簇间的协方差矩阵与簇内...
  • 这次实现一个轮廓系数(wiki , baidu)。目的是为了评估聚类效果的好坏。 我比较推荐大家观看wiki的说法,百度里面的有些说的不是很明白,比如百度百科中的这句话就很费劲 (计算 b(i) = min (i向量到所有非...
  • 轮廓系数

    千次阅读 2018-10-22 19:02:37
    轮廓系数如何计算(图像来源于百度) a(i) :i向量到同一簇内其他点不相似程度的平均值 b(i) :i向量到其他簇的平均不相似程度的最小值 通过图可以知道轮廓系数的如何计算 可以用轮廓系数确定样本在聚类结果中的内...
  • 轮廓系数的计算规则: 针对样本空间中的一个特定样本, 计算它与所在聚类其它样本的平均距离a, 以及该样本与距离最近的另一个聚类中所有的样本的平均距离b. 那么该样本的轮廓系数为(b-a)/max(a,b). 若将整个样本空间中
  • 平均轮廓系数的取值范围为[-1,1],且簇内样本的距离越近,簇间样本距离越远,平均轮廓系数越大,聚类效果越好。那么,很自然地,平均轮廓系数最大的k便是最佳聚类数。 2.2 实践 我们同样使用2.1中的数据集,同样考虑...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,165
精华内容 2,866
关键字:

平均轮廓系数