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
11 次查看(过去 30 天)
显示 更早的评论
%% 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 个评论
采纳的回答
Image Analyst
2022-4-13
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 个评论
Image Analyst
2022-4-14
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?
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrix Indexing 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!