2015-04-22 89 views
1

我在MATLAB中制作了一个CBIR系统,并使用相似性度量作为欧氏距离。 使用此为每个查询图像我检索前20名图像。计算王数据库的精度和召回率

我用WANG Dataset来测试我的系统。
它包含10个类(如非洲人,公交车,玫瑰等),每个包含100个图像(共1000张图像)。我使用相关图,共现矩阵(CCM)和像素扫描模式(DBPSP)之间的区别来构建我的矢量(分别为64 + 196 + 28 = 288尺寸)。

  1. 1000 db图像的每一个我都事先构建了它的向量。
  2. 现在查询图像来了,我也构造它的矢量(再次228维)。
  3. 我使用欧几里德距离来进行相似性处理,并按照其欧几里德距离的降序对db图像向量进行排序。
  4. 显示前20条结果。

  5. 在那20我可以有TP或FP。

对于单个查询图像,我可以很容易地计算出精确度和召回,并使用该link情节PR-曲线。

我该怎么做全班同班同学?

我的方法:对于属于A类的每幅图像,找到前20幅图像,它分别是TP(真正的正片)和FP(假正片)。

 TP FP 

Image1 17 3 
Image2 15 5 
... 
... 
Image100 10 10 
Total 1500 500 

类的精密A = 1500 /(2000)= 0.75(是不是?)
召回一类--->的滞留??
PR曲线---->卡住??有些链接说我需要一个分类器,有些则不是......我真的很困惑。

+0

您是否有混淆矩阵,或者您只有TP/FP? – krisdestruction

+0

只有TP和FP。如果图像属于正确的类别,则在20张图像中,我将TP增加1,如果不是,则将FP增加1。如何检查图像的类别是否正确非常简单,因为A类图像的范围是0-99,然后B类的范围是100-199,依此类推。所以一个简单的if-else循环给了我答案。 – CoderBoy

+0

gahh好吧我的解决方案不会工作然后:( – krisdestruction

回答

2

所以,正如你所说,你可以计算精度如下。

P = TP ./ (TP + FP); 

但是,您需要具有FN或计算召回总失败次数。由于discussed in chat,你需要找到一种方法来确定你的FN和FP数据。然后你可以使用下面的公式来计算召回。

R = TP ./ (TP + FN) 

如果有混淆矩阵或数据,你可以使用我的自定义confusionmat2f1.m计算精度,召回,和F1值。这假定混淆矩阵被格式化为Matlab defines it。每行的解释都是内联的。请让我知道,如果你想更多的澄清。

function [F,P,R] = confusionmat2f1(C) 
    %% confusionmat2f1(C) 
    % 
    % Inputs 
    % C - Confusion Matrix 
    % 
    % Outputs 
    % F - F1 score column vector 
    % P - Precision column vector 
    % R - Recall column vector 

    %% 

    % Confusion Matrix to Probability 
    M = sum(C, 3); 

    % Calculate Precision 
    P = diag(M) ./ sum(M,1)'; 

    % Calculate Recall 
    R = diag(M) ./ sum(M,2); 

    % Calculate F1 Score 
    F = f1(P, R); 
+0

如何计算FN和TN?我能做的唯一操作是拍摄一幅图像,然后查找20幅图像中的前20幅图像,如果图像属于正确的类别,则将TP增加1,如果不是,则增加FP 如果不使用分类器,我不能做到这一点吗?如果不是,您可以建议一些内置的MATLAB? – CoderBoy

+0

对于FN,那些被分类为no,但实际上是yes的,对于TN,这些是那些被归类为否,并且实际上是否定的。你需要6个变量中的4个(TN,FN,TP,FP,总真,总假)来计算精度和召回。您需要重写代码来解释其中一个变量,但我建议您改为创建一个混淆矩阵。它使分析更容易:) – krisdestruction

+0

这也不难。只要你知道这些类被归类为什么,以及基本事实(它应该是什么),你可以将它提供给'confusionmat'函数。 – krisdestruction

相关问题