分区矩阵,以尽量减少零件的方差

时间:2014-03-12 15:58:40

标签: algorithm matrix

我有一个实数矩阵,我想找到这个矩阵的一个分区,这样零件的数量和每个部分中数字的方差都被最小化了。直观地说,我想尽可能少的部分,但我也希望任何给定部分中的所有数字都在一起。

更正式地说,我认为对于后者,我会为每个部分找到该部分中数字的方差,然后在所有部分中取这些方差的平均值。这将是给定解决方案的“得分”的一部分,得分的另一部分将是,例如,矩阵中的元素总数减去分区中的部分数量,因此将导致更少的部分这部分得分更高。解决方案的最终得分是两部分的加权平均值,最佳解决方案是得分最高的那个。

显然很多都是启发式的:我需要决定如何平衡零件数量与方差。但是我甚至对这个问题的一般方法感到困惑。

例如,给出以下简单矩阵:

10, 11, 12, 20, 21
 8, 13,  9, 22, 23
25, 23, 24, 26, 27

分区到以下子矩阵是合理的解决方案:

10, 11, 12    |   20, 21
 8, 13,  9    |   22, 23
--------------+----------
25, 23, 24    |   26, 27

只有垂直和水平切片才能进行分区。

请注意,我不需要 最佳解决方案,我只需要一种方法来获得“好”的解决方案。此外,这些矩阵是几百到几百,所以粗暴强迫它可能不是一个合理的解决方案,除非有人可以提出一个削减搜索空间的好方法。

1 个答案:

答案 0 :(得分:0)

我认为从一个更简单的问题开始你会更好。我们称之为

  • 问题A:给定固定数量的垂直和/或水平分区,它们应该在哪里最小化方差之和(或者可能是一些其他变化量度,例如每个块内的范围总和)。

我建议对问题A使用动态编程公式。

一旦掌握了这一点,就可以处理

  • 问题B:找到变化与垂直和水平分区数量之间的最佳平衡。

显然,您可以通过将每个元素放入其自己的块中来将方差减小为0。通常,问题B要求您为每个选择的垂直和水平分区计数解决问题A.

要对问题B使用动态编程方法,您必须制定一个目标函数来封装您寻求的权衡。我不确定这是多么可行,所以我建议寻找不同的方法。

目前,问题B是2D问题。您可能会发现在2D聚类算法方面取得了一些成功。如果可以将其重新表述为一维问题,则可以选择另一种方法:使用块数(而不是垂直和水平分区计数)来权衡变化。然后你可以使用像Jenks natural breaks classification method这样的东西来决定画线的位置。

无论如何,这个答案显然没有给你一个有效的算法。但我希望它至少提供一种方法(这就是你要求的全部内容:)。)。