MATLAB聚类评价指标计算


发现网上很少关于MATLAB聚类评价指标如CHI、DBI以及轮廓系数的计算,其实使用一个内置函数就搞定了,但是看到很多人在重复造轮子。

evalclusters()函数

用法:

eva= evalclusters(data,clust,'xxx');

data:不带标签的原始数据。
clust:聚类后的标签,参数可以是字符串或者矩阵,字符串了话就要写matlab规定的聚类算法,比如’kmeans’。如果你用的不是matlab自带的聚类算法去聚类的,而是想评估自己写的聚类算法性能,那么clust就填写你聚类结果的标签矩阵 Label (标签) 就行了,比如你的数据data是NM的,N是样本个数,M是特征维数。那么标签矩阵 Label (标签) 就是N1的矩阵,代表聚类后每个样本的标签,这样就可以输出评估结果了。
‘xxx’:可以选择四种评价指标:’CalinskiHarabasz’ | ‘DaviesBouldin’ | ‘ gap (差距) ’ | ‘silhouette’
‘CalinskiHarabasz’: Calinski-Harabasz index (指数) (CHI,越大越好)
‘DaviesBouldin’: Davies-Bouldin index (指数) (用的最多,越小越好)
‘ gap (差距) ’: gap (差距) statistic (统计) (越大越好)
‘silhouette’: silhouette coefficient (SC,轮廓系数,越大越好)

MATLAB代码

附件一.xlsx

代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
clear
clc

% kmeans聚类中有效性评价指标测试

% 问题一
Data = xlsread('附件1.xlsx');
% 数据标准化处理
Data1 = Data(2:426,2:3349);
% 建立空数组
arzs = zscore(Data1);
% 使用kmeans聚类函数
[ind,C]=kmeans(arzs,4);

data = Data1;
label = ind; % 真实标签

eva_DBI_1= evalclusters(data,label,'DaviesBouldin');
eva_SC_1= evalclusters(data,label,'silhouette');
eva_CHI_1= evalclusters(data,label,'CalinskiHarabasz');

% 这三个变量即为结果
DBI_1 = eva_DBI_1.CriterionValues; % 越小越好
SC_1 = eva_SC_1.CriterionValues; % 越大越好
CHI_1 = eva_CHI_1.CriterionValues; % 越大越好

运行结果

1
2
3
DBI_1 = 0.614370044401414; % 越小越好
SC_1 = 0.724336668984950; % 越大越好
CHI_1 = 1.298586390458516e+03; % 越大越好

参考

  1. https://www.mathworks.com/help/stats/evalclusters.html
  2. https://www.cnblogs.com/kailugaji/p/16169796.html

评论