0 votes
1 view
in Machine Learning by (13.4k points)

When using PCA in sklearn, it's easy to get out the components:

from sklearn import decomposition

pca = decomposition.PCA(n_components=n_components)

pca_data = pca.fit(input_data)

pca_components = pca.components_

But I can't for the life of me figure out how to get the components out of LDA, as there are no components_ attribute. Is there a similar attribute in sklearn LDA?

1 Answer

0 votes
by (32.8k points)
edited by

If you are using Principle Component Analysis (PCA), then the pca.components_ are the eigenvectors.

In the case of Linear Discriminant Analysis (LDA), we simply need the lda.scalings_ attribute.

For example:

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)   

The lda.scalings_ are the eigenvectors here:

print(lda.scalings_)

print(lda.transform(np.identity(4)))

Output:

[[-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]]

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()

Results:

image

Welcome to Intellipaat Community. Get your technical queries answered by top developers !


Categories

...