python - multiple - Ejemplo básico para PCA con matplotlib
plot() python (1)
No creo que la clase mlab.PCA
sea apropiada para lo que quieres hacer. En particular, la clase PCA
vuelve a escalar los datos antes de encontrar los vectores propios:
a = self.center(a)
U, s, Vh = np.linalg.svd(a, full_matrices=False)
El método center
se divide por sigma
:
def center(self, x):
''center the data using the mean and sigma from training set a''
return (x - self.mu)/self.sigma
Esto da como resultado eigenvectors, pca.Wt
, así:
[[-0.70710678 -0.70710678]
[-0.70710678 0.70710678]]
Son perpendiculares, pero no directamente relevantes para los ejes principales de sus datos originales. Son los principales ejes con respecto a los datos de masaje.
Quizás podría ser más fácil codificar lo que desea directamente (sin el uso de la clase mlab.PCA
):
import numpy as np
import matplotlib.pyplot as plt
N = 1000
xTrue = np.linspace(0, 1000, N)
yTrue = 3 * xTrue
xData = xTrue + np.random.normal(0, 100, N)
yData = yTrue + np.random.normal(0, 100, N)
xData = np.reshape(xData, (N, 1))
yData = np.reshape(yData, (N, 1))
data = np.hstack((xData, yData))
mu = data.mean(axis=0)
data = data - mu
# data = (data - mu)/data.std(axis=0) # Uncommenting this reproduces mlab.PCA results
eigenvectors, eigenvalues, V = np.linalg.svd(data.T, full_matrices=False)
projected_data = np.dot(data, eigenvectors)
sigma = projected_data.std(axis=0).mean()
print(eigenvectors)
fig, ax = plt.subplots()
ax.scatter(xData, yData)
for axis in eigenvectors:
start, end = mu, mu + sigma * axis
ax.annotate(
'''', xy=end, xycoords=''data'',
xytext=start, textcoords=''data'',
arrowprops=dict(facecolor=''red'', width=2.0))
ax.set_aspect(''equal'')
plt.show()
Estoy tratando de hacer un análisis simple de componentes principales con matplotlib.mlab.PCA, pero con los atributos de la clase no puedo obtener una solución limpia a mi problema. Aquí hay un ejemplo:
Obtenga algunos datos ficticios en 2D y comience PCA:
from matplotlib.mlab import PCA
import numpy as np
N = 1000
xTrue = np.linspace(0,1000,N)
yTrue = 3*xTrue
xData = xTrue + np.random.normal(0, 100, N)
yData = yTrue + np.random.normal(0, 100, N)
xData = np.reshape(xData, (N, 1))
yData = np.reshape(yData, (N, 1))
data = np.hstack((xData, yData))
test2PCA = PCA(data)
Ahora, solo quiero obtener los componentes principales como vectores en mis coordenadas originales y trazarlos como flechas en mis datos.
¿Cuál es una forma rápida y limpia de llegar allí?
Gracias, Tyrax