Как можно векторизовать этот фрагмент кода для одновременного обновления theta
?
for (j in 1:length(theta)) {
val = exp(y * sum(theta * random_data_vector)) * y * random_data_vector[j]
val = val / (1 + exp(y * sum(theta * random_data_vector)))
theta[j] = theta[j] - (alpha * val)
}
theta
— вектор, random_data_vector
— вектор, y
— число
> dput(head(theta))
c(0.772925310069695, 0.853900654707104, 0.291106897871941, 0.114210048923269,
0.257764941081405, 0.0881731726694852)
> dput(head(random_data_vector))
c(0, 0, 0, 0, 0, 0)
Не уверен, что вы можете так векторизовать, так как итерации зависят от предыдущих. Вы в порядке, используя Rcpp? Предоставьте несколько примеров данных для
random_data_vector
,theta
,alpha
иy
.@ F.Privé, не могли бы вы рассказать, почему я не могу векторизовать? Все является действительным числовым вектором, за исключением
y
иalpha
, которые также являются действительными числами. Мой код, кажется, работает, но я могу пропустить вариант использованияКогда вы вычисляете
sum(theta * random_data_vector)
, вы используетеtheta
из предыдущей итерации, что не позволяет вам просто векторизовать свой код.@ F.Privé немного сбит с толку. Я изменяю
theta
только в последней строке, предложенной r2evans. Развеtheta
не остается прежним в других строках?@F.Privé,
theta
никогда не ссылается на[j-1]
, поэтому значениеtheta
после этого цикла такое же, как и раньше, но оно не зависит (например) от значенияtheta[j-1]
. Но я вижу твою точку зрения...Liondancer, я предлагаю вам использовать
dput(head(...))
вместо простоhead(...)
, это значительно упрощает нам использование.@r2evans ГОТОВО. Спасибо!
Ах, кажется, я вижу проблему...
theta
находится внутриsum
, поэтому в этот момент он не векторизован, а изменяется на основе предыдущего изменения наtheta
. @Liondancer, , вот почему вам нужны образцы данных и ожидаемый результат , аналогично тому, почему программистам часто требуются модульные тесты для кода.@Liondancer, вы можете подтвердить предполагаемое поведение? Есть ли у вас «истинные» значения, чтобы знать, что ваш цикл правильный? (Я просто спрашиваю на всякий случай ...) Если вы это сделаете, и мой ответ правильный, то все в порядке, в противном случае я предлагаю вам «не принять» мой ответ ниже и найти/подтвердить данные проверки.
@ r2evans Я проверил ваш ответ на нескольких очень простых примерах, и они вели себя так, как я хотел. У меня нет источника правды, но я думаю, что ты хорош! Спасибо!!