2014-11-16 16 views
7

Wenn ich versuche, mit LDA arbeiten von Scikit-Learn, nur hält mich eine Komponente zu geben, auch wenn ich für mehr bin zu fragen:LDA ignorieren n_components?

/Users/orthogonal/virtualenvs/osxml/lib/python2.7/site-packages/sklearn/lda.py:161: UserWarning: Variables are collinear 
    warnings.warn("Variables are collinear") 
array([[-0.12635305], 
     [-1.09293574], 
     [ 1.83978459], 
     [-0.37521856], 
     [-0.24527725]]) 
array([[-0.12635305], 
     [-1.09293574], 
     [ 1.83978459], 
     [-0.37521856], 
     [-0.24527725]]) 
array([[-0.12635305], 
     [-1.09293574], 
     [ 1.83978459], 
     [-0.37521856], 
     [-0.24527725]]) 
array([[-0.12635305], 
     [-1.09293574], 
     [ 1.83978459], 
     [-0.37521856], 
     [-0.24527725]]) 
array([[-0.12635305], 
     [-1.09293574], 
     [ 1.83978459], 
     [-0.37521856], 
     [-0.24527725]]) 

Wie Sie sehen können

>>> from sklearn.lda import LDA 
>>> x = np.random.randn(5,5) 
>>> y = [True, False, True, False, True] 
>>> for i in range(1,6): 
...  lda = LDA(n_components=i) 
...  model = lda.fit(x,y) 
...  model.transform(x) 

Gewährt Es wird nur jeweils eine Dimension gedruckt. Warum ist das? Hat es etwas damit zu tun, dass die Variablen kollinear sind?

Zusätzlich, wenn ich dies mit Scikit-Learns PCA mache, gibt es mir, was ich will.

>>> from sklearn.decomposition import PCA 
>>> for i in range(1,6): 
...  pca = PCA(n_components=i) 
...  model = pca.fit(x) 
...  model.transform(x) 
... 
array([[ 0.83688322], 
     [ 0.79565477], 
     [-2.4373344 ], 
     [ 0.72500848], 
     [ 0.07978792]]) 
array([[ 0.83688322, -1.56459039], 
     [ 0.79565477, 0.84710518], 
     [-2.4373344 , -0.35548589], 
     [ 0.72500848, -0.49079647], 
     [ 0.07978792, 1.56376757]]) 
array([[ 0.83688322, -1.56459039, -0.3353066 ], 
     [ 0.79565477, 0.84710518, -1.21454498], 
     [-2.4373344 , -0.35548589, -0.16684946], 
     [ 0.72500848, -0.49079647, 1.09006296], 
     [ 0.07978792, 1.56376757, 0.62663807]]) 
array([[ 0.83688322, -1.56459039, -0.3353066 , 0.22196922], 
     [ 0.79565477, 0.84710518, -1.21454498, -0.15961993], 
     [-2.4373344 , -0.35548589, -0.16684946, -0.04114339], 
     [ 0.72500848, -0.49079647, 1.09006296, -0.2438673 ], 
     [ 0.07978792, 1.56376757, 0.62663807, 0.2226614 ]]) 
array([[ 8.36883220e-01, -1.56459039e+00, -3.35306597e-01, 
      2.21969223e-01, -1.66533454e-16], 
     [ 7.95654771e-01, 8.47105182e-01, -1.21454498e+00, 
     -1.59619933e-01, 3.33066907e-16], 
     [ -2.43733440e+00, -3.55485895e-01, -1.66849458e-01, 
     -4.11433949e-02, 0.00000000e+00], 
     [ 7.25008484e-01, -4.90796471e-01, 1.09006296e+00, 
     -2.43867297e-01, -1.38777878e-16], 
     [ 7.97879229e-02, 1.56376757e+00, 6.26638070e-01, 
      2.22661402e-01, 2.22044605e-16]]) 
+0

können Sie posten, wie Sie alles drucken? – pyCthon

+1

Dies ist nur in der Python-Interpreter, so dass model.transform (x) wird ausgegeben, was Sie sehen. –

+0

Ah ok vergiss dann – pyCthon

Antwort

10

This ist die relevante, Dimension mindernde Linie LDA.transform, verwendet es scalings_. Wie in der docstring beschrieben, hat scalings_ maximal n_classes - 1 Spalten. Dies ist dann die maximale Anzahl von Spalten, die Sie mit transform erreichen können. In Ihrem Fall, 2 Klassen (True, False), ergibt maximal 1 Spalte.

+0

Ich verstehe es nicht. Wie kann ich LDA bekommen, um meine Daten von 5 auf 4 Dimensionen zu reduzieren? –

+1

Du kannst nicht (zumindest nicht mit normaler Vanille lda). Check out [der Wikipedia-Eintrag auf multiclass lda] (http://en.wikipedia.org/wiki/Linear_discriminant_analysis#Multiclass_LDA). Die Matrix, die konstruiert ist, um zwischen Klassenvarianzen innerhalb/innerhalb von Klassen zu erfassen, hat höchstens den Rang "n_Klassen - 1", was nur zu höchstens "n_Klassen - 1" -Richtungen führt, die irgendeine Varianz erfassen. Für 2 Klassen reduziert sich dies auf genau einen Diskriminantenvektor. – eickenberg

+0

Hmmm, ok ... überall, wo ich mehr über das, was du beschreibst, erfahren könnte, d. H. Das erklärt es wirklich klar und detailliert? –