Как нормализовать строку в матрице объектов? Ошибка вещания

#python #numpy #normalization #array-broadcasting

Вопрос:

У меня есть матрица функций, которую я хочу нормализовать по строкам.

Это то, что я сделал на основе минимального и максимального масштабирования, и я получаю ошибку. Может ли кто-нибудь помочь мне с этой ошибкой.

 a = np.random.randint(10, size=(4,5))
s=a.max(axis=1) - a.min(axis=1)
np.amax(a,axis=1)
print(s)

(a - a.min(axis=1))/(a.max(axis=1) - a.min(axis=1))

>>[7 6 4 5]
      4 print(s)
      5 
----> 6 (a - a.min(axis=1))/(a.max(axis=1) - a.min(axis=1))

ValueError: operands could not be broadcast together with shapes (4,5) (4,)

 

Ответ №1:

Попробуйте работать с транспонированной матрицей:

 b = a.T
m = (b - b.min(axis=0)) / (b.max(axis=0) - b.min(axis=0))
m = m.T
 
 >>> a
array([[2, 3, 2, 8, 3],   # min=2 -> 0, max=8 -> 1
       [3, 3, 9, 2, 1],   # min=1 -> 0, max=9 -> 1
       [1, 9, 8, 4, 7],   # min=1 -> 0, max=9 -> 1
       [6, 8, 7, 9, 4]])  # min=4 -> 0, max=9 -> 1

>>> m
array([[0.        , 0.16666667, 0.        , 1.        , 0.16666667],
       [0.25      , 0.25      , 1.        , 0.125     , 0.        ],
       [0.        , 1.        , 0.875     , 0.375     , 0.75      ],
       [0.4       , 0.8       , 0.6       , 1.        , 0.        ]])
 

Комментарии:

1. Если я использую транспонированную матрицу в качестве входных данных, какие изменения мне придется внести в свой модуль прямого распространения( обычная архитектура) для размещения с использованием транспонированной входной матрицы.Следует ли мне также транспонировать матрицу веса?

Ответ №2:

У меня есть альтернативное решение , я не уверен, что оно правильное.Было бы здорово, если бы кто — нибудь мог это прокомментировать.

 def row_normalize(mf):
  row_sums = np.array(mf.sum(1))
  new_matrix = mf / row_sums[:, np.newaxis]
  return new_matrix