zoukankan      html  css  js  c++  java
  • 聚类效果评测-Fmeasure和Accuracy及其Matlab实现

    聚类结果的好坏,有很多种指标,其中F-Measue即F值是常用的一种,其中包括precision(查准率或者准确率)和recall(查全率或者召回率)。

    F-Measue是信息检索中常用的评价标准。

    F-Measue的公式如下:

    [{{F}_{eta }}=frac{left( {{eta }^{2}}+1 ight)Pcdot R}{{{eta }^{2}}cdot P+R}]

    其中${eta}$是参数,P是precision,R是reacll。通常${eta}$取1,即:

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

    设人工标记的分类簇为${{P}_{j}}$,聚类算法分类簇为${{C}_{i}}$ 

     precision、recall个人感觉准确率和查全率翻译的更方便理解些。

                                                                         

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

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

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

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

    F-Measure:

    [Fleft( {{P}_{j}},{{C}_{i}} ight)=frac{2 imes P({{P}_{j}},{{C}_{i}}) imes Rleft( {{P}_{j}},{{C}_{i}} ight)}{Pleft( {{P}_{j}},{{C}_{i}} ight)+Rleft( {{P}_{j}},{{C}_{i}} ight)}]

    获得一个矩阵,不同于信息检索的是F-Measure有多个,并且人工标记簇的个数和聚类算法得到的簇个数不一定相等。

                                                              

    若已人工标记的簇${{P}_{j}}$为基准,则聚类算法结果越接近人工标记的结果效果越好。也是推荐使用的指标

    针对每一个人工标记的${{P}_{j}}$选择${{C}_{i}}$中最接近的作为其F值:

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

    然后对所得到的F值进行加权平均,得到最终的一个直观的F值

    [F=sumlimits_{j=1}^{S}{{{w}_{j}}cdot Fleft( {{P}_{j}} ight)}, {{w}_{j}}=frac{left| {{P}_{j}} ight|}{sumlimits_{i=1}^{s}{left| {{P}_{i}} ight|}}=frac{left| {{P}_{j}} ight|}{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
    

      

  • 相关阅读:
    (转载)SAPI 包含sphelper.h编译错误解决方案
    C++11标准的智能指针、野指针、内存泄露的理解(日后还会补充,先浅谈自己的理解)
    504. Base 7(LeetCode)
    242. Valid Anagram(LeetCode)
    169. Majority Element(LeetCode)
    100. Same Tree(LeetCode)
    171. Excel Sheet Column Number(LeetCode)
    168. Excel Sheet Column Title(LeetCode)
    122.Best Time to Buy and Sell Stock II(LeetCode)
    404. Sum of Left Leaves(LeetCode)
  • 原文地址:https://www.cnblogs.com/zhangduo/p/4504879.html
Copyright © 2011-2022 走看看