2

를 사용하여 평균 평균 정밀 리콜을 계산 데이터베이스 화 지상 진실을 알아낼 수 없습니다 :나는 다음과 같은 크기의 데이터 집합이 있다고 가정 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을 적용하는 방법을 보여줄 수 있습니까?

사전 계산 된 가장 가까운 이웃과 그 제곱 유클리드 거리의 형태로 데이터 매트릭스, 쿼리 매트릭스 및 그라운드 진리 이웃을 생성하여 누군가가 작은 예제로 보여줄 수 있다면 엄청난 도움이 될 것입니다. 샘플 데이터베이스를 만들려고했습니다.

는 기본 데이터가

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 : 진실 이웃 및 미리 계산 된 가장 가까운 이웃 거리를 포함하는 진리 데이터를 만드는 방법은 무엇입니까? 평균 평균 정밀도 리콜이라고합니다. 지상 진실 테이블을 적용하는 방법을 다음과하지만 (확실) 이해할 수 없기 때문에 나는 knearest 이웃 검색 및 평균 정밀 리콜을 구현하는 시도

질문 2 : 내가 먼저 변환하여 k 가장 가까운 이웃 검색을 적용하려고

실수 값을 2 진법으로 변환합니다.

k = 10,20,50의 다른 값에 대한 k- 최근 인접 검색의 개념을 적용 할 수없고 GIST 데이터베이스를 사용하여 얼마나 많은 데이터가 정확하게 리콜되었는지 확인할 수 없습니다. GIST truth_nn() 파일에서 쿼리 벡터 i에 truth_nn(i,1:k)을 지정하면 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 herereference code을 소정 수식을 이용하여 평균치를 계산 정밀도했습니다. 그러나 인덱스를 기반으로 반환 된 쿼리의 순위를 매겨 야한다고 이론에 설명했기 때문에 내 접근 방식이 올바른지 확실하지 않습니다. 나는 이것을 완전히 이해하지 못한다. 평균 검색 정확도는 검색 알고리즘의 품질을 판단하는 데 필요합니다.AP = 무한대, 포지티브 및 네거티브 = 0의 값 = 150

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 

값이 knnsearch()는 전혀 작동하지 않는 것을 의미한다.

+0

이 주제에 관한 다른 질문과의 차이점은 무엇입니까? – beaker

+0

@beaker : 내 다른 질문에서, 나는 alogirhtm에 대한 해시 테이블을 여러 개 만드는 방법을 물어 보았다. - Locality Sensitive Hashing. 그런 다음 GIST 데이터베이스로 어떻게 작업 할 수 있는지 질문했습니다. 특히 실제 레이블과 거리로 구성된 지상 진리표를 적용하는 방법에 어려움을 겪고 있습니다. 이후, 이것은 매우 구체적인 질문이었습니다. 저는 간단한 쿼리와 기본 데이터를 생성 한 일반적인 질문을했습니다. 자, 어떻게 지상 진리 표를 만들 수 있는지 모르겠습니다. 내 목표는 가장 가까운 이웃 검색을 적용하고 평균 정밀도 리콜 측정 기준을 사용하여 품질을 평가하는 것입니다. – SKM

+0

평균 정밀 리콜을 적용하기 위해서는 지상 진실 표가 필요하다고 생각합니다. GIST 데이터베이스에는 데이터베이스가 있지만 사용법을 이해할 수 없습니다. 따라서 GIST 데이터베이스의 지상 진리표와 동일한 구조를 가진 샘플 표를 사용하여 가장 가까운 이웃에서 지상 진실을 적용하고 평균 정밀도 리콜을 계산하는 방법을 보여주는 데 도움을 청합니다. – SKM

답변

1

나는 당신이 여분의 일을하고 있다고 생각합니다. 이 과정은 MATLAB에서 매우 간단합니다, 당신은 또한 전체 배열을 조작 할 수 있습니다. 이것은 for 루프보다 빠르며 읽기 쉽습니다.

오류가없는 경우 truth_nnneighbors에 동일한 데이터가 있어야합니다. 행당 하나의 항목이 있습니다. 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

truth_nn의 구조에 대해 http://corpus-texmex.irisa.fr/에서 데이터베이스를 다운로드했습니다. ANN_GIST1M이라는 GIST 디스크립터 데이터베이스를 사용하고 있습니다. 설명 아래에 groundtruth 파일에 각 쿼리에 대해 거리가 증가하는 순서로 배열 된 식별자 (벡터 번호, 0에서 시작) . • 데이터 집합에 대해 k = 100. 각 정수 벡터의 첫 번째 요소는 쿼리와 연결된 가장 가까운 이웃 식별자 입니다. 그래서, 당신이 제시 한 해결책을 truth_nn 파일 – SKM

+0

에 대한 작업에 적용 할 수 있는지 보여 주시겠습니까? 데이터 세트가 너무 커서 다운로드 할 수 없습니다.그러나 데이터가 당신이 말하는 것처럼 이웃 만 (거리 없음) 내가 준 코드는 완벽하게 정상적으로 작동합니다. 처음 몇 줄에서 선언 한 변수 대신 자신의 데이터 집합을 사용하십시오. '% k k means' 아래의 모든 것은 수정이 필요 없습니다. – andrew