【问题标题】:Defining an efficient distance function in matlab在matlab中定义一个有效的距离函数
【发布时间】:2014-12-08 23:10:22
【问题描述】:

我在 matlab 中使用 kNN 搜索函数,但我正在计算我自己定义的类的两个对象之间的距离,所以我编写了一个新的距离函数。就是这样:

         function d = allRepDistance(obj1, obj2)
         %calculates the min dist. between repr.
         % obj2 is a vector, to fit kNN function requirements

            n = size(obj2,1);
            d = zeros(n,1);
            for i=1:n
                    M =  dist(obj1.Repr, [obj2(i,:).Repr]');
                    d(i) = min(min(M));
            end

     end

不同的是obj.Repr可能是一个矩阵,我想计算每个参数的所有行之间的最小距离。但是即使obj1.Repr 只是一个向量,它基本上给出了两个向量之间的正常欧几里得距离,kNN 函数也慢了 200 倍!

我只检查了距离函数(没有 kNN)的性能。我测量了计算向量和矩阵行之间的距离(当它们在对象中时)所需的时间,它的工作速度比正常距离函数慢 3 倍。

这有意义吗?有解决办法吗?

【问题讨论】:

  • “n”通常有多大?
  • @AdrienNK:我在 n=3000 和 k=800 和 2(列数)时进行了测量,但我希望 n 更大,可以选择 10000。跨度>

标签: matlab


【解决方案1】:

您使用的是dist(),它对应于欧几里得距离权重函数。但是,您没有对数据进行加权,即您不认为一个维度比其他维度更重要。因此,您可以直接使用欧式距离pdist()

 function d = allRepDistance(obj1, obj2)
 % calculates the min dist. between repr.
 % obj2 is a vector, to fit kNN function requirements
    n = size(obj2,1);
    d = zeros(n,1);
    for i=1:n
        X = [obj1.Repr, obj2(i,:).Repr'];
        M = pdist(X,'euclidean');
        d(i) = min(min(M));
    end
end

顺便说一句,我不知道你的矩阵尺寸,所以你需要处理元素的串联才能正确创建X

【讨论】:

  • 谢谢。我现在用 n=2000 进行了尝试,但速度仍然慢了 60 倍。这是使用 matlab 类时固有的问题还是我的代码有问题?
  • 您可以尝试在代码中使用分析 (profile) 或简单地包含 tic/roc 以查看您的代码在哪里花费了更多时间。找到瓶颈后,您可以在 SO 中创建另一个更具体的问题。
猜你喜欢
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多