I'm trying to simulate 3 nearest neighbour classification without using the builtin matlab functions. I was able to 1 nearest neigbhor however i am unable to extend it to more
12 views (last 30 days)
Show older comments
Mujeeb Ul Hassan
on 13 Apr 2022
Commented: Mujeeb Ul Hassan
on 14 Apr 2022
%% code for 1 nearest neighbor classification
total_num_test_cases = num_test_cases * 5; %75
total_num_train_cases = num_train_cases * 5; %175
% Create a vector to store assigned labels
inferredLabels = zeros(1, total_num_test_cases);
% This loop cycles through each unlabelled item:
for unlabelledCaseIdx = 1:total_num_test_cases
unlabelledCase = testingSet(unlabelledCaseIdx, :);
% As any distance is shorter than infinity
shortestDistance = inf;
shortestDistanceLabel = 0; % Assign a temporary label
% This loop cycles through each labelled item:
for labelledCaseIdx = 1:total_num_train_cases
labelledCase = trainingSet(labelledCaseIdx, :);
% Calculate the Euclidean distance:
currentDist = euc(unlabelledCase, labelledCase);
% Check the distance
if currentDist < shortestDistance
shortestDistance = currentDist;
shortestDistanceLabel = trainingTarget(labelledCaseIdx);
end
end % inner loop
% Assign the found label to the vector of inferred labels:
inferredLabels(unlabelledCaseIdx) = shortestDistanceLabel
end % outer loop
0 Comments
Accepted Answer
Image Analyst
on 13 Apr 2022
Attach your test and training sets of data. You can get the distances of a point to all other points in one line of code. Then sort it in ascending order.
distances = sqrt((x - allX) .^ 2 + (y - allY) .^ 2);
[sortedDistances, sortOrder] = sort(distances)
indexesOfClosest3 = sortOrder(1:3)
5 Comments
Image Analyst
on 14 Apr 2022
OK so I interpret that as you don't want to try my solution yourself and just want me to do it for you. Here it is:
numPoints = 30;
allX = 100 * rand(1, numPoints);
allY = 100 * rand(1, numPoints);
plot(allX, allY, 'b.', 'MarkerSize', 40);
grid on;
hold on;
drawnow;
indexesOfClosest3 = zeros(numPoints, 3);
for k = 1 : numPoints
x = allX(k);
y = allY(k);
distances = sqrt((x - allX) .^ 2 + (y - allY) .^ 2);
[sortedDistances, sortOrder] = sort(distances);
indexesOfClosest3(k, :) = sortOrder(2:4); % Don't include the first distance which is zero (the distance of the point to itself).
% Plot lines to them
for k3 = 1 : 3
x3 = allX(indexesOfClosest3(k, k3));
y3 = allY(indexesOfClosest3(k, k3));
line([x, x3], [y, y3], 'Color', 'r', 'LineWidth', 2)
end
end
Note every point is connected to the 3 other closest points. Is that what you want?
More Answers (0)
See Also
Categories
Find more on Matrix Indexing in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!