我有一系列的可能性。我希望列的总和为1(表示概率),行的总和为X(其中X是整数,例如9)。
我以为我可以规范化列,然后通过X规范化行和时间。但这没有用,行和列的总和不是完美的1.0和X。
这是我尝试过的:
# B is 5 rows by 30 columns
# Normalizing columns to 1.0
col_sum = []
for col in B.T:
col_sum.append(sum(col))
for row in range(B.shape[0]):
for col in range(B.shape[1]):
if B[row][col] != 0.0 and B[row][col] != 1.0:
B[row][col] = (B[row][col] / col_sum[col])
# Normalizing rows to X (9.0)
row_sum = []
for row in B:
row_sum.append(sum(row))
for row in range(B.shape[0]):
for col in range(B.shape[1]):
if B[row][col] != 0.0 and B[row][col] != 1.0:
B[row][col] = (B[row][col] / row_sum[row]) * 9.0
答案 0 :(得分:1)
我不确定我是否理解正确,但是看来您要完成的工作在数学上可能不可行?
想象一下,假设您有一个2x2矩阵,您希望行的总和为1,列的总和为10。即使您将第1列中的所有数字(它们的最大可能值)设为1,您仍然无法求和在他们的栏中最多可以有10个?
答案 1 :(得分:0)
这仅在矩阵的列数是行数的X倍时才有效。例如,如果X = 3并且您有5行,那么您必须有15列。因此,您可以让您的5x30矩阵适用于X = 6而不适用于X = 9。
这样做的原因是,如果每一列的总和为1.0,则矩阵中所有值的总和将为列数的1.0倍。并且由于您希望每一行的总和为X,因此所有值的总和也必须为行数的X倍。
因此:列* 1.0 = X *行
如果满足该约束,则仅需与X / sum(row)成比例地调整所有值,并且除非初始值未适当平衡,否则两个尺寸将自动工作。如果矩阵尚未平衡,则调整值将类似于解决数独(也称为NP问题),并且结果在很大程度上与初始值无关。当所有行(调整为具有相同的总和)导致所有列具有相同的总和时,矩阵将处于平衡状态。
[0.7, 2.1, 1.4, 0.7, 1.4, 1.4, 0.7, 1.4, 1.4, 2.1, 0.7, 2.1, 1.4, 2.1, 1.4] 21
[2.8, 1.4, 0.7, 2.1, 1.4, 2.1, 0.7, 1.4, 2.1, 1.4, 0.7, 0.7, 1.4, 0.7, 1.4] 21
[1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 0.7, 2.8, 0.7, 0.7, 1.4, 2.1] 21
[1.4, 1.4, 1.4, 1.4, 2.1, 1.4, 1.4, 1.4, 0.7, 0.7, 2.1, 1.4, 1.4, 1.4, 1.4] 21
[0.7, 0.7, 2.1, 1.4, 0.7, 0.7, 2.8, 1.4, 1.4, 2.1, 0.7, 2.1, 2.1, 1.4, 0.7] 21
将x = x * 3/21应用于所有元素...
[0.1, 0.3, 0.2, 0.1, 0.2, 0.2, 0.1, 0.2, 0.2, 0.3, 0.1, 0.3, 0.2, 0.3, 0.2] 3.0
[0.4, 0.2, 0.1, 0.3, 0.2, 0.3, 0.1, 0.2, 0.3, 0.2, 0.1, 0.1, 0.2, 0.1, 0.2] 3.0
[0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.1, 0.4, 0.1, 0.1, 0.2, 0.3] 3.0
[0.2, 0.2, 0.2, 0.2, 0.3, 0.2, 0.2, 0.2, 0.1, 0.1, 0.3, 0.2, 0.2, 0.2, 0.2] 3.0
[0.1, 0.1, 0.3, 0.2, 0.1, 0.1, 0.4, 0.2, 0.2, 0.3, 0.1, 0.3, 0.3, 0.2, 0.1] 3.0
[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]