2015-07-01 25 views
6

Tôi đang cố gắng sử dụng KernelPCA để giảm thứ nguyên của tập dữ liệu thành 2D (cả cho mục đích trực quan và để phân tích dữ liệu thêm).scikit KernelPCA Kết quả không ổn định

Tôi đã thử nghiệm máy tính KernelPCA sử dụng một hạt nhân RBF ở giá trị khác nhau của Gamma, nhưng kết quả là không ổn định:

anim

(mỗi khung là một giá trị hơi khác nhau của Gamma, nơi Gamma được thay đổi liên tục từ 0 đến 1)

Có vẻ như nó không phải là xác định.

Có cách nào để ổn định nó/làm cho nó xác định?

Mã dùng để tạo ra dữ liệu chuyển đổi:

def pca(X, gamma1): 
    kpca = KernelPCA(kernel="rbf", fit_inverse_transform=True, gamma=gamma1) 
    X_kpca = kpca.fit_transform(X) 
    #X_back = kpca.inverse_transform(X_kpca) 
    return X_kpca 

Trả lời

1

Vì vậy ... Tôi không thể cung cấp cho bạn một câu trả lời dứt khoát về lý do tại sao KernelPCA là không xác định. Hành vi này giống với sự khác biệt mà tôi đã quan sát được giữa các kết quả của PCA và RandomizedPCA. PCA là xác định, nhưng RandomizedPCA không phải là, và đôi khi các eigenvectors được flipped trong dấu hiệu liên quan đến eigenvectors PCA.

Điều đó dẫn tôi đến ý tưởng mơ hồ về cách bạn có thể nhận được nhiều kết quả xác định hơn .... có thể. Sử dụng RBFSampler với hạt giống cố định:

def pca(X, gamma1): 
    kernvals = RBFSampler(gamma=gamma1, random_state=0).fit_transform(X) 
    kpca = PCA().fit_transform(X) 
    X_kpca = kpca.fit_transform(X) 
    return X_kpca 
3

Hạt nhânPCA nên được xác định và phát triển liên tục với gamma.
Nó khác với RBFSampler có sẵn ngẫu nhiên để cung cấp một xấp xỉ hiệu quả (khả năng mở rộng) xấp xỉ của hạt nhân RBF.

Tuy nhiên những gì có thể thay đổi trong KernelPCA là thứ tự trong những thành phần chủ yếu: trong scikit-học họ được trả về được sắp xếp theo thứ tự eigenvalue giảm dần, vì vậy nếu bạn có 2 giá trị riêng gần nhau nó có thể là thứ tự thay đổi với gamma.

Đoán của tôi (từ gif) là đây là những gì đang xảy ra ở đây: các trục dọc theo đó bạn đang vẽ không phải là hằng số để dữ liệu của bạn dường như nhảy xung quanh.

Bạn có thể cung cấp mã bạn đã sử dụng để tạo gif không?

Tôi đoán đó là cốt truyện của các điểm dữ liệu dọc theo 2 thành phần chính đầu tiên nhưng sẽ giúp bạn biết cách bạn tạo ra nó.

Bạn có thể thử kiểm tra kỹ hơn bằng cách xem các giá trị của kpca.alphas_ (giá trị riêng) cho mỗi giá trị của gamma.

Hy vọng điều này có ý nghĩa.

EDIT: Như bạn đã nhận thấy có vẻ như các điểm được phản xạ trên trục, lời giải thích hợp lý nhất là một trong các dấu hiệu riêng rẽ của fligenvector (lưu ý điều này không ảnh hưởng đến giá trị riêng).

Tôi đặt trong a simple gist để tái tạo sự cố (bạn sẽ cần một sổ tay Jupyter để chạy nó). Bạn có thể thấy dấu hiệu lật khi bạn thay đổi giá trị của gamma.

Như một lưu ý bổ sung cho thấy sự khác biệt này xảy ra chỉ vì bạn phù hợp với nhiều lần đối tượng KernelPCA nhiều lần. Khi bạn đã giải quyết với một giá trị gamma cụ thể và bạn đã điều chỉnh kpca một khi bạn có thể gọi chuyển đổi nhiều lần và nhận được kết quả nhất quán. Đối với cổ điển PCA the docs đề cập rằng:

Do sự tinh tế thi hành Số ít giá trị gia tăng phân hủy (SVD), được sử dụng trong việc thực hiện này, chạy phù hợp với hai lần trên cùng một ma trận có thể dẫn đến các thành phần chủ yếu có dấu hiệu lật (thay đổi hướng). Vì lý do này, điều quan trọng là luôn luôn sử dụng cùng một đối tượng ước lượng để chuyển đổi dữ liệu theo kiểu nhất quán.

Tôi không biết về hành vi của một đối tượng KernelPCA đơn lẻ mà bạn có thể khớp với nhiều lần (tôi không tìm thấy bất kỳ điều gì có liên quan trong tài liệu).

Nó không áp dụng cho trường hợp của bạn mặc dù bạn phải phù hợp với đối tượng với một số giá trị gamma.

+0

Có, cốt truyện là hai thành phần chính đầu tiên – fferri

+1

Ok. Bạn có thấy thứ tự của các thành phần có thể ảnh hưởng đến cốt truyện của bạn không? Giả sử 2 thành phần đầu tiên của bạn là e1 và e2, với các giá trị riêng liên quan a1 và a2. Đối với gamma = 0,5, a1> a2. Vì vậy, KernelPCA trả về các eigenvectors theo thứ tự e1, e2, e3 ... Đối với gamma = 0,6, a2> a1. Bây giờ bạn đang nhận e2, e1, e3 ... và trục của bạn trên cốt truyện được đổi chỗ. – ldirer

+0

Dường như dấu hiệu lật ngược giá trị riêng. Nếu hoán đổi các trục (x với y), tôi nên quan sát các điểm * chuyển vị *. Thay vào đó, các điểm * phản ánh * trong x hoặc y. Bạn không đồng ý – fferri

Các vấn đề liên quan