轮廓系数matlab代码
时间: 2023-11-17 22:07:25 浏览: 23
轮廓系数(Silhouette Coefficient)是一种用于评估聚类质量的指标,其值越大则聚类效果越好。其计算公式为:
s(i) = (b(i) - a(i)) / max{a(i), b(i)}
其中,a(i) 表示样本 i 与其所属簇中其他样本的平均距离,b(i) 表示样本 i 与其最近的其他簇中的所有样本的平均距离。
以下是一个简单的 MATLAB 代码实现:
```matlab
function s = silhouette(X, C)
% X: 样本数据,每行表示一个样本
% C: 样本所属簇的编号
% s: 每个样本的轮廓系数
K = max(C); % 簇的个数
n = size(X, 1); % 样本总数
s = zeros(n, 1);
% 计算每个样本与其所属簇中其他样本的平均距离
for i = 1:K
idx = find(C == i); % 第 i 个簇中的样本编号
m = length(idx); % 第 i 个簇中的样本数
if m == 1
s(idx) = 0; % 如果簇中只有一个样本,则轮廓系数为 0
else
D = pdist2(X(idx,:), X(idx,:)); % 簇中样本间的距离矩阵
a = sum(D, 2) / (m - 1); % 样本 i 与其所属簇中其他样本的平均距离
% 计算样本 i 与其他簇中样本的平均距离
b = zeros(m, 1);
for j = 1:n
if C(j) ~= i % 不属于第 i 个簇的样本
d = sum((X(j,:) - X(idx,:)).^2, 2);
b = b + sqrt(d);
end
end
b = b / (n - m);
% 计算轮廓系数
s(idx) = (b - a) ./ max(a, b);
end
end
end
```
使用示例:
```matlab
load fisheriris; % 加载鸢尾花数据集
X = meas; % 样本数据
K = 3; % 簇的个数
C = kmeans(X, K); % 聚类
s = silhouette(X, C); % 计算轮廓系数
mean(s) % 输出平均轮廓系数,越接近 1 聚类效果越好
```