Tính hệ số Lagrange cho SVM trong Python


10

Tôi đang cố gắng viết một triển khai SVM đầy đủ bằng Python và tôi có một vài vấn đề khi tính toán các hệ số Lagrange.

Trước tiên, hãy để tôi viết lại những gì tôi hiểu từ thuật toán để đảm bảo rằng tôi đang đi đúng hướng.

Nếu x1,x2,...,xn là một tập dữ liệu và yi{1,1} là nhãn lớp của xi , sau đó

i,yi(wTxi+b)1

Vì vậy, chúng ta chỉ cần giải quyết một vấn đề tối ưu hóa để

w2

tuân theoyi(wTxi+b)1

Xét về các hệ số Lagrange, điều này chuyển thành tìm , và và thu nhỏ:b α = ( α 1 , α 2 , . . . α n ) 0 0 L ( α , w , b ) = 1wbα=(α1,α2,...αn)00

L(α,w,b)=12w2αi(yi(wTx+b)1)

Bây giờ vì và chúng ta có thể viết lại thành L (\ alpha, w, b) = Q (\ alpha) = \ sum \ alpha_i - \ frac12 \ sum \ sum \ alpha_i \ alpha_j y_i y_j x_i ^ T x_j với các ràng buộc \ alpha_i \ geq 0 \ \ văn bản {và} \ \ sum \ alpha_i y_i = 0L

Lw=0w=αiyixi
L ( α , w , b ) = Q ( α ) = α i - 1
Lb=0yiαi=0
αi0Σαiyi=0
L(α,w,b)=Q(α)=αi12αiαjyiyjxiTxj
αi0 and αiyi=0

Vì vậy, tôi đang cố gắng giải quyết vấn đề tối ưu hóa bằng Python và gói miễn phí duy nhất tôi có thể tìm thấy được gọi là cvxopt .

Tôi muốn một số trợ giúp để giải quyết vấn đề này, tôi không thể tìm thấy bất kỳ ví dụ hay nào về điều này, và trong khi tôi hiểu lý thuyết, tôi gặp khó khăn khi dịch nó thành mã (tôi sẽ mong đợi điều ngược lại vì tôi nhiều hơn từ một nền tảng lập trình).

Lưu ý rằng tại một số điểm tôi sẽ muốn giải quyết bằng Kernels nhưng tôi không chắc ý nghĩa của việc giải quyết vấn đề này trong mã là gì.

L(α,w,b)=Q(α)=αi12αiαjyiyjK(xi,xj)

Bất kỳ trợ giúp sẽ được đánh giá rất cao, tôi thực sự không biết làm thế nào để thực hiện điều này trong Python. Nếu bạn có một mô-đun tốt hơn để giải quyết vấn đề tối ưu hóa, tôi cũng muốn đọc về nó.

Câu trả lời:


4

Tôi đã sử dụng cvxopt để thực hiện một SVM trước đây, tuy nhiên trong matlab không phải python. Nó chắc chắn sẽ phục vụ mục đích của bạn, cho dù nó đủ hiệu quả sẽ phụ thuộc vào những gì bạn đang sử dụng nó cho. Các SVM hiệu quả nhất không sử dụng gói bộ giải QP, chúng tận dụng một số tối ưu hóa duy nhất cho SVM. Nhiều người sử dụng thuật toán kiểu SMO để giải quyết nó.

LibSVM là gói SVM sử dụng thuật toán trong Lựa chọn nhóm làm việc bằng cách sử dụng thông tin thứ tự thứ hai cho các máy vectơ hỗ trợ đào tạo . Mã này là mã nguồn mở, nếu bạn quan tâm đến việc xem cách nó được triển khai. Nó cũng có giao diện python.

SVMLight là một gói khác, họ sử dụng một thuật toán khác (xem trang web của họ để tham khảo). Nó cũng là mã nguồn mở và có giao diện python.


Cảm ơn câu trả lời đầy thông tin (mà tôi nghĩ là supercedes của tôi), và chào mừng bạn đến với scicomp!
Aron Ahmadia

+1 câu trả lời thú vị và tôi đã bắt đầu xem xét các liên kết tuyệt vời của bạn đang giúp tôi rất nhiều!
Charles Menguy

2

Dạng chung của vấn đề tối ưu hóa của bạn là Chương trình bậc hai , bất kể bạn đang sử dụng thủ thuật kernel hay kernel tuyến tính. Nghe có vẻ như cvxoptsẽ đủ cho những gì bạn đang cố gắng thực hiện, nhưng những con trăn khác ở đây cũng đã gặp may mắn với OpenOpt .


Aron, bạn có biết trình bao bọc Ipopt Python đã được sửa chưa?
Geoff Oxberry

Một trong những sinh viên của David Ketcheson đã làm cho nó hoạt động với OpenOpt (có thể sử dụng nó với thuật toán gần như Newton), nhưng đã gặp một số khó khăn khi đưa ngăn xếp OpenOpt đi trên OS X.
Aron Ahmadia
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.