python - 生成一个非对称 NxM 矩阵,其行和列独立地总和为 1
问题描述
给定 N 行和 M 列的目标矩阵大小,是否可以在矩阵在对角线上不对称的情况下选择所有行和列总和为 1的值?这是我在 N==M 时能够生成的目标矩阵(当 N!=M 出现问题 - 见下文):
[[0.08345877 0.12844672 0.90911941 0.41964704 0.57709569]
[0.53949086 0.07965491 0.62582134 0.48922244 0.38357809]
[0.80619328 0.27581426 0.31312973 0.26855717 0.4540732 ]
[0.11803505 0.88201276 0.1990759 0.2818701 0.63677383]
[0.57058968 0.75183898 0.07062126 0.6584709 0.06624682]]
我正在用 numpy 写这个。目前我已经编写了以下(蛮力)代码,我知道它在 n==m 时有效。但是,如果 n != m,则逐行和逐列和不会收敛到 0,并且逐行和与逐列和的比率收敛到 (n/m):
n,m = (5,4)
mat = np.random.random((n,m))
for i in range(100):
s0 = mat.sum(0)
s1 = mat.sum(1)[:,newaxis]
mat = (mat/s0)
mat = (mat/s1)
if i%10 == 0:
print(s0[0]/s1[0,0])
在这种情况下,最终输出为 1.25(即 n/m,或 5/4)。我开始认为这在数学上可能是不可能的。有人可以证明我错了吗?
解决方案
我怀疑你是对的,如果 N != M,问题就无法解决。
以一个 2x3 矩阵为例:
[[a b c]
[d e f]]
假设所有行和所有列的总和为 1 并显示矛盾。行总和为 1,因此:
a+b+c = 1
d+e+f = 1
这给出了:
(a+b+c)+(d+e+f) = 1 + 1 = 2
现在看看列。每列总和为 1,因此我们有:
a+d = 1
b+e = 1
c+f = 1
结合三列方程给出:
(a+d)+(b+e)+(c+f) = 1 + 1 + 1 = 3
由于所有六个矩阵元素的总和不能同时为 2 和 3 2 != 3
,因此初始假设导致矛盾,因此被推翻。更一般地说,对于 N != M 具有 N 行和 M 列的问题无法解决。
对于方阵,当 N = M 时,矛盾就消失了。
推荐阅读
- javascript - 如何填写处理表单中值的在线表单?
- css - 禁用悬停效果,但继续点击功能
- iis-10 - 对仅影响移动设备的重定向循环进行故障排除
- java - 从外部存储读取硬编码的 Uri
- javascript - 不按回车提交 Select2 下拉菜单
- javascript - ES6 类的 jest.mock 产生 ReferenceError: require is not defined
- docker - 为什么“添加”后本地目录为空。在 dockerfile 上?
- json - 将活动数据工厂 V2 集合引用复制到字符串类型
- mysql - “表中不存在PropertyID
- reactjs - 如何在 useEffect 挂钩中设置状态?