-
轮廓系数
2018-10-22 19:02:37轮廓系数如何计算(图像来源于百度) a(i) :i向量到同一簇内其他点不相似程度的平均值 b(i) :i向量到其他簇的平均不相似程度的最小值 通过图可以知道轮廓系数的如何计算 可以用轮廓系数确定样本在聚类结果中的内...轮廓系数如何计算(图像来源于百度)
a(i) :i向量到同一簇内其他点不相似程度的平均值
b(i) :i向量到其他簇的平均不相似程度的最小值通过图可以知道轮廓系数的如何计算
可以用轮廓系数确定样本在聚类结果中的内聚度和分离度 -
聚类学习-轮廓系数
2018-01-24 14:30:25轮廓系数(silhouette coefficient) 结合了凝聚度和分离度,其计算步骤如下: 对于第 i 个对象,计算它到所属簇中所有其他对象的平均距离,记 ai (体现凝聚度) 对于第 i 个对象和不包含该对象的任意簇,计算...定义
轮廓系数(silhouette coefficient) 结合了凝聚度和分离度,其计算步骤如下:
- 对于第 i 个对象,计算它到所属簇中所有其他对象的平均距离,记 ai (体现凝聚度)
- 对于第 i 个对象和不包含该对象的任意簇,计算该对象到给定簇中所有对象的平均距离,记 bi (体现分离度)
- 第 i 个对象的轮廓系数为 si = (bi-ai)/max(ai, bi) //回头研究一下 wordpress 的公式插件去
从上面可以看出,轮廓系数取值为[-1, 1],其值越大越好,且当值为负时,表明 ai<bi,样本被分配到错误的簇中,聚类结果不可接受。对于接近0的结果,则表明聚类结果有重叠的情况。
scikit-learn 中的轮廓系数
对应 scikit-learn 方法是 sklearn.metrics.silhouette_score。该方法是计算所有样本的平均值,另一个方法 silhouette_samples 会返回所有样本的轮廓系数。在文档中提到,轮廓系数需要聚类数大于2,小于(样本数-1)。方法包括几个参数,最终返回一个 float 的轮廓系数,通常是在全部样本上的。
- X:二维样本,通常为[n_samples, n_features],当 metric 设置为”precomputed”时,应为[n_samples, n_samples]方阵
- labels:一维矩阵,每个样本所属簇的 label
- metric:预计算”precomputed”,或者为一个可调用的函数计算两个实例之间的距离。如果为 string,则必须是metrics.pairwise.pairwise_distances 中 metric 可选的(‘cityblock’, ‘cosine’, ‘euclidean’, ‘l1’, ‘l2’, ‘manhattan’ 或‘braycurtis’, ‘canberra’, ‘chebyshev’, ‘correlation’, ‘dice’, ‘hamming’, ‘jaccard’, ‘kulsinski’, ‘mahalanobis’, ‘matching’, ‘minkowski’, ‘rogerstanimoto’, ‘russellrao’, ‘seuclidean’, ‘sokalmichener’, ‘sokalsneath’, ‘sqeuclidean’, ‘yule’)——好多啊。
- sample_size:随机取样一部分计算平均值,int 类型
- random_state:当sample_size 为非空时用来生成随机采样。给定一个种子,或者使用 numpy.RandomState
-
**kwds:其他可选的 key-value 参数
import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score #分割出6个子图,并在1号做图 plt.subplot(3,2,1) #初始化原始数字点 x1 = np.array([1,2,3,1,5,6,5,5,6,7,8,9,7,9]) x2 = np.array([1,3,2,2,8,6,7,6,7,1,2,1,1,3]) #X = np.array([x1,x2]) X = np.array(list(zip(x1,x2))).reshape(len(x1), 2) #在1号子图做出原始数据点阵的分布 plt.xlim([0, 10]) plt.ylim([0, 10]) plt.title('Instance') plt.scatter(x1,x2) colors = ['b','g','r','c','m','y','k','b'] #点的颜色 markers = ['o','s','D','v','^','p','*','+'] #点的标号 clusters = [2,3,4,5,8] #簇的个数 subplot_counter = 1 sc_scores = [] for t in clusters: subplot_counter += 1 plt.subplot(3,2,subplot_counter) kmeans_model = KMeans(n_clusters=t).fit(X) #训练模型 for i,l in enumerate(kmeans_model.labels_): plt.plot(x1[i], x2[i], color = colors[l], marker = markers[l], ls = 'None') plt.xlim([0,10]) plt.ylim([0,10]) sc_score = silhouette_score(X, kmeans_model.labels_, metric='euclidean') sc_scores.append(sc_score) plt.title('K=%s, silhouette coefficient=%0.03f'%(t,sc_score)) plt.figure() plt.plot(clusters, sc_scores, '*-') plt.xlabel('Number of Clusters') plt.ylabel('Silhouette Coefficient Score') plt.show()
-
-
聚类轮廓系数java_轮廓系数的应用:kmeans聚类理论篇K的选择(轮廓系数)
2021-03-18 11:06:49对于元素x_i,轮廓系数s_i = (b_i – a_i)/max(a_i,b_i) 计算全部x的轮廓系数,求出平均值即为当前聚类的总体轮廓系数 从上面的公式,不难发现若s_i小于0,说明x_i与其簇内元素的平均距离小于最近的其余簇,表示...前言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(
,
,…,
) =
采用欧式距离做为变量之间的聚类函数。每次朝一个变量
的方向找到最优解,也就是求偏倒数,而后等于0,可得
c_i=
其中m是c_i所在的簇的元素的个数
也就是当前聚类的均值就是当前方向的最优解(最小值),这与kmeans的每一次迭代过程同样。因此,这样保证SSE每一次迭代时,都会减少,最终使SSE收敛。
因为SSE是一个非凸函数(non-convex function),因此SSE不能保证找到全局最优解,只能确保局部最优解。可是能够重复执行几回kmeans,选取SSE最小的一次做为最终的聚类结果。
0-1规格化
因为数据之间量纲的不相同,不方便比较。举个例子,好比游戏用户的在线时长和活跃天数,前者单位是秒,数值通常都是几千,然后者单位是天,数值通常在个位或十位,若是用这两个变量来表征用户的活跃状况,显然活跃天数的做用基本上能够忽略。因此,须要将数据统一放到0~1的范围,将其转化为无量纲的纯数值,便于不一样单位或量级的指标可以进行比较和加权。具体计算方法以下:
其中
属于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次,取并计算轮廓系数,最终取平均做为最终评价标准,能够看到以下的示意图,
当k取2时,有最大的轮廓系数,虽然实际上有3个种类。
聚类完成后,有源原始数据是4纬,没法可视化,因此经过多维定标(Multidimensional scaling)将纬度将至2为,查看聚类效果,以下
能够发现原始分类中和聚类中左边那一簇的效果仍是拟合的很好的,右测原始数据就连在一块儿,kmeans没法很好的区分,须要寻求其余方法。
kmeans最佳实践
1. 随机选取训练数据中的k个点做为起始点
2. 当k值选定后,随机计算n次,取获得最小开销函数值的k做为最终聚类结果,避免随机引发的局部最优解
3. 手肘法选取k值:绘制出k--开销函数闪点图,看到有明显拐点(以下)的地方,设为k值,能够结合轮廓系数。
4. k值有时候须要根据应用场景选取,而不能彻底的依据评估参数选取。
参考
-
基于轮廓系数的未知源手机图像分类方法
2021-03-26 12:07:28手机已成为日常生活中必不可少的通讯配件。 智能手机使用的MMS(多媒体消息服务)对移动图像处理提出了... 在图划分中采用谱聚类算法,并使用轮廓系数从所有分类可能性中提取最佳分类。 实验结果证明了该方法的有效性。 -
聚类算法评估——轮廓系数及python实现
2019-07-22 13:39:47轮廓系数(Silhouette Coefficient),是聚类效果好坏的一种评价方式。 轮廓系数的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优。 计算步骤 1)对于簇中的每个向量,分别计算它们的轮廓系数。 ...含义
轮廓系数(Silhouette Coefficient),是聚类效果好坏的一种评价方式。
轮廓系数的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优。
计算步骤
1)对于簇中的每个向量,分别计算它们的轮廓系数。
对于其中的一个点 i 来说:
计算 簇内不相似度a(i) :i向量到同簇内其他点不相似程度的平均值,体现凝聚度
计算 簇间不相似度b(i) :i向量到其他簇的平均不相似程度的最小值,体现分离度
那么第i个对象的轮廓系数就为:
si接近1,则说明样本i聚类合理;si接近-1,则说明样本i更应该分类到另外的簇;若si 近似为0,则说明样本i在两个簇的边界上。
2)将所有点的轮廓系数求平均,就是该聚类结果总的轮廓系数。
python实现
# -*- coding: utf-8 -*- import pandas as pd import numpy as np from sklearn.cluster import KMeans from sklearn import metrics #假如我要构造一个聚类数为10的聚类器 estimator = KMeans(n_clusters=10, random_state=777)#构造聚类器,设定随机种子 estimator.fit(kmeans_data_tf)#聚类 r1 = pd.Series(estimator.labels_).value_counts() #统计各个类别的数目 r2 = pd.DataFrame(estimator.cluster_centers_) #找出聚类中心 r = pd.concat([r2, r1], axis = 1) #横向连接(0是纵向),得到聚类中心对应的类别下的数目 r.columns = list(kmeans_data_tf.columns) + [u'类别数目'] #重命名表头 print(r) print("轮廓系数:", metrics.silhouette_score(kmeans_data_tf, estimator.labels_, metric='euclidean'))
-
无监督模型评估_轮廓系数
2019-09-28 08:59:57但是,我们可以通过计算每一个簇中点的轮廓系数来衡量聚类的质量。数据点的轮廓系数衡量了它与分配给他的簇的相似度,这个值范围在-1(不相似)到1(相似)。平均轮廓系数为我们提供了一种简单地度量聚类质量... -
python计算3j系数_聚类算法评估——轮廓系数及python实现
2020-12-23 01:43:58含义轮廓系数(Silhouette Coefficient),是聚类效果好坏的一种评价方式。可见轮廓系数的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优。计算步骤1)对于簇中的每个向量,分别计算它们的轮廓系数。对于... -
dbscan聚类算法实例_聚类性能评估-轮廓系数
2021-01-09 21:45:18当文本类别未知时,可以选择轮廓系数作为聚类性能的评估指标。轮廓系数取值范围为[-1,1],取值越接近1则说明聚类性能越好,相反,取值越接近-1则说明聚类性能越差。a:某个样本与其所在簇内其他样本的平均距离b:... -
谱聚类和计算轮廓系数评估聚类效果代码 matlab,可以提供借鉴参考
2019-09-20 16:34:53谱聚类和计算轮廓系数评估聚类效果代码 matlab,可以提供借鉴参考 -
聚类结果不好怎么办_聚类性能评估-轮廓系数
2020-11-26 10:31:46当文本类别未知时,可以选择轮廓系数作为聚类性能的评估指标。轮廓系数取值范围为[-1,1],取值越接近1则说明聚类性能越好,相反,取值越接近-1则说明聚类性能越差。a:某个样本与其所在簇内其他样本的平均距离b:... -
聚类评估算法-轮廓系数(Silhouette Coefficient )
2019-03-11 14:15:55轮廓系数 是用来 判断 “聚类效果”的 一个指标。 轮廓系数的核心思想是判断:类间距离 与 类内距离 的相对大小,如果 类间距离 > 类内距离,则说明 聚类结果好,反之,则不好。 轮廓系数 的 这种思想 与 ... -
『ML』用Python实现聚类效果的评估(轮廓系数、互信息)
2021-01-20 02:33:09本文介绍两种聚类评估方法,轮廓系数(Silhouette Coefficient)以及标准化互信息(NMI),并且用Python实现。 导航效果评估综述轮廓系数互信息参考文章 效果评估综述 这里直接贴上 聚类算法初探(七)聚类... -
机器学习之K均值的SSE和轮廓系数
2021-02-19 09:35:12SSE(sum of the ...轮廓系数法结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果。 指标:内部距离最小化,外部距离最大化。平均轮廓系数的取值范围为[-1,1],系数越大,聚类效果越好。 -
sklearn之聚类评估指标---轮廓系数
2019-07-21 09:13:00轮廓系数:-----聚类的评估指标 好的聚类:内密外疏,同一个聚类内部的样本要足够密集,不同聚类之间样本要足够疏远。 轮廓系数计算规则:针对样本空间中的一个特定样本,计算它与所在聚类其它样本的平均距离... -
tslearn使用轮廓系数(silhouette_score)评估KShape聚类效果
2020-08-11 22:38:05tslearn和sklearn一样,是一款优秀的机器学习框架,tslearn更偏向于处理时间序列问题,如其聚类模块就包含了DTW(Dynamic Time Warping)等算法及变种,也提供了轮廓系数对聚类效果评估,十分方便。但可惜,tslearn... -
K-means聚类算法(基于轮廓系数来选择n_cluster)
2020-01-13 16:24:55如果一个簇中的大多数样本具有比较高的轮廓系数,则簇会有较高的总轮廓系数,则整个数据集的平均轮廓系数越高,则聚类是合适的。如果许多样本点具有低轮廓系数甚至负值,则聚类是不合适的,聚类的超参数K可能设定得... -
轮廓系数确定kmeans的K值
2020-01-06 11:43:51轮廓系数确定kmeans的K值 方法: 1,计算样本i到同簇其他样本的平均距离ai。ai 越小,说明样本i越应该被聚类到该簇。将ai 称为样本i的簇内不相似度。 簇C中所有样本的a i 均值称为簇C的簇不相似度。 2,计算样本i到... -
聚类︱python实现 六大 分群质量评估指标(兰德系数、互信息、轮廓系数)
2017-04-24 11:54:171 R语言中的分群质量——轮廓系数 因为先前惯用R语言,那么来看看R语言中的分群质量评估,节选自笔记︱多种常见聚类模型以及分群质量评估(聚类注意事项、使用技巧): 没有固定标准,一般会... -
聚类评估算法-轮廓系数
2018-05-15 21:23:14轮廓系数(Silhouette Coefficient),是聚类效果好坏的一种评价方式。最早由 Peter J. Rousseeuw 在 1986 提出。它结合内聚度和分离度两种因素。可以用来在相同原始数据的基础上用来评价不同算法、或者算法不同运行... -
python——k-means聚类(余弦距离,用轮廓系数确定聚类系数K)
2018-05-14 23:04:41用scikit-learn进行k-means聚类,默认使用欧式距离,为了用余弦距离作为度量,找了一个在... 另外,为了确定一个合理的聚类系数,采用轮廓系数作为衡量标准: 轮廓系数取值为[-1, 1],其值越大越好。from sklearn... -
sklearn聚类模型评估代码_sklearn之聚类评估指标---轮廓系数
2020-12-24 11:02:11轮廓系数计算规则:针对样本空间中的一个特定样本,计算它与所在聚类其它样本的平均距离a,以及该样本与距离最近的另一个聚类中所有样本的平均距离b,该样本的轮廓系数为(b-a)/max(a, b),将整个样本空间中所有样本... -
使用轮廓系数来确定K-means算法簇的数量
2016-10-22 16:52:55在使用K-means算法的时候,我们最纠结的两个点,第一个点是我们不知道分为几类,第二个点初始的聚类中心对聚类结果的影响,我们在这些使用轮廓系数评判聚类结果的好坏来确定初始的聚类中心和簇的数量。 首先随机... -
聚类 - 3 - 轮廓系数
2016-07-20 11:45:46本总结是是个人为防止遗忘而作,...方法就是轮廓系数(Silhouette)。 Silhouette系数是对聚类结果有效性的解释和验证,由Peter J. Rousseeuw于1986提出。 方法: 1,计算样本i到同簇其他样本的平均距离ai。a -
sklearn基于轮廓系数来选择n_clusters
2020-01-23 23:38:56通常使用绘制轮廓系数分布图和聚类后的数据分布图来选择最佳的n_clusters。 from sklearn.cluster import KMeans from sklearn.metrics import silhouette_samples, silhouette_score from sklearn.datasets import ... -
基于轮廓系数来选择n_clusters(Kmeans聚类分析)
2020-08-05 10:04:531、导库 from sklearn.cluster import KMeans from sklearn.metrics import silhouette_samples, silhouette_score import matplotlib.pyplot as plt ...# 想要知道每个聚出来的类的轮廓系数是多少,还想要一个.