Matlab实现Kmeans聚类,并利用匈牙利算法Kuhn-Munkres实现对聚类标签和真实标签的映射,对结果进行聚类精度Accuracy评价和标准互信息Nmi评价

思路

  1. 利用Kmeans算法对数据进行聚类,生成聚类结果
  2. 将聚类结果的标签和真实标签进行映射,生成映射后标签
  3. 利用映射后标签和真实标签进行计算Accuracy值
  4. 利用聚类结果标签和真实标签计算Nmi值

输入数据为经典MNIST数据集

MNIST数据集是机器学习领域中非常经典的一个数据集,由60000个训练样本和10000个测试样本组成,每个样本都是一张28 * 28像素的灰度手写数字图片。
我们选取MNIST数据集中的10类共3000条数据为例。

  • 数据下载网址:http://yann.lecun.com/exdb/mnist/

利用Matlab中Kmeans算法对数据进行聚类

clc,clear;
load E:\2019\机器学习\实验一\data\MNIST;
opts = statset('Display','final');
K=10;           %将X划分为K类
repN=50;        %迭代次数
%K-mean聚类
[Idx,Ctrs,SumD,D] = kmeans(X,K,'Replicates',repN,'Options',opts);

聚类精度Acc评价

聚类精度(Acc):给定一个聚类结果标签 和其对应的指示标签 ,Acc计算公式如下:
在这里插入图片描述
其中:
在这里插入图片描述在这里插入图片描述
map(oi)是一个映射函数,它以真实标签 gi作为参考标签,然后按照相同的排列方式oi中的标签顺序进行重排。因此, map(oi)是用来解决标签不一致问题。通常可采用经典的Kuhn-Munkres算法实现 的重排。

标准互信息NMI评价

标准互信息(NMI):互信息(MI)是一种堆成的度量方式,他可以衡量两种分布之间相互依赖程度,判断两种分布的一致性。设 cp表示真实标签 c中的第gi 类,c’q表示oi中的第 q类,则对应的MI可定义为:
在这里插入图片描述
其中k和k’分别表示真实标签和聚类标签对应的类别数。np表示类别cp包含的样本数,n’q表示类别c’q中包含的样本数,npq表示同时出现在类别cp和c’q中的样本数,那么标准互信息可以定义为:
在这里插入图片描述
其中H(g)是熵函数。根据上述两式,有:
在这里插入图片描述

利用Kuhn-Munkres算法实现munkres方法

匈牙利算法很经典,一般用来解决最优分配问题,这里从Matlab论坛上找到一个比较好的实现,网上有很多帖子对匈牙利算法的原理讲的都很不错,这里推荐一个详细官方英文文档讲解:匈牙利算法官网英文文档

function [assignment] = munkres(costMat)
% MUNKRES   Munkres Assign Algorithm
%
% [ASSIGN,COST] = munkres(COSTMAT) returns the optimal assignment in ASSIGN
% with the minimum COST based on the assignment problem represented by the
% COSTMAT, where the (i,j)th element represents the cost to assign the jth
% job to the ith worker.
%
 
% This is vectorized implementation of the algorithm. It is the fastest
% among all Matlab implementations of the algorithm.
 
% Examples
% Example 1: a 5 x 5 example
%{
   
[assignment,cost] = munkres(magic(5));
[assignedrows,dum]=find(assignment);
disp(assignedrows'); % 3 2 1 5 4
disp(cost); %15
%}
% Example 2: 400 x 400 random data
%{
   
n=5;
A=rand(n);
tic
[a,b]=munkres(A);
toc                
%}
 
% Reference:
% "Munkres' Assignment Algorithm, Modified for Rectangular Matrices",
% http://csclab.murraystate.edu/bob.pilgrim/445/munkres.html
 
% version 1.0 by Yi Cao at Cranfield University on 17th June 2008
 
assignment = false(size(costMat));
 
costMat(costMat~=costMat)=Inf;
validMat = costMat<Inf;
validCol = any(validMat);
validRow = any(validMat,2);
 
nRows = sum(validRow);
nCols = sum(validCol);
n = max(nRows,nCols);
if ~n
    return
end
     
dMat = zeros(n);
dMat(1:nRows,1:nCols) = costMat(validRow,validCol);
 
%*************************************************
% Munkres' Assignment Algorithm starts here
%********************************<
  • 14
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值