有一个矩阵 Y 20x20。她是二进制的。对其应用“step”函数并获得另一个二进制矩阵 X 20x20。
问题:我们只知道 X 矩阵。我们知道得到 X 矩阵的函数。我们需要尽可能地预测 Y'。MSE 指标。已知 Y' 将由 0 到 1 的实数组成。
如何才能做到这一点?试图生成任何二进制矩阵,应用一个函数。但没有任何结果。我不明白如何在预测矩阵中获得实数。PS 功能很复杂 - 你不能走另一条路。您不能使用机器学习方法感谢您的提示和帮助
def step(X):
n = X.shape[0]
W = convolve2d(X, np.ones((3, 3)), mode='same', boundary='wrap') - X
a = np.tile(np.floor(np.arange(n) / (n / 3)) + 1, (n, 1))
b = a.T + 1
a, b = np.minimum(a, b), np.maximum(a, b)
gamma = (a + b) / 2
return ((W <= b)&(W >= gamma)) | (X & (W >= a)& (W <= gamma))
请注意,a、b、gamma 是常数。W - 仅从原始矩阵的 9 个相邻单元中混洗信息。
算法(1):局部子集的枚举
我们在原始矩阵中取大小为 4x4 的小数,遍历 16 位的所有组合。我们查看哪些组合会在结果矩阵中产生正确的 2x2 次要矩阵(这仅取决于我们更改的位)。如果在所有“正确”组合中,某个位始终处于相同的值,那么原始矩阵中该位的值,我们就变得完全正确。选择下一个4x4正方形时,设置了其值位,我们不再触摸它们了。
您可以尝试使用 3x3 或 5x5 的正方形。但是 3x3 - 你找不到解决方案,而 5x5 - 更多的劳动力。
从意识形态上讲,该算法类似于玩扫雷的机器人。从理论上讲,如果可能的话,算法应该找到 Y 矩阵的准确值。是的,这是非常劳动密集型的。
方法(2):蒙特卡洛法(或swarm minimum search method)
我们记住概率矩阵 P。(从物理上讲,这是在给定位置原始矩阵中存在 1 的概率。)。最初,矩阵用 0.5 填充。
Xi = step(Yi)
Wins=convolve2d( ( Xi==X )*2. -1., np.ones((3, 3)), mode='same', boundary='wrap')
P+=Wins*Xi*0.01
我们重复步骤 1-6 足够的次数。
如果我在这里使用“遗传”枚举编写代码 - 我们会创建一个随机矩阵并逐渐对其进行变异以期待更好的结果。而且很多次。结果不是很好,代码很脏,错误不会收敛到零,但也许使用Chorkov 答案中的知识,有人会做出更正确的突变。我只是现在没有时间。
初始化代码:
选择最佳突变的代码:
0.11
如果我是对的,总比没有好MSE
。