1. 程式人生 > >聚類外部評價指標(F-Measure、Entropy、Purity)及matlab實現

聚類外部評價指標(F-Measure、Entropy、Purity)及matlab實現

本文參考:
1.https://www.cnblogs.com/zhangduo/p/4504879.html
2.https://blog.csdn.net/vernice/article/details/46467449?utm_source=blogxgwz8
一、簡介介紹
聚類中的外部評價指標如下圖:
在這裡插入圖片描述
其中上圖中的Ni(i=1…k)表示所使用方法聚類之後K類具有的個數,Nj表示K類中的標記個數
1.熵、純度介紹參照
https://www.cnblogs.com/zhangduo/p/4504879.html
2.F-Measure介紹參照
https://blog.csdn.net/vernice/article/details/46467449?utm_source=blogxgwz8


二、matlab實現
1.Entropy,Purity,FMeasure,Accuracy 返回函式

function [Entropy,Purity,FMeasure,Accuracy] = Fmeasure(P,C)
% P為人工標記簇
% C為聚類演算法計算結果
N = length(C);% 樣本總數
p = unique(P);
c = unique(C);
P_size = length(p);% 人工標記的簇的個數
C_size = length(c);% 演算法計算的簇的個數
% Pid,Rid:非零資料:第i行非零資料代表的樣本屬於第i個簇
Pid = double(ones(P_size,1)*P == p'*ones(1,N) );
Cid = double(ones(C_size,1)*C == c'*ones(1,N) );
CP = Cid*Pid';%P和C的交集,C*P
Pj = sum(CP,1);% 行向量,P在C各個簇中的個數
Ci = sum(CP,2);% 列向量,C在P各個簇中的個數

precision = CP./( Ci*ones(1,P_size) );
recall = CP./( ones(C_size,1)*Pj );
F = 2*precision.*recall./(precision+recall);
% 得到一個總的F值
FMeasure = sum( (Pj./sum(Pj)).*max(F) );
Accuracy = sum(max(CP,[],2))/N;
%得到聚類效果 Entropy和Purity
C_i=Ci';
[e1 p1]=EnAndPur(CP ,C_i);
Entropy=e1;
Purity=p1;
end

2.熵、純度matlab程式

%% 計算聚類效果熵與純度 輸入的矩陣為 CP:演算法聚類與實際類別得到的資料的交集
%Ci 演算法聚類得到的每個類別的總數
function [Entropy Purity]=EnAndPur(CP,Ci)
%得到行列值
[rn cn]=size(PC);
%% 計算熵
%計算概率 precision
for i=1:rn
    for j=1:cn
     precision(i,j)=PC(i,j)/Ci(1,i);    
    end
end
%計算ei(i,j)
for i=1:rn
    for j=1:cn
     ei(i,j)=precision(i,j)*log2(precision(i,j));    
    end
end
%
%計算ei_sum
for i=1:rn
    ei_sum(i)=-nansum(ei(i,:));
end
%計算mi*ei_sum(i)
for j=1:cn
    mmi(j)=Ci(1,j)*ei_sum(j);
end
%計算entropy
Entropy=nansum(mmi)/nansum(Ci);
%% 計算純度Purity
%找出最大的一類
for i=1:rn
     pr_max(i)=max(precision(i,:));    
end
%計算類別數量
for j=1:cn
    nni(j)=Ci(1,j)*pr_max(j);
end
Purity=nansum(nni)/nansum(Ci);
end