2013-08-22 50 views
6

Thuật toán hình vuông một phần (PLS) được thực hiện trong thư viện học hỏi scikit, như được ghi ở đây: http://scikit-learn.org/0.12/auto_examples/plot_pls.html Trong trường hợp y là một vector nhị phân, một biến thể của thuật toán này đang được sử dụng , Thuật toán Phân tích Phân biệt đối xử (PLS-DA) một phần nhỏ nhất. Mô-đun PLSRegression trong sklearn.pls có thực thi trường hợp nhị phân này không? Nếu không, nơi tôi có thể tìm thấy một thực hiện python cho nó? Trong trường hợp nhị phân của tôi, tôi đang cố gắng để sử dụng PLSRegression:Thuật toán PLS-DA trong python

pls = PLSRegression(n_components=10) 
pls.fit(x, y) 
x_r, y_r = pls.transform(x, y, copy=True) 

Trong chuyển đổi chức năng, các mã được ngoại lệ trong dòng này:

y_scores = np.dot(Yc, self.y_rotations_) 

Các thông báo lỗi là "ValueError: ma trận không được căn chỉnh ". Yc là vectơ y chuẩn hóa và self.y_rotations_ = [1.]. Trong hàm phù hợp, self.y_rotations_ = np.ones (1) nếu y ban đầu là một véc tơ đơn biến (y.shape 1 = 1).

+2

Bạn đã bao giờ giải quyết vấn đề này chưa? Tôi đã thử phương pháp tương tự (sử dụng phiên bản mới nhất của scikit-tìm hiểu) và có vẻ như làm PLS-DA hoàn hảo. Điều quan trọng là gắn nhãn các lớp với 1 và 0 (cho cùng một lớp/khác). Nếu bạn vẫn không thể làm cho nó hoạt động, bạn có thể đăng dữ liệu của mình không? – mfitzp

+0

Chưa giải quyết được nhưng tôi sẽ dùng giải pháp user3178149. Cảm ơn vì đã giúp bạn! –

+0

@mfitzp Là hồi quy vuông góc một phần giống như phân tích phân biệt đối xử một phần nhỏ nhất? Tôi đang cố gắng tìm ra cách để có được lô từ hai thành phần đầu tiên. –

Trả lời

0

Không chính xác những gì bạn đang tìm kiếm, nhưng bạn kiểm hai luồng này về làm thế nào để gọi tới một người gốc (c/C++ code) từ một con trăn và một C++ PLS libs thực hiện:

Partial Least Squares Library

Calling C/C++ from python?

bạn có thể sử dụng boost.python để nhúng mã C++ vào python. Dưới đây là ví dụ được lấy từ số official site:

Theo truyền thống C/C++, hãy bắt đầu với "hello, world". Một C++ Chức năng:

char const* greet() 
{ 
    return "hello, world"; 
} 

có thể được tiếp xúc với Python bằng cách viết một wrapper Boost.Python:

#include <boost/python.hpp> 

BOOST_PYTHON_MODULE(hello_ext) 
{ 
    using namespace boost::python; 
    def("greet", greet); 
} 

Vậy là xong. Đã được thực hiện. Bây giờ chúng ta có thể xây dựng nó như một thư viện được chia sẻ. DLL kết quả bây giờ được hiển thị cho Python. Đây là một phiên Python mẫu:

>>> import hello_ext 
>>> print hello_ext.greet() 
hello, world 
13

PLS-DA thực sự là một "mẹo" để sử dụng PLS cho kết quả phân loại thay vì véc tơ/ma trận liên tục thông thường. Bí quyết bao gồm việc tạo ra một ma trận nhận diện giả của số không/cái đại diện cho thành viên cho từng loại. Vì vậy, nếu bạn có kết quả nhị phân được dự đoán (tức là nam/nữ, có/không, v.v.) ma trận giả của bạn sẽ có HAI cột đại diện cho tư cách thành viên cho một trong hai danh mục.

Ví dụ: xem xét giới tính kết quả cho bốn người: 2 nam và 2 nữ.Ma trận giả nên được mã hóa như:

import numpy as np 
dummy=np.array([[1,1,0,0],[0,0,1,1]]).T 

, trong đó mỗi cột đại diện cho các thành viên với hai loại (nam, nữ)

Sau đó, mô hình của bạn cho dữ liệu trong biến Xdata (hình 4 hàng, cột tùy ý) sẽ là:

myplsda=PLSRegression().fit(X=Xdata,Y=dummy) 

các loại dự đoán có thể được chiết xuất từ ​​so sánh hai biến chỉ trong mypred:

mypred= myplsda.predict(Xdata) 

Đối với mỗi hàng/vụ, giới tính được dự đoán là với tư cách thành viên được dự đoán cao nhất.

+1

Nếu dữ liệu của bạn chỉ chứa hai lớp, tốt hơn nên trình bày y như một cột đơn, sau đó thực hiện hồi quy và xác định lớp bằng giá trị nửa giá trị của hai lớp, ví dụ, nếu 1 là cho lớp một và -1 cho lớp khác, ngưỡng là 0. Có tồn tại vấn đề nếu ma trận của y được sử dụng. Đây cũng là lý do tại sao PLSDA không được khuyến khích cho vấn đề đa lớp. Xem giấy _Partial bình phương nhỏ nhất phân tích phân biệt đối xử: lấy đi phép thuật_ để thảo luận chi tiết. – Elkan