Подтвердить что ты не робот

Как получить компоненты для LDA в scikit-learn?

При использовании PCA в sklearn легко выйти из компонентов:

from sklearn import decomposition
pca = decomposition.PCA(n_components=n_components)
pca_data = pca.fit(input_data)
pca_components = pca.components_

Но я не могу на всю жизнь понять, как получить компоненты из LDA, так как нет атрибута components_. Есть ли аналогичный атрибут в sklearn lda?

4b9b3361

Ответ 1

В случае PCA документация понятна. pca.components_ являются собственными векторами.

В случае LDA нам нужен атрибут lda.scalings_.


Визуальный пример использования данных радужной оболочки и 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)   

Убедитесь, что lda.scalings_ являются собственными векторами:

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

Кроме того, вот полезная функция для построения графика и проверки визуально:

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

Ответ 2

Существует атрибут coef_, который, вероятно, содержит то, что вы ищете. Он должен быть документирован. Поскольку это линейная функция решения, coef_, вероятно, является правильным именем в схеме именования sklearn.

Вы также можете напрямую использовать метод transform для представления данных в новое пространство.

Ответ 3

Мое чтение кода заключается в том, что атрибут coef_ используется для взвешивания каждого из компонентов при подсчете выборочных функций для разных классов. scaling - собственный вектор, а xbar_ - среднее. В духе UTSL, здесь источник для функции решения: https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/lda.py#L188

Ответ 4

В PCA операция преобразования использует self.components_.T (см. код):

    X_transformed = np.dot(X, self.components_.T)

В LDA операция преобразования использует self.scalings_ (см. код):

    X_new = np.dot(X, self.scalings_)


Обратите внимание на .T, который переносит массив в PCA, а не в LDA:

  • PCA: components_ : array, shape (n_components, n_features)
  • LDA: scalings_ : array, shape (n_features, n_classes - 1)