Применение функций затрат в R

Я нахожусь на начальной стадии машинного обучения в R, и мне трудно поверить, что нет пакетов для решения функции стоимости для различных типов алгоритмов регрессии. Например, если я хочу решить функцию стоимости для логистической регрессии, ручной способ будет ниже:

https://www.r-bloggers.com/logistic-regression-with-r-step-by-step-implementation-part-2/.

# Implement Sigmoid function
sigmoid <- function(z)
{
g <- 1/(1+exp(-z))
return(g)
}

#Cost Function
cost <- function(theta)
{
m <- nrow(X)
g <- sigmoid(X%*%theta)
J <- (1/m)*sum((-Y*log(g)) - ((1-Y)*log(1-g)))
return(J)
}

##Intial theta
initial_theta <- rep(0,ncol(X))

#Cost at inital theta
cost(initial_theta)

В функции glm есть способ сделать это автоматически? Или мне нужно делать это вручную для каждого применяемого алгоритма?


person nak5120    schedule 21.02.2017    source источник
comment
Нет необходимости, например, видеть справочную страницу функции glmnet из пакета glmnet, т.е. library(glmnet);x=matrix(rnorm(100*20),100,20);g2=sample(1:2,100,replace=TRUE);fit2=glmnet(x,g2,family="binomial")   -  person Silence Dogood    schedule 21.02.2017


Ответы (1)


Мы могли бы использовать optim для оптимизации или использовать glm напрямую

set.seed(1)
X <- matrix(rnorm(1000), ncol=10) # some random data
Y <- sample(0:1, 100, replace=TRUE)

# Implement Sigmoid function
sigmoid <- function(z) {
  g <- 1/(1+exp(-z))
  return(g)
}

cost.glm <- function(theta,X) {
  m <- nrow(X)
  g <- sigmoid(X%*%theta)
  (1/m)*sum((-Y*log(g)) - ((1-Y)*log(1-g)))
}

X1 <- cbind(1, X)
optim(par=rep(0,ncol(X1)), fn = cost.glm, method='CG',
      X=X1, control=list(trace=TRUE))
#$par 
#[1] -0.067896075 -0.102393236 -0.295101743  0.616223350  0.124031764  0.126735986 -0.029509039 -0.008790282  0.211808300 -0.038330703 -0.210447146
#$value
#[1] 0.6255513
#$counts
#function gradient 
#      53       28 

glm(Y~X, family=binomial)$coefficients
# (Intercept)           X1           X2           X3           X4           X5           X6           X7           X8           X9          X10 
#-0.067890451 -0.102411613 -0.295104858  0.616228141  0.124017980  0.126737807 -0.029523206 -0.008790988  0.211810613 -0.038319484 -0.210445717 

На рисунке ниже показано, как стоимость и коэффициенты, итеративно вычисленные с помощью optim, сходятся к значениям, вычисленным с помощью glm.

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

person Sandipan Dey    schedule 21.02.2017
comment
Как вы получили все значения коэффициентов, которые вы используете для графика? - person nadizan; 20.09.2018
comment
@nadizan control=list(trace=TRUE) в optim показывает промежуточные значения всех коэффициентов. - person Sandipan Dey; 20.09.2018
comment
@SandipanDey Как перейти от напечатанных значений к числам, показанным на графике для всех переменных? Можете ли вы показать мне с помощью кода, как вы перешли от optim к значениям? Спасибо. - person nadizan; 21.09.2018