在随机矩阵中找到最可能的区域

时间:2019-07-01 16:44:43

标签: python

我花了几天时间来解决应该是一个简单的问题...

我有10万个11x11矩阵。我想知道这些数据集中在哪个区域。由于我的数据比较嘈杂,因此我使用了一个3x3的滑动窗口,对于我的每个100K矩阵,我都会保留滑动窗口的坐标,该坐标求和的次数更多。最后,我可以看到在矩阵的哪个部分发现了更多的计数。

以下是重现该问题的代码示例:

from random import random
from matplotlib import pyplot as plt
import numpy as np

size = 11

positions = np.zeros((size, size))

for _ in range(100000):
    matrix = [[random() for _ in range(size)] for _ in range(size)]
    max_value = 0
    max_coord = 0, 0
    for beg in range(1, size - 1):
        for end in range(1, size - 1):
            suma = sum(matrix[i][j] 
                       for i in range(beg - 1, beg + 2) 
                       for j in range(end - 1, end + 2))
            if suma >= max_value:
                max_value = suma
                max_coord = beg, end
    positions[max_coord] += 1

plt.imshow(positions[1:10,1:10], origin='lower')
plt.colorbar()

在该示例中,我使用随机矩阵(我使用了不同类型的随机生成器),并且窗口大小为3x3(2x2、5x5等相同的结果。希望不是1x1)。

我的问题是,由于我使用随机矩阵作为输入,因此我希望有一个随机的最终矩阵,但是我得到了:

enter image description here

值的分布类似于: enter image description here

我知道这看起来像是一个愚蠢的代码错误,但是我的想法真的耗尽了。

编辑

只是为了避免重复分析:  到目前为止,我已经尝试过(在上例中以粗体表示):

  • 窗口大小:
    • 1x1(有效)
    • 2x2(无效->与上面类似)
    • 3x3 (不起作用->与上面类似)
    • 5x5(无效->与上面类似)
  • 窗口步骤:
    • 1 ->重叠(无效)
    • 2->不重叠(不起作用)
  • 随机化

    • random.random
    • 对数正态
    • 二项式(n = 100,p = 0.2和p = 0.5)

    编辑2

@jhc是正确的,它是一种概率效应,我解决该问题的解决方案是使用非重叠窗口。结果示例:

enter image description here

...不太好,但至少是正确的:)

编辑3

我在https://math.stackexchange.com中发布了一个后续问题,以便了解这种偏见是否可以建模:https://math.stackexchange.com/questions/3281256/bias-in-getting-submatrix-of-higher-sum-in-random-matrices

1 个答案:

答案 0 :(得分:2)

这是一个概率效应。在角落的3x3子矩阵中具有较高值的​​结果与各个单元的采样率呈负相关。

您可以将其视为单个单元格将其值传播到周围3x3子矩阵的概率。拐角处的很高(或很低)值(例如[0,0])只会影响[1,1]表示的3x3子矩阵。内部部分的值构成更多3x3子矩阵。重复次数足够多时,此效果会产生观察到的渐变,不仅会出现最大值,还会出现最小值。

检查此代码以计算每个单元的采样率:

from random import random
from matplotlib import pyplot as plt
import numpy as np
size = 11

positions = np.zeros((size, size))
visits = np.zeros((size, size))

for i in range(1000):
   matrix = [[random() for j in range(size)] for i in range(size)]
   max_value = 0
   max_coord = 0, 0
   for beg in range(1, size - 1):
       for end in range(1, size - 1):
           suma = 0
           for i in range(beg - 1, beg + 2):
               for j in range(end - 1, end + 2):
                   suma += matrix[i][j]
                   visits[i,j] += 1
           if suma > max_value:
               max_value = suma
               max_coord = beg, end
   positions[max_coord] += 1

#plt.imshow(positions, origin='lower')
plt.imshow(visits, origin='lower')
plt.colorbar()
plt.show()

cellvisits