【问题标题】:Algorithm for best-effort classification of vector向量的尽力分类算法
【发布时间】:2010-12-07 06:17:46
【问题描述】:

给定四个表示“类”的二进制向量:

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

【问题讨论】:

    标签: matlab machine-learning classification


    【解决方案1】:

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

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

    【讨论】:

    • +1:打败我!当您的答案弹出时,我正在输入几乎完全相同的示例。
    • 大声笑,谢谢 :) .. 但我想除了使用不同的指标之外没有很多其他方法..
    • 是的,唯一的区别是使用 REPMAT 而不是 BSXFUN 和 ABS 而不是平方差。
    • 说一下,关于bsxfunrepmat,有什么区别呢?我曾经认为bsxfunrepmat 不同,内存效率更高(在某个维度上神奇地应用了运算符),但最近的实验证明......任何 cmets?
    • @Jacob:我自己从来没有在任何情况下实际测试过它,但是来自 The MathWorks 的 Loren 有一篇博文,她做了一些比较:blogs.mathworks.com/loren/2008/08/04/…
    【解决方案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);
    

    选择你喜欢的:)

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-10-28
        • 1970-01-01
        • 2016-05-28
        • 1970-01-01
        • 1970-01-01
        • 2014-11-25
        • 2016-04-05
        • 1970-01-01
        • 2012-04-18
        相关资源
        最近更新 更多