Алгоритм наилучшей классификации вектора
-
21-09-2019 - |
Вопрос
Даны четыре двоичных вектора, которые представляют «классы»:
[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]
Какие методы доступны для классификации вектора значений с плавающей запятой в один из этих «классов»?
Базовое округление работает в большинстве случаев:
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 для этой задачи.
Решение
Найди SSD (сумма квадратов разностей) вашего тестового вектора с каждым «классом» и используйте тот, у которого наименьший 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
А расстояние каждого класса от ТЕСТа выглядит так, class_diff
:
0.41
2.01
7.61
2.01
И очевидно, что первое совпадение является лучшим, поскольку у него наименьшая разница.
Другие советы
Это то же самое, что Джейкоб сделал, только с четыре различные меры расстояния:
%%
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);
Выбирайте тот, который вам нравится :)
Простого алгоритма евклидова расстояния должно быть достаточно.Класс с минимальным расстоянием до точки будет вашим кандидатом.