Tại sao LDA của Scikit-learn LDA không hoạt động chính xác và làm thế nào để tính toán LDA qua SVD?


26

Tôi đã sử dụng Phân tích phân biệt tuyến tính (LDA) từ scikit-learnthư viện máy học (Python) để giảm kích thước và có một chút tò mò về kết quả. Bây giờ tôi đang tự hỏi LDA scikit-learnđang làm gì để kết quả trông khác với, ví dụ, cách tiếp cận thủ công hoặc LDA được thực hiện ở R. Thật tuyệt nếu ai đó có thể cung cấp cho tôi một số thông tin chi tiết ở đây.

Điều cơ bản liên quan nhất là việc scikit-plothiển thị một mối tương quan giữa hai biến trong đó cần có một mối tương quan 0.

Để thử nghiệm, tôi đã sử dụng bộ dữ liệu Iris và 2 phân biệt tuyến tính đầu tiên trông như thế này:

IMG-1. LDA thông qua scikit-learn

nhập mô tả hình ảnh ở đây

Điều này về cơ bản phù hợp với kết quả tôi tìm thấy trong tài liệu scikit-learn tại đây.

Bây giờ, tôi đã đi qua LDA từng bước và có một hình chiếu khác. Tôi đã thử các cách tiếp cận khác nhau để tìm hiểu điều gì đang xảy ra:

IMG-2. LDA trên dữ liệu thô (không định tâm, không chuẩn hóa)

nhập mô tả hình ảnh ở đây

Và đây sẽ là cách tiếp cận từng bước nếu tôi chuẩn hóa (chuẩn hóa điểm z; phương sai đơn vị) dữ liệu trước. Tôi đã làm điều tương tự chỉ với định tâm trung bình, điều này sẽ dẫn đến cùng một hình ảnh chiếu tương đối (và nó thực sự đã làm).

IMG-3. LDA từng bước sau khi định tâm trung bình hoặc tiêu chuẩn hóa

nhập mô tả hình ảnh ở đây

IMG-4. LDA trong R (cài đặt mặc định)

LDA trong IMG-3 nơi tôi tập trung dữ liệu (sẽ là cách tiếp cận ưa thích) trông cũng giống hệt như dữ liệu mà tôi đã tìm thấy trong Bài đăng của một người đã thực hiện LDA trong R nhập mô tả hình ảnh ở đây


Mã để tham khảo

Tôi không muốn dán tất cả mã ở đây, nhưng tôi đã tải nó lên dưới dạng sổ ghi chép IPython ở đây được chia thành một số bước tôi đã sử dụng (xem bên dưới) cho phép chiếu LDA.

  1. Bước 1: Tính toán các vectơ trung bình d chiều
    mi=1nixDinxk
  2. Bước 2: Tính toán ma trận phân tán

    2.1 trong lớp ma trận tán xạ được tính bằng phương trình sau: S W = c Σ i = 1 S i = c Σ i = 1 n Σ xD i ( x - m i )SW

    SW=i=1cSi=i=1cxDin(xmi)(xmi)T

    2.2 Ma trận phân tán giữa các lớp SB

    SB=i=1cni(mim)(mim)T
    m
  3. SW1SB

    3.1. Sắp xếp các hàm riêng bằng cách giảm giá trị riêng

    d×kW

  4. y=WT×x.

Tôi đã không trải qua để tìm kiếm sự khác biệt, nhưng bạn có thể thấy chính xác những gì scikit-learn đang làm trong nguồn .
Dougal

Có vẻ như họ cũng đang chuẩn hóa (định tâm và sau đó chia tỷ lệ thông qua phân chia theo độ lệch chuẩn). Điều này, tôi mong đợi một kết quả tương tự với kết quả trong âm mưu thứ 3 (và R) của tôi ... hmm

Thật kỳ lạ: cốt truyện bạn có được với scikit (và cốt truyện họ thể hiện trong tài liệu của họ) không có ý nghĩa gì. LDA luôn mang lại các phép chiếu có tương quan bằng 0, nhưng rõ ràng có mối tương quan rất mạnh giữa các phép chiếu của scikit trên các trục phân biệt 1 và 2. Có gì đó rõ ràng sai ở đó.
amip nói rằng Phục hồi lại

@ameoba Vâng, tôi cũng nghĩ vậy. Điều kỳ lạ là cùng một cốt truyện tôi đang trình bày cho scikit có trong tài liệu ví dụ: scikit-learn.org/ sóng / auto_examples / decysis /. Điều đó khiến tôi nghĩ rằng việc sử dụng scikit của tôi đúng, nhưng có gì đó kỳ lạ về chức năng LDA

@SebastianRaschka: Vâng, tôi nhận thấy. Thật là kỳ lạ. Tuy nhiên, lưu ý rằng các lô LDA đầu tiên của bạn (không phải là scikit) cũng cho thấy mối tương quan khác không và do đó cũng có điều gì đó không ổn với nó. Bạn đã tập trung dữ liệu? Phép chiếu trên trục thứ hai dường như không có nghĩa là không.
amip nói phục hồi Monica

Câu trả lời:


20

Cập nhật: Nhờ thảo luận này, scikit-learnđã được cập nhật và hoạt động chính xác ngay bây giờ. Mã nguồn LDA của nó có thể được tìm thấy ở đây . Vấn đề ban đầu là do một lỗi nhỏ (xem phần thảo luận về github này ) và câu trả lời của tôi thực sự không chỉ ra chính xác (xin lỗi vì bất kỳ sự nhầm lẫn nào gây ra). Vì tất cả những điều đó không còn quan trọng nữa (lỗi đã được sửa), tôi đã chỉnh sửa câu trả lời của mình để tập trung vào cách giải quyết LDA thông qua SVD, đây là thuật toán mặc định scikit-learn.


Sau khi xác định ma trận phân tán trong và giữa lớp ΣWΣBΣW1ΣB

  1. ΣW1/2

    ΣW=USUΣW1/2=US1/2UXW=ULVΣW1/2=UL1U

  2. ΣW1/2ΣBΣW1/2A

    XBΣW1/2

  3. AΣW1/2A

    a

    ΣW1/2ΣBΣW1/2a=λa,
    ΣW1/2a=ΣW1/2a
    ΣW1ΣBa=λa.

Tóm lại, LDA tương đương với việc làm trắng ma trận của phương tiện lớp đối với hiệp phương sai trong lớp, thực hiện PCA trên phương tiện lớp và chuyển đổi ngược lại các trục chính kết quả vào không gian ban đầu (không được bảo vệ).

Điều này được chỉ ra, ví dụ như trong Các yếu tố của học thống kê , phần 4.3.3. Trong scikit-learnđây là cách mặc định để tính LDA vì SVD của một ma trận dữ liệu là số lượng ổn định hơn eigen-phân hủy của ma trận hiệp phương sai của nó.

ΣW1/2scikit-learn L1UUL1U


1
Cảm ơn câu trả lời tốt đẹp này. Tôi đánh giá cao rằng bạn đã dành thời gian để viết nó lên một cách độc đáo. Có lẽ bạn có thể đề cập đến nó trong cuộc thảo luận về GitHub; Tôi chắc chắn rằng sẽ có ích khi sửa LDA trong phiên bản tiếp theo của bộ khoa học viễn tưởng

@SebastianRaschka: Tôi không có tài khoản trên GitHub. Nhưng nếu bạn muốn, bạn có thể cung cấp cho một liên kết đến chủ đề này.
amip nói phục hồi Monica

ΣW1ΣBΣW1


2
ΣBΣW1ΣBΣW1(μ1μ2)μi
amip nói phục hồi Monica

3

Chỉ cần đóng câu hỏi này, vấn đề thảo luận với LDA đã được khắc phục trong scikit-learn 0.15.2 .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.