【问题标题】:Find the index of n unique rows with the lowest values查找具有最低值的 n 个唯一行的索引
【发布时间】:2015-11-16 14:02:23
【问题描述】:

我有一个 151-by-151 矩阵 A。这是一个相关矩阵,所以主对角线上有1s,主对角线上下有重复值。

我正在寻找一种方法来获取具有最低值的许多行的 n 的索引。

我要查找的行数固定为n,而n many rows 必须是唯一的。

所以,比如说:

n = 10

及数据如下

第 1 行的相关性最低(第 6 行/第 6 列),也是第三低的相关性(第 9 行/第 9 列)。

这意味着我找到了我需要的三行的索引:1、6 和 9。但是,我没有将第 1 行计算两次,因此我仍然需要找到另外 7 行的索引.

我已经尝试过这种方法

function [smallestNElements smallestNIdx] = getNElements(A, n)
     [ASorted AIdx] = sort(A);
     smallestNElements = ASorted(1:n);
     smallestNIdx = AIdx(1:n);
end

我获得了here。但是,我认为这种方法从根本上是不适用的,因为它适用于向量。当我将它应用于我的二维矩阵时,它只给出第一列中最低值的索引。

最低是指绝对值最低,而不是“最接近零”。因此-0.9 低于-0.1,而-0.1 又低于0.05

【问题讨论】:

  • 您的统计分析目标是什么?
  • 我的目标只是找出那些 n 很多人(相关矩阵中的每一行都是一个人),这些人彼此之间的相关性可能最低——或者更好的是,负相关性。
  • 那你不需要成对的人吗?
  • 你可能会发现这个功能很有用:de.mathworks.com/help/stats/tiedrank.html
  • @BillBokeey 是的,我们有成对的人。矩阵中的每个相关性都是通过考虑两个个体之间的配对数据而创建的。

标签: matlab


【解决方案1】:

首先,通过将它们设为Inf 来消除重复值,这样它们就不会被误认为是最低值:

A1 = tril(A);
A1(A1==0) = Inf;

现在找到n最小的索引:

[~,idx] = sort(A1(:));
[r,c] = ind2sub(size(A), idx(1:n));

这会找到最低的 n 相关性,如果您希望 n 行涉及最低相关性而不重复它们,那么

[~,idx] = sort(A(:));
[r,c] = ind2sub(size(A), idx);
rows = unique(r,'stable');
result = rows(1:n)

【讨论】:

  • 如果我将 n 设置为 5 并将您的方法应用于图解相关矩阵,我得到 r = [6,9,8,7,8] 和 c = [1,1,1,3, 3]。这确定了 5 个最低相关性,但我不清楚在哪里可以找到最低相关性所涉及的 5 行(换句话说,5 个人)。你能解释一下我是怎么做到的吗?
  • 当我运行它时,我得到 [6,9,8,7,10]。如果我们只考虑修剪后的矩阵 A1,它们确实是涉及最低相关性的 n 行而不重复,但在原始矩阵 A 中,我可以看到第 1 行具有极低的相关性。有没有办法考虑到这一点,例如通过考虑 A1 中的行和列,还是重新考虑 A?
  • 如果不移除上三角会发生什么(即使用A 而不是AA)?
  • 此解决方案可能会省略correlation = 0
  • @DennisKlopfer 不是公认的解决方案,即省略前两行。但除此之外,是的,原版有缺陷。但是,如果来自观察到的数据,那么 0 的相关性听起来不太可能
【解决方案2】:

这是我的解决方案

[~, idx] = sort(sum(A));
results = idx(1:n);

它的工作原理是sum 被接管矩阵的列。这给我留下了一个1 x columns 向量。向量按从小到大排序,并保留索引。然后将第一个n 数量的索引保留为结果。这是使用n=4 的数据的结果

result = 
    1
    6
    9
    8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2019-11-14
    • 2019-11-06
    • 2019-01-21
    • 2018-03-14
    相关资源
    最近更新 更多