2016-05-31 20 views
13

Định dạng ngắn:Sử dụng R cho hồi quy logistic đa lớp

Làm thế nào để thực hiện các thuật toán phân loại hồi quy logistic đa lớp thông qua độ dốc trong R? Có thể sử dụng optim() khi có nhiều hơn hai nhãn không?

Mã MatLab là:

function [J, grad] = cost(theta, X, y, lambda) 
    m = length(y); 
    J = 0; 
    grad = zeros(size(theta)); 
    h_theta = sigmoid(X * theta); 
    J = (-1/m)*sum(y.*log(h_theta) + (1-y).*log(1-h_theta)) +... 
    (lambda/(2*m))*sum(theta(2:length(theta)).^2); 
    trans = X'; 
    grad(1) = (1/m)*(trans(1,:))*(h_theta - y); 
    grad(2:size(theta, 1)) = 1/m * (trans(2:size(trans,1),:)*(h_theta - y) +... 
    lambda * theta(2:size(theta,1),:)); 
    grad = grad(:); 
end 

và ...

function [all_theta] = oneVsAll(X, y, num_labels, lambda) 
    m = size(X, 1); 
    n = size(X, 2); 
    all_theta = zeros(num_labels, n + 1); 
    initial_theta = zeros(n+1, 1); 
    X = [ones(m, 1) X]; 
    options = optimset('GradObj', 'on', 'MaxIter', 50); 
     for c = 1:num_labels, 
    [theta] = ... 
     fmincg (@(t)(cost(t, X, (y == c), lambda)), ... 
       initial_theta, options); 
    all_theta(c,:) = theta'; 
end 

định dạng Long:

Mặc dù có lẽ không cần phải làm theo các câu hỏi, các dữ liệu có thể đã tải xuống here và một khi đã được tải xuống và được đặt trong thư mục R, được tải dưới dạng:

library(R.matlab) 
data <- readMat('data.mat') 
str(data) 
List of 2 
$ X: num [1:5000, 1:400] 0 0 0 0 0 0 0 0 0 0 ... 
$ y: num [1:5000, 1] 10 10 10 10 10 10 10 10 10 10 ... 

Vì vậy X là một ma trận với 5.000 ví dụ, mỗi chứa 400 tính năng, mà xảy ra được 400 pixel của một hình ảnh 20 x 20 của một chữ số viết tay 1-10, như trong ví dụ này 9:

enter image description here

Áp dụng một thuật toán hồi quy logistic để dự đoán số viết tay dựa trên "computer vision" của các giá trị trong những 400 pixel trình bày những thách thức bổ sung không phải là một quyết định nhị phân. Tối ưu hóa các hệ số có thể không hiệu quả với vòng lặp gốc gradient ad hoc như trong số R-bloggers example này.

Có một ví dụ điển hình được thực hiện tốt trong R-bloggers dựa trên hai biến giải thích (tính năng) và kết quả nhị phân. Ví dụ sử dụng hàm optim() R, có vẻ như là the way to go.

Mặc dù tôi đã đọc tài liệu, tôi đang gặp vấn đề thiết lập ví dụ phức tạp hơn này, nơi mà chúng ta phải quyết định trong số 10 kết quả tốt:

library(R.matlab) 
    data <- readMat('data.mat') 

    X = data$X     # These are the values for the pixels in all 5000 examples. 
    y = data$y     # These are the actual correct labels for each example. 
    y = replace(y, y == 10, 0) # Replacing 10 with 0 for simplicity. 

    # Defining the sigmoid function for logistic regression. 
     sigmoid = function(z){ 
      1/(1 + exp(-z)) 
     } 

    X = cbind(rep(1, nrow(X)), X) # Adding an intercept or bias term (column of 1's). 

    # Defining the regularized cost function parametrized by the coefficients. 

     cost = function(theta){ 
      hypothesis = sigmoid(X%*%theta) 
      # In "J" below we will need to have 10 columns of y: 
      y = as.matrix(model.matrix(lm(y ~ as.factor(y)))) 
      m = nrow(y) 
      lambda = 0.1 
      # The regularized cost function is: 
      J = (1/m) * sum(-y * log(hypothesis) - (1 - y) * log(1 - hypothesis)) + 
    (lambda/(2 * m)) * sum(theta[2:nrow(theta), 1]^2) 
      J 
     } 

    no.pixels_plus1 = ncol(X)  # These are the columns of X plus the intercept. 
    no.digits = length(unique(y)) # These are the number of labels (10). 
    # coef matrix rows = no. of labels; cols = no. pixels plus intercept: 
    theta_matrix = t(matrix(rep(0, no.digits*no.pixels_plus1), nrow = no.digits)) 
    cost(theta_matrix) # The initial cost: 
    # [1] 0.6931472 
    theta_optim = optim(par = theta_matrix, fn = cost) # This is the PROBLEM step! 

Rõ ràng điều này dường như không đầy đủ, và mang lại cho tôi những lỗi tin nhắn:

Error in X %*% theta : non-conformable arguments 

Lưu ý rằng X%*%theta_matrix được thực hiện mà không có bất kỳ vấn đề nào. Vì vậy, vấn đề phải ở trong thực tế là tôi có 10 bộ phân loại (0 đến 9) và tôi buộc phải tạo ma trận với các vectơ cột 10 y để làm cho các hoạt động khả thi với hàm cost. Có thể là giải pháp đi qua mã giả với vector y với một số dòng như: y = as.matrix(model.matrix(lm(y ~ as.factor(y)))) như trong mã không hoạt động của tôi ở trên, nhưng một lần nữa, tôi không biết rằng điều này đóng gói ý tưởng "một-so-tất cả" - OK, có lẽ không, và có lẽ đây là vấn đề.

Nếu không, có vẻ như nó hoạt động trên R-bloggers post với trình phân loại nhị phân và cực kỳ song song với mã giống hệt nhau.

Vậy cú pháp đúng cho vấn đề này là gì?

Lưu ý rằng I have tried to work it out one digit against all others, nhưng tôi không nghĩ rằng điều đó có ý nghĩa về mặt phức tạp.

+0

Tôi hơi bối rối. nếu bạn muốn sử dụng 'tối ưu', bạn cần viết hàm khả năng thích hợp. tại sao không viết các hàm khả năng phân loại đa thức và chỉ lấy nó từ đó? – Elad663

+0

Bản sao có thể có của [Cách tối ưu hóa làm việc với phép nhân ma trận bên trong hàm để được tối đa hóa trong R] (http://stackoverflow.com/questions/13386801/how-to-get-optim-working-with-matrix-multiplication -trên-chức năng-thành-ma) –

Trả lời

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