Los valores son:
- 1x2+2x5+3x11= 45
- 1x3+2x7+3x13=56
- 4x2+5x5+6x11=99
- 4x3+5x7+9x11=125
- 7x2+8x5+9x11=153
- 7x3+8x7+9x13=194
- 10x2+11x5+12x11=207
- 10x3+11x7+12x13=263
[[ 45 56]
[ 99 125]
[153 194]
[207 263]]
Conceptos básicos de álgebra lineal y configuración del entorno de trabajo
Presentación del curso y la necesidad del Álgebra Lineal
Anaconda + Python, Creación de un entorno y actualización de paquetes
Uso de Jupyter Notebook
Creando las bases, escalares, vectores y matrices. ¿Qué es un tensor? ¿Cómo se representa?
Realiza operaciones básicas
Dimensión de un escalar, vector, matriz o tensor
Transposición, suma de matrices y escalares
Suma de matrices y vectores (broadcasting)
Operaciones con matrices
Producto interno entre una matriz y un vector
Producto interno entre dos matrices
Propiedades de las matrices: la multiplicación de matrices es asociativa y distributiva, no es conmutativa
Transposición de un producto de matrices
Cómo comprobar la solución de un sistema de ecuaciones lineal
Tipos especiales de matrices: Identidad, Inversa, Singulares
Aplicación de la inversa de una matriz para resolver un sistema de ecuaciones lineales
Sistema de ecuaciones lineales
Ejemplos de sistemas sin solución, con una solución y con infinitas soluciones
Graficar vectores
¿Qué es una combinación líneal?
¿Qué es un espacio y un subespacio?
Vectores linealmente independientes
Validar que una matriz tenga inversa
Normas
Qué es una norma y para qué se usa. Desigualdad Triangular
Tipos de normas: norma 0, norma 1, norma 2, norma infinito y norma L2 al cuadrado
El producto interno como función de una norma y su visualización
Matrices y vectores especiales
La matriz diagonal y la matriz simétrica: sus propiedades
Vectores ortogonales, matrices ortogonales y sus propiedades
Matrices ortogonales y sus propiedades
Otras funciones de álgebra lineal
El determinante y la traza
Cierre del curso. Continua con el Curso de Álgebra Lineal Aplicada a Machine Learning.
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial
Antes: $249
Paga en 4 cuotas sin intereses
Termina en:
Sebastián Sosa
Aportes 64
Preguntas 0
Los valores son:
[[ 45 56]
[ 99 125]
[153 194]
[207 263]]
Producto interno entre dos matrices
Para que dos matrices puedan ser tener un producto interno el número de columnas del primero debe ser igual al número de filas del segundo.
Posteriormente realiza un producto interno entre los vectores fila de la primera matriz con los vectores columna de la segunda matriz generando un nueva matriz que tendrá las dimensiones del número de filas de la primera matriz y el número de columnas de la segunda matriz
Si quieren entender el porqué del producto interno, hay una serie de videos de álgebra lineal de 3Blue1Brown Español que explica muy bien su relacion con las transformaciones lineales. Dejo el link de la playlist y del video de producto de matrices en particular (que es sobre lo que trata esta clase). Espero les sirva 😄
Playlist “Esencia del Álgebra Lineal”: https://www.youtube.com/watch?v=0Ndnzx6AyaA&list=PLIb_io8a5NB2DddFf-PwvZDCOUNT1GZoA
"Transformaciones lineales y matrices": https://www.youtube.com/watch?v=YJfS4_m_0Z8&list=PLIb_io8a5NB2DddFf-PwvZDCOUNT1GZoA&index=4
import numpy as np
a = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
print(a)
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
b = np.array([[1, 2], [3, 4], [5, 6]])
print(b)
[[1 2]
[3 4]
[5 6]]
print(a.dot(b))
[[ 22 28]
[ 49 64]
[ 76 100]
[103 136]]
res = np.array([
[(1 * 1) + (2 * 3) + (3 * 5), (1 * 2) + (2 * 4) + (3 * 6)],
[(4 * 1) + (5 * 3) + (6 * 5), (4 * 2) + (5 * 4) + (6 * 6)],
[(7 * 1) + (8 * 3) + (9 * 5), (7 * 2) + (8 * 4) + (9 * 6)],
[(10 * 1) + (11 * 3) + (12 * 5), (10 * 2) + (11 * 4) + (12 * 6)]
])
print(res)
[[ 22 28]
[ 49 64]
[ 76 100]
[103 136]]
Para los que no quieren escribir las matrices, les dejo mi aporte.
A = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
B = np.array([[2,3], [5,7], [11,13]])
Genial, empiezo a recordar mis clases de algebra en la universidad!
¿Se puede mejorar el algoritmo de multiplicación de matrices?
Respuesta Corta: Si
Respuesta Larga: La AI de DeepMind lo logra y es tema de portada Octubre 2022 revista Nature
Dejo enlace del artículo aquí
Razones para usar pycharm:
Visualización de matrices (:
https://www.youtube.com/watch?v=kjBOesZCoqc&index=1&list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab
Este canal es buenísimo para aprender algebra y entender el porque de los cálculos. Tiene la mayoría subtitulado al español, aunque vale la pena verlo en inglés 😉
Solo dire que… aqui el orden los factores si altera el producto. ó da error XD
Atentos, las columnas de el primer elemento en este caso A debe ser igual que las filas del segundo elemento en este caso B
El producto interno entre matrices es para quienes ya han visto un curso de álgebra lineal el producto usual entre matrices.
Producto interno entre dos matrices
Para la resolucion de estos ejercicios. Se analiza y se resuleve de este modo:
1x2+2x5+3x11= 45
1x3+2x7+3x13=56
4x2+5x5+6x11=99
4x3+5x7+9x11=125
7x2+8x5+9x11=153
7x3+8x7+9x13=194
10x2+11x5+12x11=207
10x3+11x7+12x13=263
![](
Supongamos que tenemos dos matrices a las cuales les queremos aplicar el producto interno la una con la otra, pero el problema es que estas matrices no tienen las mismas dimensiones.
import numpy as np
A = np.array([[1,2,3], [4,5,6], [7,8,9], [10,11,12]])
B = np.array([[2,3], [5,6], [11,13]])
print(A.shape) # Output = (4, 3)
print(B.shape) # Output = (3, 2)
Ahora vamos a intentar sacar su producto interno respectivamente:
# Esta operación es posible
C = A.dot(B)
# Esta operación NO es posible
D = B.dot(A)
print(C) # Output = [[45 54] [99 120] [153 186] [207 252]]
¿Por qué podemos resolver los problemas de A.dot(B)
, pero no los de B.dot(A)
? ¿Qué causa esta diferencia?
La respuesta se encuentra en las dimensiones de las matrices. En el primer caso, estamos calculando el producto de matrices A
y B
. Observemos que A
tiene dimensiones (4, 3) y B
tiene dimensiones (3, 2). Notamos que en este orden, las matrices tienen una dimensión en común, que es 3.
En el caso contrario, cuando intentamos calcular B.dot(A)
, estamos tratando de realizar el producto en una dimensión más pequeña de la que deseamos calcular, lo cual no es posible.
En resumen, la razón por la que la primera operación es válida es porque estamos calculando el producto en función de una dimensión más grande que la que deseamos obtener. Sin embargo, en el caso contrario, no es posible porque no tenemos suficientes datos para realizar el cálculo.
Ahora, ¿Por que nos da ese resultado? Cuando calculamos A.dot(B)
, estamos multiplicando cada fila de la matriz A
por cada columna de la matriz B
, lo que resulta en una nueva matriz C
. Cada valor en la matriz C
se obtiene sumando los productos de los elementos correspondientes de la fila en A
y la columna en B
.
Por ejemplo, el valor en la fila 1 de A
(4, 5, 6) multiplicado por la columna 1 de B
(2, 5, 11) da como resultado 45, y así sucesivamente para los demás valores. Por eso, C
tiene la forma (4, 2) y contiene los valores [[45, 54], [99, 120], [153, 186], [207, 252]].
En resumen, A.dot(B)
funciona porque la multiplicación de matrices se realiza en dimensiones que tienen una dimensión en común, generando una nueva matriz con resultados calculados.
Unos apuntes que tengo:
Me costo mucho entender el tema.
Suma de las multiplicaciones de los elementos de las Filas de A y las Columnas de B
- El producto interno entre dos matrices es una operación muy común en álgebra lineal, también conocida como producto matriz-matriz. En Python, podemos realizar esta operación utilizando la librería NumPy y la función dot().
import numpy as np
# Creamos una matriz de 2x3
A = np.array([[1, 2, 3], [4, 5, 6]])
# Creamos otra matriz de 3x2
B = np.array([[7, 8], [9, 10], [11, 12]])
# Calculamos el producto interno entre A y B
C = np.dot(A, B)
print(C)
# resultado: [[ 58 64]
# [139 154]]
<h5>Reto</h5>
A = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]])
B = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
print(A)
print(B)
print(A.shape)
print(B.shape)
print(C)
Puede hacerse también con un script de python que lo hace visualmente!
Comparto el código a quien le interese
def miPropioDot(A,B):
suma = 0
sumaElementos = 0
nuevaMatriz = np.zeros((A.shape[0],B.shape[1]),dtype=int)
for i in range(A.shape[0]):
for k in range(B.shape[1]):
sumaElementos = 0
for p in range(B.shape[0]):
sumaElementos += A[i][p] * B[p][k]
print(f'[{A[i][p]}]*[{B[p][k]}] = {A[i][p] * B[p][k]}')
suma+=sumaElementos
print(f'Suma {sumaElementos} | Total = {suma}\r\n')
nuevaMatriz[i][k] = sumaElementos
return nuevaMatriz
print(f'La nueva matriz es\n {miPropioDot(A,B)}')
i=0
j=0
k=0
m=0
A=np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
B=np.array([[2,3],[5,7],[11,13]])
print(“Matriz A = \n {} \nMatriz B = \n {}”.format(A,B))
print("\n")
print("Producto Punto Componente a componente\n ")
for k in range(0,A.shape[0]):
for m in range(0,B.shape[1]):
aux=0
for j in range(0,A.shape[1]):
aux=A[k][j]*B[j][m]+aux
aux2=A[k][j]*B[j][m]
print(“Resultado: A{}*B{} = {}”.format((k,j),(j,m),aux2))
print(“k={},j={},m={}, Acum = {}\n”.format(k,j,m,aux))
D[k][m]=aux
D
<
a = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
b = np.array([[1, 2], [3, 4], [5, 6]])
c = a * b[:,0]
print(c)
[[ 1 6 15]
[ 4 15 30]
[ 7 24 45]
[10 33 60]]
d = a * b[:,1]
print(d)
[[ 2 8 18]
[ 8 20 36]
[14 32 54]
[20 44 72]]
C = c[:,0] + c[:,1] + c[:,2]
print(C)
[ 22 49 76 103]
D = d[:,0] + d[:,1] + d[:,2]
e = np.array([C, D])
print(e)
[[ 22 49 76 103]
[ 28 64 100 136]]
e = e.T
>
Bueno lo interesante de hacerlo con loops fue ver claramente porque la cantidad de filas de la primera matriz debe coincidir con la cantidad de columnas de la segunda matriz
# listas con las filas de la primera matriz
A1, A2, A3, A4 = [1,2,3],[4,5,6],[7,8,9],[10,11,12]
# listas con las columnas de la segunda matriz
B1, B2 = [2,5,11], [3,7,13]
# del shape de las matrices originales sabemos que la matriz resultante sera de (4, 2)
# que son las medidas de los extremos
# calculo del elemento (col 1,fila 1):
C11 = 0
for i in A1:
C11 += (A1[i-1] * B1[i-1])
print(C11)
# calculo del elemento (col 1,fila 2):
C12 = 0
for i in A1:
C12 += (A2[i-1] * B1[i-1])
print(C12)
# calculo del elemento (col 1,fila 3):
C13 = 0
for i in A1:
C13 += (A3[i-1] * B1[i-1])
print(C13)
# calculo del elemento (col 1,fila 4):
C14 = 0
for i in A1:
C14 += (A4[i-1] * B1[i-1])
print(C14)
Output:
45
99
153
207
# calculo del elemento (col 2,fila 1):
C21 = 0
for i in A1:
C21 += (A1[i-1] * B2[i-1])
print(C21)
# calculo del elemento (col 2,fila 2):
C22 = 0
for i in A1:
C22 += (A2[i-1] * B2[i-1])
print(C22)
# calculo del elemento (col 2,fila 3):
C23 = 0
for i in A1:
C23 += (A3[i-1] * B2[i-1])
print(C23)
# calculo del elemento (col 2,fila 4):
C24 = 0
for i in A1:
C24 += (A4[i-1] * B2[i-1])
print(C24)
Output:
56
125
194
263
Los valores restantes son
Hecho el ejercicio y es una delicia:
A1 = 1 * 2 + 2 * 5 + 3 * 11
B1 = 1 * 3 + 2 * 7 + 3 * 13
A2 = 4 * 2 + 5 * 5 + 6 * 11
B2 = 4 * 3 + 5 * 7 + 6 * 13
A3 = 7 * 2 + 8 * 5 + 9 * 11
B3 = 7 * 3 + 8 * 7 + 9 * 13
A4 = 10 * 2 + 11 * 5 + 12 * 11
B4 = 10 * 3 + 11 * 7 + 12 * 13
print(A1)
print(B1)
print(A2)
print(B2)
print(A3)
print(B3)
print(A4)
print(B4)
Da los mismos datos que con las fórmulas:
C = A.dot(B)
print(C)
Tarea:
Valores:
1x2+2x5+3x11= 45
1x3+2x7+3x13=56
4x2+5x5+6x11=99
4x3+5x7+9x11=125
7x2+8x5+9x11=153
7x3+8x7+9x13=194
10x2+11x5+12x11=207
10x3+11x7+12x13=263
Se olvidaron de explicar que es el producto interno de dos matrices, un ejemplo no es una explicación, falta, la definición, demostración, otros ejempllos, etc. Al final tenemos que irnos a youtube para entender el tema, punto mas para youtube, punto menos para platzi
A = np.array([
[1,2,3],
[4,5,6],
[7,8,9],
[10,11,12]
])
B = np.array([
[2,3],
[5,7],
[11,13]
])
print(A)
print("—")
print(B)
print("—")
print([
[12 + 25 + 311, 13 + 27 + 313],
[42 + 55 + 611, 43 + 57 + 613],
[72 + 85 + 911, 73 + 87 + 913],
[102 + 115 + 1211, 103 + 117 + 1213]
])
En lugar de hacer el ejercicio que propone el profesor, les propongo que vean el siguiente video, y entiendan por que el producto interno se lleva a cabo de esa manera.
https://www.youtube.com/watch?v=8f7UUnbLqp0&list=PLIb_io8a5NB2DddFf-PwvZDCOUNT1GZoA&index=5
Ya si quieren profundizar aún más les recomiendo vean la lista de reproducción completa.
Forma en la que se realizan las operaciones para obtener la matriz resultante:
Completando la matriz.
![](
Hasta en este punto me di cuenta que tan necesario y bueno es Python. Me tarde 3 minutos multiplicando las dos matrices…
C_0_0 = (
A[0][0] * B[0][0] +
A[0][1] * B[1][0] +
A[0][2] * B[2][0]
)
C_0_1 = (
A[0][0] * B[0][1] +
A[0][1] * B[1][1] +
A[0][2] * B[2][1]
)
C_1_0 = (
A[1][0] * B[0][0] +
A[1][1] * B[1][0] +
A[1][2] * B[2][0]
)
C_1_1 = (
A[1][0] * B[0][1] +
A[1][1] * B[1][1] +
A[1][2] * B[2][1]
)
C_2_0 = (
A[2][0] * B[0][0] +
A[2][1] * B[1][0] +
A[2][2] * B[2][0]
)
C_2_1 = (
A[2][0] * B[0][1] +
A[2][1] * B[1][1] +
A[2][2] * B[2][1]
)
C_3_0 = (
A[3][0] * B[0][0] +
A[3][1] * B[1][0] +
A[3][2] * B[2][0]
)
C_3_1 = (
A[3][0] * B[0][1] +
A[3][1] * B[1][1] +
A[3][2] * B[2][1]
)
C_construida = np.array([
[ C_0_0 , C_0_1 ],
[ C_1_0 , C_1_1 ],
[ C_2_0 , C_2_1 ],
[ C_3_0 , C_3_1 ],
])
Para que A x B se pueda multiplicar:
El número de columnas de A tiene que ser igual al número de filas de B.
vector * matriz con los mismos que se usaron en la clase me dio:
array([[ 2, 6],
[ 6, 12],
[10, 18]])
Comparto mi versión en código de producto punto (o escalar):
def myDot(A,B):
# Where A is a matrix with m_A rows and n_A columns
# and B is a matrix with m_B rows and n_B columns
# Then dot product is only defined if m_A == n_B
# so the shape of our new matrix C will be m_A rows and n_B columns
C = np.zeros((A.shape[0],B.shape[1]))
for i in range (0,A.shape[0]):
for j in range (0, B.shape[1]):
for n in range (0,B.shape[0]):
C[i][j]= C[i][j] + (A[i][n]*B[n][j])
return C
Markdown para Colab o similar del producto interno visto en clase:
$$ C =
\begin{bmatrix}
1 & 2 & 3\\
4 & 5 & 6\\
7 & 8 & 9\\
10 & 11 & 12
\end{bmatrix}*
\begin{bmatrix}
2 & 3\\
5 & 7\\
11 & 13
\end{bmatrix}=
\begin{bmatrix}
(1*2)+(2*5)+(3*11) & (1*3)+(2*7)+(3*13)\\
(4*2)+(5*5)+(6*11) & (4*3)+(5*7)+(6*13)\\
(7*2)+(8*5)+(9*11) & (7*3)+(8*7)+(9*13)\\
(10*2)+(11*5)+(12*11) & (10*3)+(11*7)+(12*13)
\end{bmatrix}=
\begin{bmatrix}
45 & 56\\
99 & 125\\
153 & 194\\
207 & 263
\end{bmatrix}
$$
Me costó un poco entender cómo funciona numpy internamente para realizar estas operaciones, así que acá mis apuntes:
Para que se pueda operar, se debe tener en MATRIZ_A las mismas columnas que filas en la MATRIZ_B. Ejemplo matriz de (4,3) @ (3,2). Y las dimensiones que devuelve son las de los extremos, en este caso: (4,3).
.
De la documentación [de dot()]:
Dot product of two arrays. Specifically,
[matmul](https://numpy.org/doc/stable/reference/generated/numpy.matmul.html#numpy.matmul)
or a @ b
is preferred.[multiply](https://numpy.org/doc/stable/reference/generated/numpy.multiply.html#numpy.multiply)
and using numpy.multiply(a, b)
or a * b
is preferred.M>=2
), it is a sum product over the last axis of a and the second-to-last axis of b..
numpy.dot - NumPy v1.20 Manual
.
En resumen: para multiplicar entre matrices, se debe tener en el eje de A, las mismas dimensiones que en el penúltimo eje de B.
En python hay 3 formas de indicar el producto interno entre dos matrices:
A = np.array([
[11,12,13],
[21,22,23],
[31,32,33],
[41,42,43]
])
B = np.array([
[1,2],
[3,4],
[5,6]
])
C = A.dot(B)
D = np.dot(A, B)
E = A @ B
print('\nA\n',A)
print('\nB\n',B)
print('\n A.dot(B) \n',C)
print('\n np.dot(A, B) \n',D)
print('\n A @ B \n',E)
matriz 3x1 por matriz 1x3 da una matriz 3x3:
H = np.array([[1], [2], [3]]) #3x1
K = np.array([[2, 4, 6]]) #1x3
L = H.dot(K) #3x3
print(L)
[ [ 2 4 6]
[ 4 8 12]
[ 6 12 18] ]
C = A.dot(B)
for a in A:
txt = ''
for b in B.T:
r = 0
for ai, bi in zip(a, b):
txt += f"({ai} X {bi}) + "
r += (ai * bi)
txt = txt[:-2] + f"= {r}, "
print(txt[:-2])
print("\n")
print(C)
(1 X 2) + (2 X 5) + (3 X 11) = 45, (1 X 3) + (2 X 7) + (3 X 13) = 56
(4 X 2) + (5 X 5) + (6 X 11) = 99, (4 X 3) + (5 X 7) + (6 X 13) = 125
(7 X 2) + (8 X 5) + (9 X 11) = 153, (7 X 3) + (8 X 7) + (9 X 13) = 194
(10 X 2) + (11 X 5) + (12 X 11) = 207, (10 X 3) + (11 X 7) + (12 X 13) = 263
[[ 45 56]
[ 99 125]
[153 194]
[207 263]]
m_5 = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
#np.random.randint(low = 3, high=5, size =(4, 3))
v_3 = np.array([[2,3],[5,7],[11,13]])
#np.random.randint(low = 1, high=9, size =(3,2))
results = list()
position = 0
for m in m_5:
i = 0
p = 0
r = list()
for val_m in range(len(m)):
j = 0
to_sum = []
for v in v_3:
if p == len(v):
position +=1
break
#print(f'{m[j]} + {v_3[j, p]}')
to_sum.append(m[j] * v_3[j, p])
j += 1
if p != len(v):
r.append(sum(to_sum))
#print(sum(to_sum))
#print('='*30)
p += 1
results.append(r)
i += 1
print (results)
print('='*30)
print(m_5.dot(v_3))
C= AxB
C11= 1x2+2x5+3x11= 45
C12=1x3+2x7+3x13=56
C21=4x2+5x5+6x11=99
C22=4x3+5x7+9x11=125
C31=7x2+8x5+9x11=153
C32=7x3+8x7+9x13=194
C41=10x2+11x5+12x11=207
C42=10x3+11x7+12x13=263
# Para realizar el producto interno entre matrices es importante recordar que
# coincidir la cantidad de columnas de la matriz A con las cantidad de filas
# de la matriz B.
# Siendo A una matriz (4,3) y B una matriz (3,2) podemos hacer:
C = A.dot(B)
# Pero no podemos hacer:
D = B.dot(A)
[[ 45 56]
[ 99 125]
[153 194]
[207 263]]
print(np.array([
[(1*2 + 2*5 + 3*11) , (1*3 + 2*7 + 3*13)],
[(4*2 + 5*5 + 6*11) , (4*2 + 5*5 + 6*11)],
[(7*2 + 8*5 + 9*11) , (7*2 + 8*5 + 9*11)],
[(10*2 + 11*5 + 12*11), (10*2 + 11*5 + 12*11)]
]))
Por lo que entendiiiiiii
Para poder realizar el producto interno entre dos matrices, requerimos que el numero de columnas de A sea igual al numero de filas de B.
Cada posición IJ de la matriz resultante correspondera a la suma de la multiplicación de cada elemento de la columna de A por el elemento correspondinete a la fila de B.
Que excelente!
array([[ 45, 56],
[ 99, 125],
[153, 194],
[207, 263]])
que buen repaso de álgebra lineal
Alguien mas le sucede que tiene que esperar hasta 2 minutos para que el video cargue 30 segundos?
Producto interno es sinónimo de multiplicación entre matrices.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?