1

私は親指認識システムに取り組んでいます。画像を分類するには、KNN アルゴリズムを実装する必要があります。thisによると、測定値は 2 つしかありません。これにより、最近傍を見つけるための距離が計算されますが、私の場合、25 X 42 の 400 枚の画像があり、そのうち 200 枚はトレーニング用で、200 枚はテスト用です。数時間検索していますが、ポイント間の距離を見つける方法が見つかりません。

編集: 最初の 200 枚の画像を 1 X 1050 に再形成し、それらtrainingDataを 200 X 1050 のマトリックスに格納しました。同様に、testingData.

4

3 に答える 3

7

k 最近傍分類のコード例を次に示します (一部の関数には Statistics ツールボックスが必要です)。

%# image size
sz = [25,42];

%# training images
numTrain = 200;
trainData = zeros(numTrain,prod(sz));
for i=1:numTrain
    img = imread( sprintf('train/image_%03d.jpg',i) );
    trainData(i,:) = img(:);
end

%# testing images
numTest = 200;
testData = zeros(numTest,prod(sz));
for i=1:numTest
    img = imread( sprintf('test/image_%03d.jpg',i) );
    testData(i,:) = img(:);
end

%# target class (I'm just using random values. Load your actual values instead)
trainClass = randi([1 5], [numTrain 1]);
testClass = randi([1 5], [numTest 1]);

%# compute pairwise distances between each test instance vs. all training data
D = pdist2(testData, trainData, 'euclidean');
[D,idx] = sort(D, 2, 'ascend');

%# K nearest neighbors
K = 5;
D = D(:,1:K);
idx = idx(:,1:K);

%# majority vote
prediction = mode(trainClass(idx),2);

%# performance (confusion matrix and classification error)
C = confusionmat(testClass, prediction);
err = sum(C(:)) - sum(diag(C))
于 2012-06-02T20:50:41.240 に答える
2

ベクトルとの間のユークリッド距離を計算したい場合は、ピタゴラスを使用してください。マトラブでは:ab

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)
于 2012-06-01T19:50:17.610 に答える
1

はい、knn の関数があります: knnclassify

最良の結果を得るために、保持したい近傍の数をいじってみましょう (混同行列を使用します)。もちろん、この関数は距離を処理します。

于 2012-06-02T04:21:36.997 に答える