Why kNNsearch and kNNclassify don't give the same result??

조회 수: 1 (최근 30일)
Delia
Delia 2015년 1월 16일
답변: Tom Lane 2015년 2월 9일
I'm using knnclassify to do a kNN classification in Matlab and it's working well. Now, I need to know the distances to the neighbors and it seems that knnsearch funcion gives me that.
The problem is the results are not the same. I am quite sure knnsearch is not working properly, but I don't know the reason.
This is my code:
k=1;
distance='euclidean';
rule='nearest';
%kNN classification
result = knnclassify(sample_matrix, training_matrix, label_matrix,k,distance,rule);
%showing which element is recognized and the distance to it
[recognition,distances] = knnsearch(training_matrix, sample_matrix,'k',k);
So, result and recognition should be the same, and then I can see the distances.
This is result:
4 1 1 2 4 1 1 4 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 2 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9
And this is recognition:
3 1 1 2 3 1 1 3 1 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 3 2 2 4 3 3 4 3 4 4 3 3 3 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 6 6 6 5 5 6 6 6 7 6 6 6 6 7 6 6 6 7 8 7 7 7 7 7 7 7 7 7
(They're two vectors). The desired result is
1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9
So, result is almost well (good enough) and recognition is a disaster. As you can see the beginning is much better than the end.
I don't understand because a simple example does work:
sample = [.9 .8;.1 .3;.2 .6]; training=[0 0;.5 .5;1 1]; group = [1;2;3]; foo_classify = knnclassify(sample, training, group); [foo_search,dist] = knnsearch(training, sample); The results are: foo_search = 3 1 2; foo_classify = 3 1 2; dist = 0.2236 0.3162 0.3162;
Anybody can help me?? Thank you very much.

답변 (1개)

Tom Lane
Tom Lane 2015년 2월 9일
As I understand this, knnclassify returns a classification so result is a value from label_matrix.
knnsearch just searches for nearest neighbors with no classification involved, so recognition would be a row number to index into training_matrix.
If label_matrix is just a row number, then maybe that's okay. In that case I'd check to see if the nearest neighbor is a tie, and the two functions are just choosing two different equidistant neighbors.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by