【问题标题】:Finding the best threshold level without a for loop in MATLAB在 MATLAB 中找到没有 for 循环的最佳阈值水平
【发布时间】:2015-05-27 02:42:22
【问题描述】:

令 A 和 B 是两个大小相同的矩阵。对于矩阵 M,让 ht(M,t) 阈值 M 的所有条目 t。也就是说,所有绝对值小于 t 的条目都设置为 0。假设我想找到最优阈值 t,使得 norm(ht(A,t)-B,'fro')^2 最小化。

我能看到的唯一方法是有缺陷的:对 A 和阈值 A 的唯一值执行 for 循环并设置 C=ht(A,t)-B,计算 sum(sum(C.* C))。

当 A 很大时,这太慢了。我考虑过对 A 的元素进行排序并找到一些有效的方法来一次将一些条目设置为零,但我不确定这是否可以在没有 for 循环的情况下完成。

有办法吗?

这是一个非常简单的例子(在这种情况下,一个简单的 for 循环很容易工作):

B =

     0.101508820368332                         0
                     0         0.301996943246957

Set

A=B+.1*ones(2)

A =

         0.201508820368332                       0.1
                       0.1         0.401996943246957

简单的检查表明,如果我们将 A 的非对角线条目归零,我们会最小化 A 和 B 之间的差异。有 3 个可能的阈值,由 unique(A)=[.1,.2015,.402 ]。给定一个潜在的阈值 t,我们可以通过以下方式硬阈值 A:

function [A_thresholded] = ht(A,t)
%
A_thresholded = A .* (abs(A)>t);

【问题讨论】:

  • 您能否提供示例输入数据并列出预期输出?
  • 好的,请稍等。
  • 不是检查每个唯一值,也许您可​​以使用二进制搜索来找到阈值。我不确定是否存在一种有效的方法来为一般情况找到最佳解决方案。
  • 我不确定你的意思。由于 norm(ht(A,t)-B,'fro')^2 甚至不能保证有一个局部最小值,那会实现什么?
  • 我的直觉是,除了尝试通过迭代搜索找到最佳点之外,没有简单的解决方案。我不确定要建议哪种算法,但我会研究非线性优化算法。发布指向您的数据的链接可能会让我们更好地了解可以尝试哪些技术。

标签: matlab for-loop threshold


【解决方案1】:

矩阵中数据的形式无关紧要。您可以将它们转换为向量并简单地计算平方范数。实际上,您可以按升序对A 的内容进行排序(并置换B 以保留配对)。当您增加阈值以在A 中再包含一个值时,标准只会改变那个增量。因此,您可以在 O(n log n) 中找到您的解决方案。希望这会有所帮助。

【讨论】:

  • 这里的n是什么,A的前导维度?
  • @GregorianFunk A 中的元素数量。矢量化 A 和 B。
  • 我认为这并没有真正的帮助,因为对于一个正方形 p x p 矩阵,这是 O(p^2 log p),无论如何都是通过 for 循环完成的(除非您提出其他建议) .所以我不知道你在解决这个问题。
  • @GregorianFunk 是真的。但我认为在实践中它会更快。您能否向我们展示您的代码以便我们进行比较?
猜你喜欢
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 2016-07-17
相关资源
最近更新 更多