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]

哪些方法可用于将浮点值向量分类为这些“类”之一?

在大多数情况下,基本舍入有效:

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 来完成这项任务。

4

3 回答 3

5

找到每个“类”的测试向量的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

每个班级与 TEST 的距离如下所示class_diff

 0.41
 2.01
 7.61
 2.01

显然,第一个是最好的匹配,因为它的差异最小。

于 2009-10-16T04:59:00.623 回答
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);

选一个你喜欢的:)

于 2009-10-16T06:16:29.663 回答
1

一个简单的欧几里得距离算法就足够了。到该点距离最短的班级将是您的候选人。

http://en.wikipedia.org/wiki/Euclidean_distance

于 2009-10-16T04:57:34.480 回答