聚類效果評測-Fmeasure和Accuracy及其Matlab實現


聚類結果的好壞,有很多種指標,其中F-Measue即F值是常用的一種,其中包括precision(查准率或者准確率)和recall(查全率或者召回率)。

F-Measue是信息檢索中常用的評價標准。

F-Measue的公式如下:

\[{{F}_{\beta }}=\frac{\left( {{\beta }^{2}}+1 \right)P\cdot R}{{{\beta }^{2}}\cdot P+R}\]

其中${\beta}$是參數,P是precision,R是reacll。通常${\beta}$取1,即:

\[F=\frac{2\cdot P\cdot R}{P+R}\]

設人工標記的分類簇為${{P}_{j}}$,聚類算法分類簇為${{C}_{i}}$ 

 precision、recall個人感覺准確率和查全率翻譯的更方便理解些。

                                                                     

precision(查准率或者准確率):

\[P({{P}_{j}},{{C}_{i}})=\frac{\left| {{P}_{j}}\cap {{C}_{i}} \right|}{\left| {{C}_{i}} \right|}\]

recall(查全率或者召回率):

\[R({{P}_{j}},{{C}_{i}})=\frac{\left| {{P}_{j}}\cap {{C}_{i}} \right|}{\left| {{P}_{j}} \right|}\]

F-Measure:

\[F\left( {{P}_{j}},{{C}_{i}} \right)=\frac{2\times P({{P}_{j}},{{C}_{i}})\times R\left( {{P}_{j}},{{C}_{i}} \right)}{P\left( {{P}_{j}},{{C}_{i}} \right)+R\left( {{P}_{j}},{{C}_{i}} \right)}\]

獲得一個矩陣,不同於信息檢索的是F-Measure有多個,並且人工標記簇的個數和聚類算法得到的簇個數不一定相等。

                                                          

若已人工標記的簇${{P}_{j}}$為基准,則聚類算法結果越接近人工標記的結果效果越好。也是推薦使用的指標

針對每一個人工標記的${{P}_{j}}$選擇${{C}_{i}}$中最接近的作為其F值:

\[F\left( {{P}_{j}} \right)=\underset{1\le i\le m}{\mathop{\max }}\,F({{P}_{j}},{{C}_{i}})\]

然后對所得到的F值進行加權平均,得到最終的一個直觀的F值

\[F=\sum\limits_{j=1}^{S}{{{w}_{j}}\cdot F\left( {{P}_{j}} \right)},\ {{w}_{j}}=\frac{\left| {{P}_{j}} \right|}{\sum\limits_{i=1}^{s}{\left| {{P}_{i}} \right|}}=\frac{\left| {{P}_{j}} \right|}{n}\]

代碼:

function [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;
end

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM