pyplot multiple python matplotlib pca

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