轮廓系数是评估聚类效果的一个常用指标,它衡量了样本与其所在簇内其他样本的紧密程度(通过内聚系数表示)与它所属簇与其他簇中样本的紧密程度(通过分离系数表示)之间的权衡。在MATLAB中,我们可以使用silhouette_coefficient函数来计算轮廓系数。以下是对该函数的详细解释和使用方法。
函数概述
该函数的输入包括两个主要参数:
X: 一个矩阵,其中包含了每个样本的特征向量。labels: 一个向量,表示每个样本的标签。
该函数输出两个矩阵:
S: 一个向量,包含了所有样本的轮廓系数。B: 一个向量,表示每个样本到其聚类中心的距离。
代码分析
首先,让我们逐步分析silhouette_coefficient函数的代码。
function [S, B] = silhouette_coefficient(X, labels)
% X: 被标记的样本特征矩阵
% labels: 每个样本的标记标签向量
% 计算样本之间的距离
D = pdist(X);
% 初始化轮廓系数
S = zeros(size(labels));
% 初始化样本的聚类中心距离
B = zeros(size(labels));
% 遍历每个样本
for i = 1:length(labels)
% 当前样本的聚类中心
cluster_center = mean(X(labels == labels(i), :), 1);
% 计算当前样本到聚类中心的距离
B(i) = norm(X(i, :) - cluster_center);
% 计算当前样本与其他样本的轮廓系数
for j = 1:length(labels)
if i ~= j
S(i) = S(i) + (B(i) - min(B(i), B(j))) / max(B(i), B(j));
end
end
S(i) = S(i) / (length(labels) - 1);
end
end
计算样本之间的距离:使用
pdist函数计算X矩阵中所有样本之间的距离,得到一个距离矩阵D。初始化轮廓系数和聚类中心距离:初始化
S和B为与labels相同大小的零向量。遍历每个样本:
- 对于每个样本,找到它所属的簇的所有样本,并计算簇的中心(即该簇样本的平均特征)。
- 计算当前样本到其聚类中心的距离,并存储在
B中。 - 对于当前样本的每个非同簇样本,更新轮廓系数
s,其计算公式为(B(i) - min(B(i), B(j))) / max(B(i), B(j))。这是通过计算样本与其所在簇中心距离与它到最近非同簇样本距离之差,然后除以它们距离的最大值得到的。 - 将计算出的轮廓系数
s除以length(labels) - 1,这是为了避免将轮廓系数计算在样本之间重复计算。
使用方法
使用上述函数的方法非常简单:
- 将上述代码保存为
silhouette_coefficient.m文件。 - 在MATLAB中,你可以通过以下方式调用该函数:
% 示例数据
X = rand(100, 2); % 100个样本,每个样本有2个特征
labels = randi([1, 3], 100, 1); % 每个样本的标签在1到3之间随机生成
% 计算轮廓系数
[S, B] = silhouette_coefficient(X, labels);
% 查看轮廓系数的平均值
meanSilhouette = mean(S);
disp(['平均轮廓系数: ', num2str(meanSilhouette)]);
这段代码将创建100个具有两个特征的随机样本,并随机分配给它们1到3的标签。然后,它使用silhouette_coefficient函数计算轮廓系数,并打印出平均轮廓系数,这可以作为聚类效果的指标。
