聚類外部評價指標(F-Measure、Entropy、Purity)及matlab實現
阿新 • • 發佈:2018-11-21
本文參考:
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