Matlab K最近邻

5

我是Matlab的新手。我想要实现KNN算法。我尝试阅读fitcknn分类器,但我无法理解它。 我有一个矩阵x,其中有4个输入向量(每个向量有3个特征)

     1     2     3
     5    19    20
     1     2     4
     8    19    21

我希望得到一个输出矩阵Y,它为输入矩阵中的每个向量按顺序提供最近的邻居。例如,这种情况下的Y为:

      3     2     4
      4     3     1
      1     2     4
      2     3     1

解释:矩阵Y的第一行显示距离向量1最近的向量是:向量3,然后是向量2和向量4。

是否有一个库可以进行这种分类(使用余弦距离作为相似度函数)? 谢谢。


你尝试过在MATLAB中使用KNN的嵌入式实现吗?http://www.mathworks.com/help/stats/classificationknnclass.html - NKN
1个回答

6
n = size(x,1);
dist = squareform(pdist(x,'cosine')); %// distance matrix
dist(1:n+1:end) = inf; %// self-distance doesn't count
[~, y] = sort(dist,2);
y = y(:,1:n-1);

为了节省内存,您可以使用 pdist2 分块处理,而不是使用 pdist

n = size(x,1);
m = 100; %// chunk size. As large as memory allows. Divisor of n
y = NaN(n,n-1); %// pre-allocate results
for ii = 0:m:size(x,1)-1
    ind = ii+(1:m); %// current chunk: these rows
    dist_chunk = pdist2(x(ind,:),x,'cosine'); %// results for this chunk
    [~, y_chunk] = sort(dist_chunk,2);
    y(ind,:) = y_chunk(:,2:end); %// fill results, except self-distance
end

使用 sort(dist,2),您无需进行转置,并且可以使用 cosine 作为余弦距离。 - Jonas
@Jonas 谢谢。我没有注意到 OP 指定了度量单位。 - Luis Mendo
@LuisMendo 这个方法在小矩阵(5行*5列)上运行良好,但我尝试在一个巨大的矩阵(18000 * 33000)上运行,它需要很长时间!(超过9小时还没有完成!)。有什么想法为什么会这样或如何解决? - CSawy
@AliEmara 你有没有注意到 Matlab 是否由于物理内存不足而使用虚拟内存(磁盘缓存)?如果这是导致速度变慢的原因,你可以多次使用 pdist2,将整个矩阵和同一矩阵的小块传递给它。 - Luis Mendo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接