**Ejercicio 1. Consideramos un vector aleatorio \(X=\left(X_1, X_2, X_3\right)^t\) de media 0 cuya matriz de varianzas y covarianzas poblacionales está dada por**
\[
\left(\begin{array}{lll}
3 & 1 & 1 \\
1 & 3 & 1 \\
1 & 1 & 5
\end{array}\right)
\]
Hallar los autovalores \(y\) autovectores de la matriz de varianzas \(y\) covarianzas.
Dar la expresión de las componentes principales \(Y=\left(Y_1, Y_2, Y_3\right)^t\) e indicar la proporción de la variabilidad explicada por cada una de ellas.
Hallar los loadings de la primera componente principal.
Hallar los scores de las primeras dos componentes principales correspondientes a la observación \(X=(2,2,1)^t\) .
# Matriz de covarianzas
Sigma <- matrix (c (3 , 1 , 1 , 1 , 3 , 1 , 1 , 1 , 5 ), nrow = 3 )
# 1. Autovalores y autovectores
eigen_results <- eigen (Sigma)
eigenvalues <- eigen_results$ values
eigenvectors <- eigen_results$ vectors
print ("Autovalores:" )
[,1] [,2] [,3]
[1,] -0.4082483 -0.5773503 7.071068e-01
[2,] -0.4082483 -0.5773503 -7.071068e-01
[3,] -0.8164966 0.5773503 -1.110223e-16
# 2. Componentes principales y proporción de variabilidad
pca <- prcomp (Sigma, scale = FALSE )
print ("Componentes principales:" )
[1] "Componentes principales:"
PC1 PC2 PC3
[1,] -0.2357023 7.071068e-01 -0.6666667
[2,] -0.2357023 -7.071068e-01 -0.6666667
[3,] 0.9428090 2.220446e-16 -0.3333333
print ("Proporción de variabilidad explicada:" )
[1] "Proporción de variabilidad explicada:"
print (summary (pca)$ importance[2 , ] * 100 )
# 3. Loadings de la primera componente principal
loadings_Y1 <- eigenvectors[, 1 ]
print ("Loadings de Y1:" )
[1] -0.4082483 -0.4082483 -0.8164966
# 4. Scores para X = (2, 2, 1)^t
X <- c (2 , 2 , 1 )
scores_Y1 <- sum (X * eigenvectors[, 1 ])
scores_Y2 <- sum (X * eigenvectors[, 2 ])
print ("Scores de Y1 y Y2:" )
print (c (scores_Y1, scores_Y2))
import numpy as np
from sklearn.decomposition import PCA
# Matriz de covarianzas
Sigma = np.array([[3 , 1 , 1 ], [1 , 3 , 1 ], [1 , 1 , 5 ]])
# 1. Autovalores y autovectores
eigenvalues, eigenvectors = np.linalg.eig(Sigma)
print ("Autovalores:" )
[[-4.08248290e-01 -7.07106781e-01 -5.77350269e-01]
[-4.08248290e-01 7.07106781e-01 -5.77350269e-01]
[-8.16496581e-01 1.07392045e-17 5.77350269e-01]]
# 2. Componentes principales y proporción de variabilidad
pca = PCA(n_components= 3 )
pca.fit(Sigma)
PCA(n_components=3) In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
print ("Componentes principales:" )
[[-2.35702260e-01 -2.35702260e-01 9.42809042e-01]
[-7.07106781e-01 7.07106781e-01 -2.22044605e-16]
[ 6.66666667e-01 6.66666667e-01 3.33333333e-01]]
print ("Proporción de variabilidad explicada:" )
Proporción de variabilidad explicada:
print (pca.explained_variance_ratio_ * 100 )
[7.50000000e+01 2.50000000e+01 1.54074396e-30]
# 3. Loadings de la primera componente principal
loadings_Y1 = eigenvectors[:, 0 ]
print ("Loadings de Y1:" )
[-0.40824829 -0.40824829 -0.81649658]
# 4. Scores para X = (2, 2, 1)^t
X = np.array([2 , 2 , 1 ])
scores_Y1 = np.dot(X, eigenvectors[:, 0 ])
scores_Y2 = np.dot(X, eigenvectors[:, 1 ])
print ("Scores de Y1 y Y2:" )
print ([scores_Y1, scores_Y2])
[np.float64(-2.4494897427831774), np.float64(1.5650514389545414e-15)]
Ejercicio 2. Consideremos el siguiente conjunto de datos
\[
X=\left(\begin{array}{cc}
3 & 6 \\
5 & 6 \\
10 & 12
\end{array}\right)
\]
Calcular la matriz de covarianza, sus autovalores y autovectores.
Hallar las componentes principales y su contribución porcentual a la varianza total.
Graficar los datos en \(\mathbb{R}^2\) teniendo en cuenta la base original y luego la base de los dos primeros ejes.
Repetir los cálculos con los datos estandarizados e interpretar los resultados obtenidos
Verificar que los dos primeros autovectores son ortogonales entre sí. Representar gráficamente estos dos vectores en un gráfico bidimensional y trazar rectas desde el origen hasta la ubicación de cada uno de los vectores en el gráfico.
# Datos
X <- matrix (c (3 , 6 , 5 , 6 , 10 , 12 ), nrow = 3 , byrow = TRUE )
print (X)
[,1] [,2]
[1,] 3 6
[2,] 5 6
[3,] 10 12
# 1. Matriz de covarianza
cov_matrix <- cov (X)
print ("Matriz de covarianza:" )
[1] "Matriz de covarianza:"
[,1] [,2]
[1,] 13 12
[2,] 12 12
# 2. Autovalores y autovectores
eigen_results <- eigen (cov_matrix)
eigenvalues <- eigen_results$ values
eigenvectors <- eigen_results$ vectors
print ("Autovalores:" )
[,1] [,2]
[1,] -0.7216753 0.6922317
[2,] -0.6922317 -0.7216753
##3. Componentes principales y contribución porcentual
pca <- prcomp (X, scale = FALSE )
print ("Componentes principales:" )
[1] "Componentes principales:"
PC1 PC2
[1,] 0.7216753 -0.6922317
[2,] 0.6922317 0.7216753
print ("Contribución porcentual:" )
[1] "Contribución porcentual:"
print (summary (pca)$ importance[2 , ] * 100 )
# 4. Datos estandarizados
X_std <- scale (X)
cov_matrix_std <- cov (X_std)
eigen_results_std <- eigen (cov_matrix_std)
print ("Matriz de covarianza estandarizada:" )
[1] "Matriz de covarianza estandarizada:"
[,1] [,2]
[1,] 1.0000000 0.9607689
[2,] 0.9607689 1.0000000
print ("Autovalores estandarizados:" )
[1] "Autovalores estandarizados:"
print (eigen_results_std$ values)
[1] 1.96076892 0.03923108
print ("Autovectores estandarizados:" )
[1] "Autovectores estandarizados:"
print (eigen_results_std$ vectors)
[,1] [,2]
[1,] 0.7071068 -0.7071068
[2,] 0.7071068 0.7071068
# 5. Verificación de ortogonalidad
orthogonal <- sum (eigenvectors[, 1 ] * eigenvectors[, 2 ])
print ("¿Los autovectores son ortogonales?" )
[1] "¿Los autovectores son ortogonales?"
# Gráfica de los datos y autovectores
plot (X[, 1 ], X[, 2 ], pch = 16 , col = "blue" , xlab = "X1" , ylab = "X2" , main = "Datos y Autovectores" )
arrows (0 , 0 , eigenvectors[1 , 1 ] * sqrt (eigenvalues[1 ]), eigenvectors[2 , 1 ] * sqrt (eigenvalues[1 ]), col = "red" , lwd = 2 )
arrows (0 , 0 , eigenvectors[1 , 2 ] * sqrt (eigenvalues[2 ]), eigenvectors[2 , 2 ] * sqrt (eigenvalues[2 ]), col = "green" , lwd = 2 )
legend ("topright" , legend = c ("Datos" , "Autovector 1" , "Autovector 2" ), col = c ("blue" , "red" , "green" ), lwd = 2 )
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
# Datos
X = np.array([[3 , 6 ], [5 , 6 ], [10 , 12 ]])
# 1. Matriz de covarianza
cov_matrix = np.cov(X, rowvar= False )
print ("Matriz de covarianza:" )
# 2. Autovalores y autovectores
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
print ("Autovalores:" )
[[ 0.72167532 -0.6922317 ]
[ 0.6922317 0.72167532]]
# 3. Componentes principales y contribución porcentual
pca = PCA(n_components= 2 )
pca.fit(X)
PCA(n_components=2) In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
print ("Componentes principales:" )
[[ 0.72167532 0.6922317 ]
[-0.6922317 0.72167532]]
print ("Contribución porcentual:" )
print (pca.explained_variance_ratio_ * 100 )
# 4. Datos estandarizados
scaler = StandardScaler()
X_std = scaler.fit_transform(X)
cov_matrix_std = np.cov(X_std, rowvar= False )
eigenvalues_std, eigenvectors_std = np.linalg.eig(cov_matrix_std)
print ("Matriz de covarianza estandarizada:" )
Matriz de covarianza estandarizada:
[[1.5 1.44115338]
[1.44115338 1.5 ]]
print ("Autovalores estandarizados:" )
Autovalores estandarizados:
print ("Autovectores estandarizados:" )
Autovectores estandarizados:
[[ 0.70710678 -0.70710678]
[ 0.70710678 0.70710678]]
# 5. Verificación de ortogonalidad
orthogonal = np.dot(eigenvectors[:, 0 ], eigenvectors[:, 1 ])
print ("¿Los autovectores son ortogonales?" )
¿Los autovectores son ortogonales?
# Gráfica de los datos y autovectores
plt.scatter(X[:, 0 ], X[:, 1 ], color= "blue" , label= "Datos" )
plt.quiver(0 , 0 , eigenvectors[0 , 0 ] * np.sqrt(eigenvalues[0 ]), eigenvectors[1 , 0 ] * np.sqrt(eigenvalues[0 ]), color= "red" , scale= 10 , label= "Autovector 1" )
plt.quiver(0 , 0 , eigenvectors[0 , 1 ] * np.sqrt(eigenvalues[1 ]), eigenvectors[1 , 1 ] * np.sqrt(eigenvalues[1 ]), color= "green" , scale= 10 , label= "Autovector 2" )
plt.xlabel("X1" )
plt.ylabel("X2" )
plt.title("Datos y Autovectores" )
plt.legend()
plt.grid()
plt.show()