CVXR: проблема с solve () - ошибка в as.vector (data): нет метода для приведения этого класса s4 к вектору - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь свернуть эту функцию:

\ min _ {\ mu} \ sum_ {t = T} ^ T \ | y_t - \ mu_t \ | 2 + \ lambda \ sum {t = 1} ^ {T-1} \ | mu_ {t + 1} - \ mu_ {t} \ | _2

где: y и mu - это p * T matraxis. Все хорошо компилируется, пока я не использую функцию solve ().

Вот то, что я кодировал, когда y - матрица ap * obs

library(CVXR)

mu <- Variable(p, obs)

# group lasso ----
total_var <- lapply(X = seq_len(obs-1), FUN = function(j) mu[,j+1] - mu[,j])
total_var_norm <- lapply(X = total_var, FUN = cvxr_norm, p=2)
group_lasso <- Reduce(f = sum, x = total_var_norm)

# loss function ---- 
col_diff <- lapply( X = seq_len(obs), FUN = function(j) y[,j] - mu[,j])
col_diff_norm <- lapply( X = col_diff, FUN = cvxr_norm, p=2)
loss <- Reduce(f = sum, x = col_diff_norm)

# convex optimization ----
objective_mu <- loss + lambda * group_lasso
problem_mu <- Minimize(objective_mu)
result_mu <- solve(problem_mu)

Все работает хорошо до тех пор, пока result_mu <- solve(problem_mu). Где я получаю следующее сообщение об ошибке:

> result_mu <- solve(problem_mu)
Error in as.vector(data) : 
  no method for coercing this S4 class to a vector

До этого момента все нормально.

Я также пытался использовать следующую формулировку:

# group lasso ----
group_lasso <- norm(mu[,2] - mu[,1], type = "2")
for (s in 2:obs-1){
  group_lasso <- group_lasso + norm(mu[,s] - mu[,s+1], type = "2")
}

# loss function ---- 
loss <- norm(y[,1] - mu[,1], type = "2")
for (s in 2:obs){
  loss <- group_lasso_2 + norm(y[,s] - mu[,s], type = "2")
}

с той же целевой и проблемной функцией. И здесь снова я получаю точно такое же сообщение об ошибке в той же точке.

Я не вижу, в какой момент код неправильный ... Есть указатели?
Спасибо

1 Ответ

0 голосов
/ 29 апреля 2020

Problem отсутствует в вашем коде:

problem_mu <- Problem(Minimize(objective_mu))
...