를 사용하여 평균 평균 정밀 리콜을 계산 데이터베이스 화 지상 진실을 알아낼 수 없습니다 :나는 다음과 같은 크기의 데이터 집합이 있다고 가정 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 here 및 reference code을 소정 수식을 이용하여 평균치를 계산 정밀도했습니다. 그러나 인덱스를 기반으로 반환 된 쿼리의 순위를 매겨 야한다고 이론에 설명했기 때문에 내 접근 방식이 올바른지 확실하지 않습니다. 나는 이것을 완전히 이해하지 못한다. 평균 검색 정확도는 검색 알고리즘의 품질을 판단하는 데 필요합니다.AP = 무한대, 포지티브 및 네거티브 = 0의 값 = 150precision = 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()는 전혀 작동하지 않는 것을 의미한다.
이 주제에 관한 다른 질문과의 차이점은 무엇입니까? – beaker
@beaker : 내 다른 질문에서, 나는 alogirhtm에 대한 해시 테이블을 여러 개 만드는 방법을 물어 보았다. - Locality Sensitive Hashing. 그런 다음 GIST 데이터베이스로 어떻게 작업 할 수 있는지 질문했습니다. 특히 실제 레이블과 거리로 구성된 지상 진리표를 적용하는 방법에 어려움을 겪고 있습니다. 이후, 이것은 매우 구체적인 질문이었습니다. 저는 간단한 쿼리와 기본 데이터를 생성 한 일반적인 질문을했습니다. 자, 어떻게 지상 진리 표를 만들 수 있는지 모르겠습니다. 내 목표는 가장 가까운 이웃 검색을 적용하고 평균 정밀도 리콜 측정 기준을 사용하여 품질을 평가하는 것입니다. – SKM
평균 정밀 리콜을 적용하기 위해서는 지상 진실 표가 필요하다고 생각합니다. GIST 데이터베이스에는 데이터베이스가 있지만 사용법을 이해할 수 없습니다. 따라서 GIST 데이터베이스의 지상 진리표와 동일한 구조를 가진 샘플 표를 사용하여 가장 가까운 이웃에서 지상 진실을 적용하고 평균 정밀도 리콜을 계산하는 방법을 보여주는 데 도움을 청합니다. – SKM