【问题标题】:matlab K Nearest Neighbormatlab K最近邻
【发布时间】:2014-04-12 15:19:55
【问题描述】:

我是 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 classification knn


【解决方案1】:
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 谢谢。我没有注意到 OP 指定了该指标
  • @LuisMendo 这适用于一个小矩阵(5 行 * 5 列),但我在一个巨大的矩阵(18000 * 33000)上尝试了它,它需要永远! (超过 9 个小时,没有完成!)。知道为什么或如何解决这个问题吗?
  • @AliEmara 您是否注意到 Matlab 是否由于缺少物理 RAM 而使用虚拟内存(磁盘缓存)?如果这是减慢速度的原因,您可以多次使用pdist2,将整个矩阵和同一矩阵的小块传递给它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 2018-04-08
  • 2014-05-14
  • 2011-12-06
  • 2015-01-19
  • 1970-01-01
  • 2013-03-21
相关资源
最近更新 更多