2014-11-16 18 views
7

Khi tôi đang cố gắng để làm việc với LDA từ Scikit-Tìm hiểu, nó vẫn không ngừng chỉ đem lại cho tôi một phần, mặc dù tôi yêu cầu để biết thêm:LDA bỏ qua n_components?

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

Cho

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

Như bạn có thể nhìn thấy , nó chỉ in ra một chiều mỗi lần. Tại sao điều này? Liệu nó có liên quan gì đến các biến được sắp xếp không?

Ngoài ra, khi tôi làm điều này với PC của Scikit-Learn, nó mang lại cho tôi những gì tôi muốn.

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

bạn có thể đăng cách in mọi thứ không? – pyCthon

+1

Đây chỉ là trong trình thông dịch Python, vì vậy model.transform (x) sẽ xuất ra những gì bạn thấy. –

+0

Ah ok nevermind sau đó – pyCthon

Trả lời

10

This là, yếu tố-giảm dòng có liên quan của LDA.transform, nó sử dụng scalings_. Như được mô tả trong các docstring, scalings_ có tối đa n_classes - 1 cột. Đây là số cột tối đa bạn có thể hy vọng có được bằng cách sử dụng transform. Trong trường hợp của bạn, 2 lớp (True, False), sản lượng tối đa 1 cột.

+0

Tôi không hiểu. Làm thế nào tôi có thể nhận được LDA để giảm dữ liệu của tôi từ 5 đến 4 kích thước sau đó? –

+1

Bạn không thể (ít nhất là không phải với vanilla lda bình thường). Kiểm tra [mục wikipedia trên lda đa lớp] (http://en.wikipedia.org/wiki/Linear_discriminant_analysis#Multiclass_LDA). Ma trận được xây dựng để nắm bắt giữa/bên trong các phương sai lớp là xếp hạng ở hầu hết 'n_classes - 1', do đó chỉ có thể sử dụng hầu hết các' n_classes - 1' hướng để nắm bắt bất kỳ phương sai nào. Đối với 2 lớp, điều này làm giảm chính xác 1 vector phân biệt đối xử. – eickenberg

+0

Hmmm, ok ... bất kỳ nơi nào tôi có thể tìm hiểu thêm về cụ thể những gì bạn mô tả, tức là điều đó giải thích rõ ràng và chi tiết? –