Clear Filters
Clear Filters

Implement all nearest neighbor

1 view (last 30 days)
ML
ML on 20 May 2022
Edited: ML on 22 May 2022
Lets say I want to find all neighbors. A function that will take in an excel file with data of different cars (caryear carmileage carhorsepower carlife) amd I want to be able to input data of a car I want and if it already exist according to my input then return that but if it does not return all the colosest/similar version of that car according to some all nearest neighbor implemantation. Not sure if that makes sense but I would appreciate some help :)
  4 Comments
Image Analyst
Image Analyst on 22 May 2022
OK, but did @bransa's Answer below work?
ML
ML on 22 May 2022
Edited: ML on 22 May 2022
No I dont think I explained it well. Basically given a list of variable names find nearest neighbor.... consider min/max ranges. How can I do all this using knnsearch?

Sign in to comment.

Accepted Answer

bransa
bransa on 20 May 2022
Edited: bransa on 20 May 2022
I would use logical indexing to query your excel data. When your return is empty, then prioritize the dimensions you want to search by and either use a combination of min-abs(difference) (one item searched) or knnsearch for a list of queries. Here is something to show what I am getting at. Not sure it runs bc I don't have sample data
found_index = find(carYear == inputYear & ...
carMileage == inputMileage & ...
carHorsepower == inputHorsepower & ...
carLife == inputLife);
if ~isempty(found_index)
fprintf('%s meets your input specifications.\n',carName)
else
% first try to find the year & horsepower ignoring the mileage and life
% just because this makes sense to me
found_index = find(carYear == inputYear & carHorsepower == inputHorsepower);
if ~isempty(found_index)
if length(found_index) == 1
fprintf('%s is the same year & horsepower.\n',carName)
else
fprintf('the following cars are the same year & horsepower:\n')
% now you have more than one car that meets 2 conditions.
% find the min difference for mileage and life
[~,minLifeIndex] = min(abs(carLife(found_index)-inputLife(found_index)));
[~,minMileageIndex] = min(abs(carMileage(found_index)-inputMileage(found_index)));
% note: your min~Index refers to the index of the
% array found_index. The index that meets the criteria in
% carMileage is carMileage(found_index(min~Index))
fprintf('\tclosest in life: %s\n',carName(found_index(minLifeIndex)))
fprintf('\tclosest in mileage: %s\n',carName(found_index(minMileageIndex)))
end
else
% some other less rigorous set of conditions
end
end

More Answers (0)

Community Treasure Hunt

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

Start Hunting!