решить регуляризованную логистическую регрессию L2 с помощью CVX / CVXPY

В течение 2-3 дней я пытался заставить L2 регуляризованную логистическую регрессию работать в Matlab (CVX) и Python (CVXPY), но безуспешно. Я новичок в выпуклой оптимизации, поэтому очень расстроен. Ниже приводится уравнение, которое я пытаюсь решить с помощью CVX / CVXPY. Я взял это уравнение из статьи https://intentmedia.github.io/assets/2013-10-09-presenting-at-ieee-big-data/pld_js_ieee_bigdata_2013_admm.pdf

введите описание изображения здесь

Мой код Matlab (CVX)

function L2
m = 800; N = 5;
lambda =0.000001;

A = load('/path/to/training/file'); 
b= A(:,6); //Label Matrix (800x1)
A = A(:,1:5); //Feature matrix (800x5)

cvx_begin
    variable x(N)
    minimize( (1/m * sum( log(1+ exp(-1* A' * (b * x')) ) ) ) + lambda*(norm(x,2)))

cvx_end

CVX возвращает ошибку, говорящую, что имеет смысл, но в документе упоминается вышеупомянутое уравнение. Как я могу это решить?

Ваша целевая функция не является скаляром.

Попробовав Matlab, я попробовал CVXPY. Вот код Python

from cvxopt import solvers, matrix,log, exp,mul
from cvxopt.modeling import op,variable
import numpy as np

n = 5
m=800
data = np.ndarray(shape=(m,n), dtype=float,)
bArray = []

file = open('/path/to/training/file')

i = 0;
j=0;
for line in file:
    for num in line.split():
        if(j==5):
            bArray.append(float(num))
        else:
            data[i][j] = num
            j = j + 1

    j=0
    i = i + 1

A = matrix(data)
b_mat= matrix(bArray)
m, n = A.size


lamb_default = 0.000001

x=variable(n)

b = -1*b_mat
w = exp(A.T*b*x)
f = (1/m) + sum(log(1+w)) + lamb_default*mul(x,x)

lp1 = op(f)
lp1.solve()
lp1.status
print(lp1.objective.value())

Я получаю ошибку

TypeError: несовместимые размеры

Итак, мой вопрос: что я делаю не так в коде для расчета проблемы L2 в CVX / CVXPY?


person Behroz Sikander    schedule 16.05.2015    source источник
comment
Скорее всего, это выражение log (1+ exp (-1 * A '* (b * x')) должно читать вместо этого log (1+ exp (- b. * (A * x))), учитывая проблему stmnt выше   -  person alexandre iolov    schedule 16.05.2015


Ответы (1)


Целью вашего кода MATLAB является вывод вектора, а не числа (скаляра). Измените его на:

(1/m * sum( log(1+ exp(-b.* (A * x)) ) ) )

И он вернет одно число.

person mprat    schedule 16.05.2015
comment
Человек, спасибо за тонну. Это сработало. Я тоже новичок в MATLAB, и я посмотрю, что означает. *. Спасибо - person Behroz Sikander; 17.05.2015