NumPy dot()
Álgebra linear é um ramo da matemática essencial em inteligência artificial e machine learning. Ela lida com vetores, matrizes, tensores e operações sobre essas entidades. Em algoritmos de machine learning, arranjos (incluindo vetores, matrizes e tensores) são usados para representar dados que podem ser manipulados usando operações de álgebra linear. Neste post, abordaremos uma das ferramentas mais poderosas para trabalhar com arranjos disponíveis em nosso kit de ferramentas Python: a função dot() do NumPy.
A função dot() do NumPy
NumPy é uma biblioteca Python que oferece suporte para grandes arrays (arranjos) e matrizes multidimensionais, juntamente com uma ampla gama de funções matemáticas de alto desempenho. Uma dessas funções é a numpy.dot().
A função numpy.dot() calcula o produto escalar entre duas entradas. Elas podem ser escalares, vetores (arrays 1D) ou matrizes/arrays de dimensão superior.
A sintaxe básica da função numpy.dot() é:
numpy.dot(a, b, out=None)
onde:
a e b são dois arrays de entrada. Eles devem ter dimensões compatíveis para multiplicação matricial.
out (opcional): array para armazenar o resultado em vez de criar um novo.
Exemplos de np.dot() em código
Para valores escalares, a função numpy.dot() retorna o produto a × b.
import numpy as np
a = 2
b = 5
c = np.dot(a, b)
print(c) # resultado: 10
Para arrays 1D, ela retorna o produto interno (escalar), ou seja, a soma dos produtos elemento a elemento. O resultado é um único escalar.
import numpy as np
a = np.array([1, 2])
b = np.array([3, 4])
c = np.dot(a, b)
print(c) # resultado: 11
Para arrays 2D, np.dot() é equivalente à multiplicação matricial:
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
C = np.dot(A, B)
print(C)
# resultado:
# [[19 22]
# [43 50]]
Lembre-se: as matrizes A e B devem ter dimensões compatíveis para multiplicação matricial. Ou seja, o número de colunas na primeira matriz (array 2D) precisa ser igual ao número de linhas na segunda. No exemplo abaixo, as dimensões incompatíveis geram um erro (dimensões (3, 2) e (3, 2)):
import numpy as np
A = np.array([[1, 2], [3, 4], [5, 6]])
B = np.array([[7, 8], [9, 10], [11, 12]])
C = np.dot(A, B)
print(C)
# resultado:
# ValueError: shapes (3,2) and (3,2) not aligned: 2 (dim 1) != 3 (dim 0)
NumPy dot() para arrays 3D e de dimensões maiores
Para arranjos 3D e de dimensões maiores, a função dot() faz uma soma sobre o último eixo do primeiro array e o penúltimo eixo do segundo array. Ou seja, o np.dot() contrai o último eixo do primeiro array e o penúltimo eixo do segundo array (o eixo -1 de A e o eixo -2 de B):
import numpy as np
A = np.random.rand(10, 4, 7) # formato (10, 4, 7)
B = np.random.rand(7, 6) # formato (7, 6)
C = np.dot(A, B)
print(C.shape)
# resultado: (10, 4, 6)
Veja que, para arranjos de dimensões maiores, a dimensão do último eixo do primeiro array precisa ser compatível com a dimensão do penúltimo eixo do segundo array.
NumPy.dot() com Transmissão
A = np.array([[1, 2, 3], [4, 5, 6]]) # matriz (2, 3)
b = np.array([7, 8, 9]) # vetor (3,)
C = np.dot(A, b)
print(C)
# resultado:
# [ 50 122]