2012-04-25 2 views
1

Я использую логистическую регрессию с scipy.optimize.fmin_bfgs для минимизации функции стоимости. Функция стоимости остается постоянной для моего конкретного набора данных, и BFGS не сходится, поэтому я хочу применить регуляцию lasso + ridge.автоматически останавливает scipy.optimize.fmin_bfgs после n вызовов функций (не итераций BFGS!)

Теперь я хочу, чтобы попробовать оптимизировать затраты для различных значений параметров регуляризации lambda1/2 для того, чтобы найти наилучшее сочетание:

for lambda1 in range(...): 
    for lambda2 in range(..): 
     scipy.optimize.fmin_bfgs(...) # Optimize cost with lambda1 and lambda2 

Проблема заключается в том, что, поскольку BFGS не сходящиеся, он остается «навсегда» в вызове для первых значений лямбда1/2.

Есть ли способ автоматически остановить fmin_bfgs через некоторое время? Параметр maxiter не помогает мне, потому что у меня есть 1000 образцов и большое количество функций/образцов, поэтому он не заканчивает одну такую ​​итерацию в приемлемое время.

В scipy 0.11 fmin_bfgs имеет параметр maxfun - можно ли это как-то подражать в scipy 0.10?

EDIT: По многочисленным просьбам, вот некоторые важные фрагменты кода:

Функция вычисления стоимости (обычные обозначения применяются):

def computeCost(theta, X, y): 
    h = sigmoid(X.dot(theta.T)) 
    J = y.T.dot(log(h)) + (1.0 - y.T).dot(log(1.0 - h)) 
    J_reg2 = theta[1:]**2 
    J_reg1 = theta[1:] 
    cost = (-1.0/m) * (J.sum() + LAMBDA2 * J_reg2.sum() + LAMBDA1 * J_reg1.sum()) 
    return cost 

Вызов функции fmin_bfgs:

initial_thetas = numpy.zeros((len(train_X[0]), 1)) 
myargs = (train_X, train_y) 
theta = scipy.optimize.fmin_bfgs(computeCost, x0=initial_thetas, args=myargs) 
+2

Обходным путем было бы добавление определенного количества вызовов, которые счетчик выполняет сама функция, и 'raise' специальное исключение, когда будет достигнуто желаемое количество вызовов. –

+0

@ Zhenya Спасибо! Я надеялся, что может быть проще, но я могу это сделать. – Cristina

+0

@Denis Что вы подразумеваете под "delta X"? У меня есть мои учебные образцы в X, никаких изменений для них не сделано. – Cristina

ответ

1

Ваша проблема заключается не в количестве итераций. Причина, по которой лямбда-номера не меняются, заключается в том, что оптимизация не работает. Scipy должен прорабатывать эти цифры для вас, а не для их прохождения через петли.

Возможно, если бы вы могли добавить больше кода, было бы легче увидеть, как его исправить.

+0

Но я оптимизируюсь против значений theta (стоимость является функцией тэта), не лямбды! Как я мог получить лямбды также из bfgs? – Cristina

+0

Я добавил некоторые фрагменты исходного кода. – Cristina

+0

Вы должны быть в состоянии добавить lambdas и thetas как часть x0, а затем разделить их в начале функции вычисления стоимости. – Anake

Смежные вопросы