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