2009-10-16 10 views
4

Учитывая четыре двоичных векторов, которые представляют собой «классы»:Алгоритм лучших усилий классификации вектора

[1,0,0,0,0,0,0,0,0,0] 
[0,0,0,0,0,0,0,0,0,1] 
[0,1,1,1,1,1,1,1,1,0] 
[0,1,0,0,0,0,0,0,0,0] 

Какие методы доступны для классификации вектор значений с плавающей точкой в ​​одну из этих «классов»?

Basic округления работает в большинстве случаев:

round([0.8,0,0,0,0.3,0,0.1,0,0,0]) = [1 0 0 0 0 0 0 0 0 0] 

Но как я могу справиться с некоторым вмешательством?

round([0.8,0,0,0,0.6,0,0.1,0,0,0]) != [1 0 0 0 0 1 0 0 0 0] 

Это второй случай должен быть лучше подходит для 1000000000, но вместо этого, я потерял решение полностью, поскольку не существует четкого совпадения.

Я хочу использовать MATLAB для выполнения этой задачи.

ответ

5

Найти SSD (sum of squared differences) вашего тестового вектора с каждым «класс» и использовать один с наименьшим SSD.

Вот код: Я добавил 0 к концу тестового вектора вы предоставили, так как это было только 9 цифр, в то время как классы были 10.

CLASSES = [1,0,0,0,0,0,0,0,0,0 
      0,0,0,0,0,0,0,0,0,1 
      0,1,1,1,1,1,1,1,1,0 
      0,1,0,0,0,0,0,0,0,0]; 

TEST = [0.8,0,0,0,0.6,0,0.1,0,0,0]; 

% Find the difference between the TEST vector and each row in CLASSES 
difference = bsxfun(@minus,CLASSES,TEST); 
% Class differences 
class_diff = sum(difference.^2,2); 
% Store the row index of the vector with the minimum difference from TEST 
[val CLASS_ID] = min(class_diff); 
% Display 
disp(CLASSES(CLASS_ID,:)) 

Для наглядности difference выглядит следующим образом:

0.2 0 0 0 -0.6 0 -0.1 0 0 0 
-0.8 0 0 0 -0.6 0 -0.1 0 0 1 
-0.8 1 1 1 0.4 1 0.9 1 1 0 
-0.8 1 0 0 -0.6 0 -0.1 0 0 0 

А расстояние каждого класса от TEST выглядит так, class_diff:

0.41 
2.01 
7.61 
2.01 

И, очевидно, первый из них является лучшим, так как он имеет наименьшую разницу.

+0

+1: бейте меня к нему! Я набрал практически тот же пример, когда ваш ответ появился. – gnovice

+0

Lol, спасибо :) .. но я думаю, что не так много других способов сделать это отдельно от использования разных показателей. – Jacob

+0

Да, единственные отличия заключались в использовании REPMAT вместо BSXFUN и ABS вместо квадратизации разницы. – gnovice

2

Это то же самое, как Jacob сделал, только с четыре различных мер расстояния:


%% 
CLASSES = [1,0,0,0,0,0,0,0,0,0 
      0,0,0,0,0,0,0,0,0,1 
      0,1,1,1,1,1,1,1,1,0 
      0,1,0,0,0,0,0,0,0,0]; 

TEST = [0.8,0,0,0,0.6,0,0.1,0,0,0]; 

%% 
% sqrt(sum((x-y).^2)) 
euclidean = sqrt(sum(bsxfun(@minus,CLASSES,TEST).^2, 2)); 

% sum(|x-y|) 
cityblock = sum(abs(bsxfun(@minus,CLASSES,TEST)), 2); 

% 1 - dot(x,y)/(sqrt(dot(x,x))*sqrt(dot(y,y))) 
cosine = 1 - (CLASSES*TEST' ./ (norm(TEST)*sqrt(sum(CLASSES.^2,2)))); 

% max(|x-y|) 
chebychev = max(abs(bsxfun(@minus,CLASSES,TEST)), [], 2); 

dist = [euclidean cityblock cosine chebychev]; 

%% 
[minDist classIdx] = min(dist); 

Выберите тот, который вам нравится :)