聚类算法的评价指标——轮廓系数

Posted 雨露笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聚类算法的评价指标——轮廓系数相关的知识,希望对你有一定的参考价值。

轮廓系数的定义:

对于样本集中的样本i:

1.计算i到簇内个样本的相异度的平均值,即i样本的内聚度,记ai;

2.计算i到其他簇的相异度的平均值的最小值,即i样本的分离度,记bi;

3.定义样本i的轮廓系数:

si = (bi - ai) / max{ai,bi}

定义样本集的总体轮廓系数为:

s = avg(si)

si和s的值域落在(-1,1)区间,并且越接近1,表示算法聚类效果越好。


轮廓系数实现代码:


float MyKMeans::Silhouette(vector<Sample> Samples)

{

float s = 0.0; // 样本集的轮廓系数

vector<float> S(Samples.size()); // 各个样本的轮廓系数

for (size_t i = 0; i < Samples.size(); i++)

{

float a = 0.0; // 样本i到簇内其他样本的距离的平均值,即样本i的内聚度

float b = 0.0; // 样本i到其他簇距离的平均值的最小值,即样本i的分离度

vector<float> B(m_k, 0); // 记录样本i到各簇样本的距离之和

vector<float> C(m_k, 0); // 记录各簇的样本数量

for (Sample other : Samples)

{

B[other.cluster] += m_dissimilarityRule->calculateDissimilarity(Samples[i], other);

C[other.cluster]++;

}

a = B[Samples[i].cluster] / C[Samples[i].cluster];

float min_b = FLT_MAX; // 样本i到其他簇距离之和的最小值

int min_c; // min_b对应簇的样本数量

for (size_t j = 0; j < B.size(); j++)

{

if (j != Samples[i].cluster && min_b > B[j])

{

min_b = B[j];

min_c = j;

}

}

b = min_b / C[min_c];


S[i] = (b - a)/max(a,b);

}

s = std::accumulate(std::begin(S), std::end(S), 0.0) / S.size();


return s;

}


下载Iris数据集进行测试,Iris数据集包含3类样本(Iris-setosa、Iris-versicolor、Iris-virginica)共150个样本,每个样本包含4个属性:花萼长、花萼宽、花瓣长、花瓣宽,单位均为厘米。使用分段随机规则下的k-means算法对样本集进行聚类,分别测试k为2、3、4、5、6、7情况下的轮廓系数。测试结果如下

由图可见,当k为2时,聚类效果最好,其次为k等于3。将聚类结果与原始数据比对,发现类型为Iris-setosa的样本识别率较高,而类型为Iris-virginica和Iris-versicolor的样本识别率较低。按照k-means以距离远近作为样本相异度的测量原则,Iris-virginica类型与Iris-versicolor的相似度明显偏高,而Iris-setosa类型与其他两种类型的相似度明显偏低。因此在k-means算法的结果中,k为2表现出来的聚类效果优于k为3的聚类效果。


参考资料:

https://en.wikipedia.org/wiki/Silhouette_(clustering)

http://archive.ics.uci.edu/ml/datasets/Iris


以上是关于聚类算法的评价指标——轮廓系数的主要内容,如果未能解决你的问题,请参考以下文章

sklearn聚类算法评估方法 之各种系数

聚类算法(相似度与性能度量)

-聚类算法

基于轮廓系数的高维数据K-Means聚类算法处理

机器学习——聚类算法

常用的聚类算法及聚类算法评价指标