2

Предполагая, что у меня есть набор данных следующих размеров:Невозможно выяснить заземляющий правду databased при расчете среднего Средний Precision Recall с помощью Matlab

train = 500,000 * 960 %number of training samples (vector) each of 960 length 

B_base = 1000000*960 %number of base samples (vector) each of 960 length 


Query = 1000*960 %number of query samples (vector) each of 960 length 

truth_nn = 1000*100 

truth_nn содержит соседей подспутниковых в виде предварительно вычисленные k ближайших соседей и их квадратное евклидово расстояние. Итак, столбцы truth_nn представляют ближайших соседей k = 100. Мне трудно применить поиск ближайшего соседа в фрагменте кода. Может кто-нибудь, пожалуйста, покажите, как применять наземные истинные соседи truth_nn в поиске средней средней точности-отзыва?

Это будет огромная помощь, если кто-нибудь может показать любой маленький пример, создав любую матрицу данных, матрицу запросов и земные истинные соседи в виде предварительно вычисленных k ближайших соседей и их квадратного евклидова расстояния. Я попытался создать образец базы данных.

Предположим, база данных

B_base = [1 1; 2 2; 3 2; 4 4; 5 6]; 

данных запроса

Query = [1 1; 2 1; 6 2]; 

[neighbors distances] = knnsearch(a,b,'k',2); 

бы найти 2 ближайших соседей.

Вопрос 1: как создать данные об истине, содержащие наземные соседи правды и предварительно вычисленные k ближайших соседних расстояний? Это называется средним средним значением точности. Я попытался реализации knearest поиска соседа и средней точности вспомнить, как следует, но не может понять (неуверенный) как применить таблицу подспутниковых

Вопрос 2:

Я пытаюсь применить k ближайшего поиска соседа путем преобразования первого вещественные функции в двоичные.

Я не могу применить понятие поиска k-ближайшего соседа для разных значений k = 10,20,50 и проверить, сколько данных было правильно вызвано с использованием базы данных GIST. В файле GIST truth_nn(), когда я задаю truth_nn(i,1:k) для вектора запроса i, функция AveragePrecision выдает ошибку. Итак, если кто-то может показать с использованием любой примерной истины, которая имеет такую ​​же структуру, что и в GIST, как правильно указать k и вычислить отзыв средней точности, тогда я смогу применить решение к базе данных GIST. На данный момент это мой подход и будет иметь огромную помощь, если правильный способ предоставляется с использованием любого примера, который будет легче для меня связать с базой данных GIST. Проблема в том, как я могу найти соседей из истины земли и сравнить ее с соседями, полученными после сортировки расстояний?

Меня также интересует, как я могу применить pdist2() вместо настоящего расписания, поскольку это занимает много времени.

numQueryVectors = size(Query,1); 
     %Calculate distances 
    for i=1:numQueryVectors, 
     queryMatrix(i,:) 
     dist = sum((repmat(queryMatrix(i,:),numDataVectors,1)-B_base).^2,2); 
    [sortval sortpos] = sort(dist,'ascend'); 
     neighborIds(i,:) = sortpos(1:k); 
    neighborDistances(i,:) = sqrt(sortval(1:k)); 
    end 


     %Sorting calculated nearest neighbor distances for k = 50 



%HOW DO I SPECIFY k = 50 in the ground truth, truth_nn 
for i=1:numQueryVectors 
    AP(i) = AveragePrecision(neighborIds(i,:),truth_nn(i,:)); 
end 
mAP = mean(AP); 


    function ap = AveragePrecision(rank_id, truth_id) 
    truth_num = length(truth_id); 


truth_pos = zeros(truth_num,1); 

for j=1:50 %% for k = 50 nearest neighbors 
    truth_pos(j) = find(rank_id == truth_id(j)); 
end 
truth_pos = sort(truth_pos, 'ascend'); 

% compute average precision as the area below the recall-precision curve 
ap = 0; 
delta_recall = 1/truth_num; 
for j=1:truth_num 
    p = j/truth_pos(j); 
    ap = ap + p*delta_recall; 
end 

    end 
end 

UPDATE: на основе решения, я пытался вычислить среднюю среднюю точность, используя формулу, приводимую formula here и reference code. Но, не уверен, что мой подход правильный, потому что теория говорит, что мне нужно ранжировать возвращаемые запросы на основе индексов. Я не понимаю этого полностью. Среднее значение средней точности требуется для оценки качества поисковых алгоритмов.

precision = positives/total_data; 
recal = positives /(positives+negatives); 
precision = positives/total_data; 
recall = positives /(positives+negatives); 
truth_pos = sort(positives, 'ascend'); 
truth_num = length(truth_pos); 

ap = 0; 
delta_recall = 1/truth_num; 
for j=1:truth_num 
    p = j/truth_pos(j); 
    ap = ap + p*delta_recall; 
end 
ap 

Величина ар = бесконечности, значение положительных = 0 и негативов = 150. Это означает, что knnsearch() не работает.

+0

Как это отличается от других вопросов или ответов на эту тему? – beaker

+0

@beaker: В моем другом вопросе я спросил, как создать несколько хэш-таблиц для alogirhtm - Locality Sensitive Hashing. Затем я спросил, как я могу работать с базой данных GIST. В частности, я борюсь за то, как применять таблицу истины, состоящую из фактических меток и расстояния. Поскольку это был очень специфический вопрос, который я думал о том, чтобы задать общий, где я создал простой запрос и базовые данные. Теперь я не знаю, как я могу создать таблицу истины. Моя цель - применить поиск ближайшего соседа и оценить качество, используя метрику среднего значения точности. – SKM

+0

Чтобы применить средний отзыв точности, я считаю, что нам нужна наземная таблица истинности. В базе данных GIST есть один, но я не понимаю, как его использовать. Поэтому я прошу здесь помочь в демонстрации того, как применять основную истину в ближайшем соседе и вычислять среднее значение точности, с помощью любой тестовой наземной таблицы, которая имеет ту же структуру, что и в таблице истины базы данных GIST. – SKM

ответ

1

Я думаю, что вы делаете дополнительную работу. Этот процесс очень прост в Matlab, вы также можете работать со всеми массивами. Это должно быть быстрее, чем для циклов, и читать их немного легче.

Ваши truth_nn и neighbors должны иметь те же данные, если ошибок не имеется. В строке есть одна запись. Matlab уже сортирует результат kmeans в порядке возрастания, поэтому столбец 1 является ближайшим соседом, второй ближе всего к столбцу 2, третий ближе 3, .... Нет необходимости снова сортировать данные.

Для получения вашей статистики свяжитесь с truth_nn по факту: neighbors. Это простой пример, чтобы показать вам, как должна работать программа. Он не будет работать с вашими данными без какой-либо модификации.

%in your example this is provided, I created my own 
truth_nn = [1,2; 
      1,3; 
      4,3]; 

B_base = [1 1; 2 2; 3 2; 4 4; 5 6]; 
Query = [1 1; 2 1; 6 2]; 

%performs k means 
num_clusters = 2; 
[neighbors distances] = knnsearch(B_base,Query,'k',num_clusters); 

%--- output--- 
% neighbors = [1,2; 
%    1,2; notice this doesn't match truth_nn 1,3 
%    4,3] 
% distances = [  0 1.4142; 
%    1.0000 1.0000; 
%    2.8284 3.0000]; 

%computes statistics, nnz counts number of nonzero elements, in the first 
%case every piece of data that matches 
%NOTE1: the indexing on truth_nn (:,1:num_clusters) it says all rows 
%  but only use the first num_clusters columns. This should 
%  prevent the dimension mistmatch error you were getting 
positives = nnz(neighbors == truth_nn(:,1:num_clusters));  %result = 5 
negatives = nnz(neighbors ~= truth_nn(:,1:num_clusters));  %result = 1 
%NOTE1: I've switched this from truth_nn to neighbors, this helps 
%  when you cahnge num_neghbors 
total_data = numel(neighbors);    %result = 6 

percent_incorrect = 100*(negatives/total_data); % 16.6666 
percent_correct = 100*(positives/total_data); % 93.3333 
+0

Спасибо за ваш ответ. Я перехожу к вашему решению. Я должен спросить, применим ли этот метод к двоичным данным, то есть, если элементы равны 0 и 1 (пространство объектов двоично). – SKM

+0

Для структуры правды_nn я загрузил базу данных с http://corpus-texmex.irisa.fr/ Я использую базу данных дескриптора GIST, называемую ANN_GIST1M. В описании говорится, что файл groundtruth содержит для каждого запроса, идентификаторы (номер вектора, начиная с 0) его k ближайших соседей, упорядоченных по возрастанию расстояния. • k = 100 для набора данных. Первым элементом каждого целочисленного вектора является идентификатор ближайшего соседа , связанный с запросом. Итак, не могли бы вы показать, как я могу применить ваше предлагаемое решение для работы в файле truth_nn. – SKM

+0

Набор данных слишком велик для загрузки.Но если данные, как вы говорите, только соседи (без пробелов), код, который я вам дал, будет работать отлично. Просто используйте свои собственные наборы данных вместо переменных, объявленных в первых нескольких строках. все под '% выполняет k означает' не нуждается в модификации. – andrew