У меня есть набор вероятностей. Я хотел бы, чтобы столбцы суммировались с 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






Я не уверен, правильно ли я понял, но кажется, что то, что вы пытаетесь выполнить, может быть математически неосуществимым?
Представьте, что у вас есть матрица 2x2, в которой вы хотите, чтобы сумма строк равнялась 1, а столбцов — 10. Даже если вы сделали все числа в столбцах равными 1 (их максимально возможное значение), вы все равно не сможете суммировать их до 10 в своих столбцах?
Это может работать только в том случае, если количество столбцов вашей матрицы в 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]