ベクトルとの間のユークリッド距離を計算したい場合は、ピタゴラスを使用してください。マトラブでは:a
b
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
て、意味があるかどうかを確認してください。1 つ目は前のマトリックスのソート済みバージョンで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)