欧氏距离的矩阵实现(k近邻分类器)

  最近在设计分类器时用到了KNN分类器,因此在网上下载了一个knn的程序包,它实现的是一个简单的二分类问题下载地址如下http://download.csdn.net/detail/m_g_c_516/3027316#comment。但是由于这个程序嵌套比较多,距离函数的编写挺也让人费解,因此很多朋友在下面评论说不太好理解。在我把它研究明白后发现或许它性能不太好,但是有一个地方值得学习,这也是困扰很多朋友的地方,那就是距离函数的编写,它实际上就是欧氏距离的矩阵实现。

  在这个程序里有130个训练样本也就是矩阵X,每个样本实际上就是一个点,它的第一行和第二行分别是它的横纵坐标;有2500个测试样本也就是矩阵Y,每个样本实际上也是一个点,第一行和第二行分别是它的横纵坐标。距离函数的主体代码如下:

    XX = sum(X.^2,1);%1*130
    YY = sum(Y.^2,1);
    d = repmat(XX', [1 size(Y,2)]) + repmat(YY, [size(X,2) 1]);
    d = d - 2*X'*Y;

  现在逐行来分析一下,矩阵XX输出来是1*130,它所做的运算是对每一个样本的横纵坐标分别平方再相加,矩阵YY同理输出1*2500.然后看一下repmat函数,这个函数简单来说就是复制的意思,对于repmat(XX', [1 size(Y,2)])就代表将向量XX转置后横向复制了2500次,得到了130*2500的矩阵,同理repmat(YY, [size(X,2) 1]就是矩阵YY纵向复制130次,也得到130*2500的矩阵。现在将他们加和实际上得到的是

然后再来看一下X的转置与Y的乘积,根据矩阵相乘的定义我们得到

现在我们再来看一下距离的定义,将上述公式带入得到

这实际上就是欧氏距离的平方。

 


你可能感兴趣的:(欧氏距离,k近邻分类器)