我花了几天时间来解决应该是一个简单的问题...
我有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)。
我的问题是,由于我使用随机矩阵作为输入,因此我希望有一个随机的最终矩阵,但是我得到了:
我知道这看起来像是一个愚蠢的代码错误,但是我的想法真的耗尽了。
编辑
只是为了避免重复分析: 到目前为止,我已经尝试过(在上例中以粗体表示):
随机化
编辑2
@jhc是正确的,它是一种概率效应,我解决该问题的解决方案是使用非重叠窗口。结果示例:
...不太好,但至少是正确的:)
编辑3
我在https://math.stackexchange.com中发布了一个后续问题,以便了解这种偏见是否可以建模:https://math.stackexchange.com/questions/3281256/bias-in-getting-submatrix-of-higher-sum-in-random-matrices
答案 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()