如果要计算向量 a 和 b 之间的 Euclidean distance,只需使用 Pythagoras。在 Matlab 中:
dist = sqrt(sum((a-b).^2));
但是,您可能希望使用pdist 一次性计算矩阵中所有向量组合的值。
dist = squareform(pdist(myVectors, 'euclidean'));
我将列解释为要分类的实例,将行解释为潜在的邻居。不过这是任意的,您可以切换它们。
如果有单独的测试集,您可以使用pdist2 计算到训练集中实例的距离:
dist = pdist2(trainingSet, testSet, 'euclidean')
您可以使用此距离矩阵对向量进行 knn 分类,如下所示。我将生成一些随机数据作为示例,这将导致低(大约机会级别)准确性。但是当然你应该插入你的实际数据,结果可能会更好。
m = rand(nrOfVectors,nrOfFeatures); % random example data
classes = randi(nrOfClasses, 1, nrOfVectors); % random true classes
k = 3; % number of neighbors to consider, 3 is a common value
d = squareform(pdist(m, 'euclidean')); % distance matrix
[neighborvals, neighborindex] = sort(d,1); % get sorted distances
查看neighborvals 和neighborindex 矩阵,看看它们是否对您有意义。第一个是早期d矩阵的排序版本,后者给出了对应的实例编号。请注意,自距离(在d 的对角线上)已浮动到顶部。我们对此不感兴趣(始终为零),因此我们将在下一步中跳过第一行。
assignedClasses = mode(neighborclasses(2:1+k,:),1);
所以我们在 k 个最近邻中分配最常见的类!
您可以将分配的班级与实际班级进行比较以获得准确度分数:
accuracy = 100 * sum(classes == assignedClasses)/length(classes);
fprintf('KNN Classifier Accuracy: %.2f%%\n', 100*accuracy)
或者做一个混淆矩阵,看看分类的分布:
confusionmat(classes, assignedClasses)