I am trying to create my own logistic regression function using a stochastic gradient descent in R, but what I have right now increases weight without limits and therefore never stops:
my_logr <- function(training_examples,training_outputs,learn_rate,conv_lim) {
gradient <- as.vector(rep(0,NCOL(training_examples)))
del_weights <- as.matrix(1)
weights <- as.matrix(runif(NCOL(training_examples)))
weights_old <- as.matrix(rep(0,NCOL(training_examples)))
while(norm(del_weights) > conv_lim) {
for (k in 1:NROW(training_examples)) {
gradient <- gradient + 1/NROW(training_examples)*
((t(training_outputs[k]*training_examples[k,]
/(1+exp(training_outputs[k]*t(weights)%*%as.numeric(training_examples[k,]))))))
}
weights <- weights_old - learn_rate*gradient
del_weights <- as.matrix(weights_old - weights)
weights_old <- weights
print(weights)
}
return(weights)
}
This function can be tested with the following code:
data(iris)
iris_a <- iris
iris_a$Species <- as.integer(iris_a$Species)
for (i in 1:NROW(iris_a$Species)) {if (iris_a$Species[i] != "1") {iris_a$Species[i] <- -1}}
random_sample <- sample(1:NROW(iris),50)
weights_a <- my_logr(iris_a[random_sample,1:4],iris_a$Species[random_sample],1,.1)
I double-checked my algorithm against Abu-Mostafa's , which looks like this:
- Initialize the weight vector
- For each gradient, the calculation of the time step:
gradient <- -1/N * sum_{1 to N} (training_answer_n * training_Vector_n / (1 + exp(training_answer_n * dot(weight,training_vector_n)))) weight_new <- weight - learn_rate*gradient- Repeat until the weight delta is small enough.
Did I miss something?
source
share