python - shrinkage - sklearn ensemble
¿Cómo obtengo los componentes para LDA en scikit-learn? (4)
En PCA, la operación de transformación utiliza self.components_.T
(ver el código ):
X_transformed = np.dot(X, self.components_.T)
En LDA, la operación de transformación utiliza self.scalings_
(ver el código ):
X_new = np.dot(X, self.scalings_)
Tenga en cuenta el .T
que transpone la matriz en la PCA, y no en LDA:
- PCA:
components_ : array, shape (n_components, n_features)
- LDA:
scalings_ : array, shape (n_features, n_classes - 1)
Cuando se usa PCA en sklearn, es fácil sacar los componentes:
from sklearn import decomposition
pca = decomposition.PCA(n_components=n_components)
pca_data = pca.fit(input_data)
pca_components = pca.components_
Pero no puedo, por mi vida, descubrir cómo sacar los componentes de LDA, ya que no hay ningún atributo components_. ¿Hay un atributo similar en sklearn lda?
Hay un atributo coef_
que probablemente contiene lo que estás buscando. Se debe documentar. Como esta es una función de decisión lineal, coef_
es probablemente el nombre correcto en el esquema de asignación de nombres de sklearn.
También puede utilizar directamente el método de transform
para proyectar datos al nuevo espacio.
Mi lectura del código es que el atributo coef_
se usa para ponderar cada uno de los componentes al puntuar las características de una muestra en comparación con las diferentes clases. scaling
es el vector propio y xbar_
es la media. En el espíritu de UTSL, aquí está la fuente de la función de decisión: https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/lda.py#L188
En el caso de PCA , la documentación es clara. Los pca.components_
son los vectores propios.
En el caso de LDA , necesitamos el atributo lda.scalings_
.
Ejemplo visual utilizando datos de iris y sklearn:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
iris = datasets.load_iris()
X = iris.data
y = iris.target
#In general it is a good idea to scale the data
scaler = StandardScaler()
scaler.fit(X)
X=scaler.transform(X)
lda = LinearDiscriminantAnalysis()
lda.fit(X,y)
x_new = lda.transform(X)
Verifique que lda.scalings_ son los vectores propios:
print(lda.scalings_)
print(lda.transform(np.identity(4)))
[[-0.67614337 0.0271192 ]
[-0.66890811 0.93115101]
[ 3.84228173 -1.63586613]
[ 2.17067434 2.13428251]]
[[-0.67614337 0.0271192 ]
[-0.66890811 0.93115101]
[ 3.84228173 -1.63586613]
[ 2.17067434 2.13428251]]
Además, aquí hay una función útil para trazar el biplot y verificar visualmente:
def myplot(score,coeff,labels=None):
xs = score[:,0]
ys = score[:,1]
n = coeff.shape[0]
plt.scatter(xs ,ys, c = y) #without scaling
for i in range(n):
plt.arrow(0, 0, coeff[i,0], coeff[i,1],color = ''r'',alpha = 0.5)
if labels is None:
plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, "Var"+str(i+1), color = ''g'', ha = ''center'', va = ''center'')
else:
plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, labels[i], color = ''g'', ha = ''center'', va = ''center'')
plt.xlabel("LD{}".format(1))
plt.ylabel("LD{}".format(2))
plt.grid()
#Call the function.
myplot(x_new[:,0:2], lda.scalings_)
plt.show()
Resultados