2015-04-22 5 views
1

J'ai créé un système CBIR dans MATLAB et j'ai utilisé la mesure de similarité comme la distance euclidienne. En utilisant ceci pour chaque image de requête, je récupère les 20 images les plus importantes.Calculer la précision et rappeler sur la base de données WANG

J'ai utilisé WANG Dataset pour tester mon système.
Il contient 10 classes (comme les Africains, les Bus, les Roses, etc.) contenant chacune 100 images (1000 images au total).

Ma méthode:
1. J'utilise corrélogramme, Matrix Cooccurrence (CCM) et la différence entre modèle de balayage des pixels (DBPSP) pour la construction de mon vecteur (64 + 196 + 28 = 288 dimensions respectivement).

  1. Chacune des images de 1000 db dont j'ai déjà construit le vecteur.
  2. Maintenant une image de requête vient et je construis aussi son vecteur (228 dimensions à nouveau).
  3. J'utilise la distance euclidienne pour la similarité et le tri des vecteurs d'image db dans l'ordre décroissant de leur distance euclidique.
  4. Les 20 premiers résultats sont affichés.

  5. Dans ces 20 je peux avoir TP ou FP.

Pour une seule image de requête que je peux facilement calculer précision et de rappel et de terrain PR-courbe en utilisant ce link.

Comment puis-je faire la même chose pour toute la classe?

Mon approche: Pour chaque image appartenant à la classe A, retrouvez les 20 images les plus importantes et c'est respectivement TP (vrais positifs) et FP (faux positifs).

 TP FP 

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

Précision de classe A = 1500/(2000) = .75 (Est-il juste ??)
Rappel de la classe A ---> Coincé ??
PR-Curve ----> Stuck ?? Certains liens disent que j'ai besoin d'un classificateur pour cela et d'autres pas ... Je suis vraiment confus.

+0

Avez-vous la matrice de confusion ou avez-vous seulement le TP/FP? – krisdestruction

+0

Uniquement TP et FP. Sur 20 images si l'image appartient à la classe correcte, j'augmente TP d'une unité et sinon j'augmente FP d'une unité. Comment puis-je vérifier qu'une image est de bonne classe est simple que les images de classe A sont de 0 à 99, puis les classes B sont de 100 à 199 et ainsi de suite. Donc une simple boucle if-else me donne la réponse. – CoderBoy

+0

gahh d'accord ma solution ne fonctionnera pas alors :( – krisdestruction

Répondre

2

Ainsi que vous l'avez noté, vous pouvez calculer la précision comme suit. Cependant, vous devez avoir FN ou le nombre total de falses pour calculer le rappel. Comme discussed in chat, vous devez trouver un moyen de déterminer vos données FN et FP. Ensuite, vous pouvez utiliser la formule suivante pour calculer le rappel.

R = TP ./ (TP + FN) 

Si vous avez la matrice de confusion ou de données, vous pouvez utiliser mon confusionmat2f1.m sur mesure pour calculer la précision, le rappel et f1 marquer. Cela suppose que la matrice de confusion est formatée comme Matlab defines it. Une explication de chaque ligne est en ligne. S'il vous plaît laissez-moi savoir si vous voulez plus de précisions.

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

Comment puis-je calculer FN et TN? La seule opération que je peux faire est de prendre une image et de trouver les 20 premières images puis sur 20 images si l'image appartient à la classe correcte augmente TP par un et sinon j'augmente FP par un Est-ce que je peux le faire sans utiliser de classificateur? Si non, pouvez-vous suggérer certains intégré dans MATLAB? – CoderBoy

+0

Pour FN, ce sont ceux qui sont classés comme non, mais qui sont en fait Oui. ceux qui sont classés comme non, et sont en fait non Vous avez besoin de 4 des 6 variables (TN, FN, TP, FP, total vrai, total faux) pour calculer la précision et rappel. Vous devez réécrire votre code pour tenir compte de l'une des variables, mais je vous suggère de créer une matrice de confusion à la place. Cela rend l'analyse tellement plus facile :) – krisdestruction

+0

Ce n'est pas difficile non plus. Tant que vous savez ce que classent les classes, et quelle est la vérité fondamentale (ce qu'elle est censée être), vous pouvez l'introduire dans la fonction confusionmat. – krisdestruction