MATLAB中评估K-means聚类准确率的可用函数咨询
MATLAB环境下K-means聚类效果评估实现方案
你构建的二维测试数据集由点坐标与真实簇标签两部分构成,每个样本点对应一组X/Y二维坐标与所属真实簇编号,数据集分布示例如下:
核心注意:K-means输出的簇标签是无语义的随机编号,和真实标签的数值不存在固定对应关系,不能直接逐元素对比数值计算准确率,必须先完成标签的最优映射对齐。
一、整体聚类标签匹配准确率计算
要统计K-means输出簇标签和真实标签匹配的样本占比,按以下步骤实现:
- 基于预测标签和真实标签构建簇间混淆矩阵
- 用匈牙利(Munkres)算法求解标签的最优映射关系,最大化匹配正确的样本数
- 将预测标签按映射关系转换为和真实标签同编号规则的标签,再逐元素对比计算准确率
首先约定变量规则:
X:n×2矩阵,存储所有样本点的X、Y坐标true_labels:n×1向量,存储每个样本对应的真实簇标签pred_labels:n×1向量,为kmeans函数返回的第一个输出参数,即K-means输出的簇分配结果
参考实现代码
% 统计簇总数 cluster_num = length(unique(true_labels)); % 构建混淆矩阵 confusion_mat = zeros(cluster_num, cluster_num); for i = 1:cluster_num for j = 1:cluster_num confusion_mat(i,j) = sum(pred_labels == i & true_labels == j); end end % 调用内置matchpairs求解最优匹配,无该函数可替换为公开极简匈牙利算法实现 [match_pair, ~] = matchpairs(-confusion_mat, 1e6); % 映射预测标签到真实标签编号体系 mapped_pred = zeros(size(pred_labels)); for i = 1:size(match_pair,1) mapped_pred(pred_labels == match_pair(i,1)) = match_pair(i,2); end % 计算最终准确率 cluster_acc = sum(mapped_pred == true_labels) / length(true_labels); fprintf('K-means聚类标签匹配准确率为:%.2f%%\n', cluster_acc*100);
补充:如果需要快速计算聚类结果和真实划分的相似度,也可以直接调用
adjustedRandIndex(pred_labels, true_labels)得到调整兰德指数,该指标取值范围为[-1,1],越接近1说明聚类结果和真实划分越一致,不需要做标签对齐,但该指标不属于「正确样本占比」形式的准确率。
二、指定坐标点是否同簇的校验
校验两个指定坐标点是否被分到同一簇时,不需要做标签对齐——因为同一簇的样本无论被分配什么编号,对应的预测标签值一定相同,只需先找到两个点在数据集中的对应索引,再对比索引对应的预测标签即可。
参考实现代码
% 待校验的两个点坐标 point_a = [7.200592168, 11.73878455]; point_b = [6.951107307, 11.27498898]; % 浮点数匹配设置容差,避免存储精度误差导致匹配失败 match_tol = 1e-6; % 查找两个点在数据集中的索引 idx_a = find(abs(X(:,1)-point_a(1)) < match_tol & abs(X(:,2)-point_a(2)) < match_tol, 1); idx_b = find(abs(X(:,1)-point_b(1)) < match_tol & abs(X(:,2)-point_b(2)) < match_tol, 1); % 对比标签判断是否同簇 if pred_labels(idx_a) == pred_labels(idx_b) disp('两个指定点被分配至同一簇'); else disp('两个指定点被分配至不同簇'); end
注意:浮点数坐标禁止直接用==做相等判断,必须设置合理容差,否则大概率会因为计算过程中的精度截断找不到对应样本。
内容的提问来源于stack exchange,提问作者lpad ze
相关产品推荐
相关产品推荐

