【发布时间】:2016-02-17 18:09:39
【问题描述】:
我有一个 151-by-151 矩阵 A。它是一个相关矩阵,因此主对角线上有1s,主对角线上方和下方有重复值。每行/列代表一个人。
对于给定的整数n,我将通过将人们踢出去来减少矩阵的大小,这样我就剩下一个n-by-n 相关矩阵,它可以最小化元素的总和。除了获得缩写矩阵,我还需要知道应该从原始矩阵中引导出来的人的行号(或他们的列号 - 他们将是相同的数字)。
我以A = tril(A) 为起点,它将从相关矩阵中删除多余的非对角元素。
所以,如果n = 4 并且我们有上面假设的 5-by-5 矩阵,那么很明显应该将人 5 踢出矩阵,因为那个人贡献了很多非常高的相关性。
很明显,第 1 个人不应该被踢出去,因为那个人贡献了很多负相关,从而降低了矩阵元素的总和。
我知道sum(A(:)) 将对矩阵中的所有内容求和。但是,我非常不清楚如何搜索尽可能少的答案。
我注意到一个类似的问题Finding sub-matrix with minimum elementwise sum,它有一个蛮力解决方案作为公认的答案。虽然该答案在那里工作正常,但对于 151-by-151 矩阵来说是不切实际的。
编辑:我曾想过迭代,但我认为这并不能真正最小化缩减矩阵中的元素总和。下面我有一个 4-by-4 粗体相关矩阵,边上有行和列的总和。很明显,n = 2 的最佳矩阵是涉及人员 1 和 4 的 2-by-2 单位矩阵,但根据迭代方案,我会踢出人 1 处于迭代的第一阶段,因此算法得出的解决方案不是最优的。我编写了一个程序,它总是生成最优解,当 n 或 k 很小时它运行良好,但是当试图从151-by-151 矩阵 我意识到我的程序需要数十亿年才能终止。
我隐约记得,有时这些 n 选择 k 问题可以通过避免重新计算事物的动态编程方法来解决,但我不知道如何解决这个问题,谷歌搜索也没有启发我.
如果没有其他选择,我愿意牺牲精度来换取速度,否则最好的程序需要一周多的时间才能生成精确的解决方案。不过,如果程序能够生成精确的解决方案,我很乐意让程序运行长达一周。
如果程序无法在合理的时间范围内优化矩阵,那么我会接受一个答案,解释为什么这种特定类型的 n 选择 k 任务无法在合理的时间内解决时间范围。
【问题讨论】:
-
sum(A, 2)返回每一行的总和。 -
您是否能够扩展该代码如何帮助找到 n-by-n 矩阵的缩写版本,该矩阵的总和最小化矩阵元素?
-
让我看看我是否准确地理解了这个问题。问题是选择一个向量
x以最小化x'*S*x,其中S是给定的对称正定矩阵,x受制于x的条目是1或@ 987654342@ 和x的元素总和为n。对吗? -
This link 可能会有所帮助。另外,您是否愿意为了速度而牺牲精度?
-
我编辑了 OP 以阐明精度与速度的问题。您对问题的理解是正确的,除了 S 是相关矩阵,因此必然是半正定的,不一定是正定的。
标签: matlab optimization quadratic-programming