Пытаясь решить проблему логистической c регрессии с помощью cvxpy, я получил несколько выводов терминала при вызове функции resolve (), хотя распечатки не были запрограммированы. Более того, никакая информация о проблеме не выводилась на терминал, даже если для параметра verbose было задано значение true и невозможно получить доступ к оптимальному значению. вполне понятно, что это такое.
Проблема была определена следующим образом в минимальном примере кода:
import numpy as np
import cvxpy as cp
y_vec = np.random.choice([0, 1], size=(728,), p=[9./10, 1./10])
M_mat = np.random.choice([0, 1], size=(728,801), p=[9./10, 1./10])
beta = cp.Variable(M_mat.shape[0])
objective = 0
for i in range(400):
objective += y_vec[i] * M_mat[:, i].T @ beta - \
cp.log(1 + cp.exp((M_mat[:, i].T @ beta)))
prob = cp.Problem(cp.Maximize(objective))
prob.solve(verbose=True)
print("Optimal var reached", beta.value)
Оба y_vec
и M_mat
являются numpy массивами с типом данных int64. Обе являются матрицами выбора для задачи классификации, состоящими только из 0 и 1. Для целей минимального примера кода они генерируются случайным образом для воспроизведения ошибки. Кроме того, M_mat[:, i].T @ beta
был проверен на получение скаляра, как и предполагалось.
Когда я выполняю код, я получаю распечатки множества подобных распечаток с завершением программы после определенного числа.
Конец распечатки терминала, после чего программа завершается
Здесь показан только конец распечаток после завершения программы. Но есть много блоков формы log(1.0 + exp([ 0. 0. ...... 0.] * var0))
, в которых эта выходная последовательность имеет ту же длину, что и переменная beta.
Я нахожу этот результат довольно запутанным. Как я могу прийти к единому вектору для бета-аргумента оптимизации? Любая помощь приветствуется!