实现自定义距离功能

SKM*_*SKM 1 matlab distance matrix

A并且B是由二元元素组成的矩阵.A被表示为基础数据矩阵并且B是查询矩阵.A由长度为10的75个数据点组成,每个数据点由长度为10 B的50个数据点组成.我想计算所有数据点A和每个查询数据点之间的距离B,以便应用最近邻搜索.所以我没有使用欧几里德或汉明距离,而是使用了另一个指标:

公

N = 2,k = length of data samples,s = A(1,:)t = B(1,:).该代码适用于一个数据样本A和另一个数据样本B.如何缩放以使其适用于所有基础数​​据点和所有查询数据点?

代码工作的示例

A(1,:) = [1,0,1,1,0,0,0,1,1,0]是A矩阵中的第一个样本.让我们B(1,:) = [1,1,0,0,1,1,1,1,0,0]是第一个查询点.

如果取自A和B的样本中的元素相同,则为每个相似元素记录0,否则1.最终距离是1的总和.因此,程序检查两个序列是否相同,如果是,则设置b为1,否则设置为零.有人可以告诉我如何将其应用于矩阵吗?

l = length(A);

D=zeros(1,l);
for i=1:l,
    if A(1,i)==B(1,i),
        D(1,i)=0;
    else 
        D(1,i)=1;
    end
end

sum=0;
for j=1:l,
    sum=sum+D(1,j);
end

if sum==0, 
    b = 1;
else 
    b = 0;
end
Run Code Online (Sandbox Code Playgroud)

dro*_*rco 5

一线解决方案

这个计算可以在一行代码中完成:

D = A*B'+(1-A)*(1-B)' < size(A,2)
Run Code Online (Sandbox Code Playgroud)

说明

考虑到A和B是二进制的,A处的每个样本与B处的每个样本之间的距离函数基本上检查每坐标匹配的量是否等于样本的长度.您可以使用矩阵乘法来实现此目的.

更具描述性的代码示例

将A和B定义为您在答案中提到的两个二进制矩阵:

%initializes A and B randomly
A = double(rand(75,10) > 0.5);
B = double(rand(50,10) > 0.5);
[m,n] = size(A);
Run Code Online (Sandbox Code Playgroud)

A中每个样品与B中每个样品之​​间的距离可以如下计算:

首先,定义大小为75x50的矩阵D,st D(i,j)包含A中的样本i和B中的样本j之间的匹配数.

它可以计算如下:

D = A*B' + (1-A)*(1-B)';
Run Code Online (Sandbox Code Playgroud)

如果匹配量小于n(n是每个样本的长度),则可以通过测试每对(i,j)来完成最终距离测量.如果它较小,则样本不同,结果应为1.否则它应为零.这可以按如下方式完成:

finalDist = D < n ;
Run Code Online (Sandbox Code Playgroud)

  • @Umar No.您必须将所有同意元素汇总在一起,因此矩阵乘法非常适合.您在上面编写的代码与矩阵 - 矩阵乘法完全相同,但您使用两个求和来执行此操作. (3认同)
  • 这与OP中的距离指标相同吗?我的理解是`[1,0,0,1]`和`[1,1,0,0]`之间的距离是2,因为2个元素不同,但是`A*B'`给出了距离只有`1`,因为它基本上找到两个矢量等于'1'的地方? (2认同)