我在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倍。
这有什么意义吗?有解决方案吗?
答案 0 :(得分:0)
您正在使用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
。