Нормализация относительно строки и столбца

У меня есть набор вероятностей. Я хотел бы, чтобы столбцы суммировались с 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
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
665
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не уверен, правильно ли я понял, но кажется, что то, что вы пытаетесь выполнить, может быть математически неосуществимым?

Представьте, что у вас есть матрица 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]

Другие вопросы по теме