Я пытаюсь запрограммировать логистическую регрессию со стохастическим нисходящим градиентом в R. Например, я последовал примеру Эндрю Нг по имени: «ex2data1.txt».
Дело в том, что алгоритм работает правильно, но оценка теты не совсем то, что я ожидал. Поэтому я попытался изменить весь алгоритм, чтобы решить эту проблему. Однако для меня это было почти невозможно. Мне не удалось обнаружить ошибку, которая вызывает эту проблему. Таким образом, было бы очень полезно, если бы кто-нибудь мог проверить пример и сказать мне, почему тэты не рассчитываются правильно. Я очень ценю это.
Что касается программирования, я не использую никакие функции, реализованные в R, или вычисление матриц. Я просто использую суммы и вычитания в циклах, потому что я хочу использовать код в Hadoop, и я не могу использовать матричное исчисление или даже функции, которые уже запрограммированы в R, такие как «сумма», «кварт» и т. д.
Стохастический градиентный спуск:
Loop {
for i = 1 to m, {
θj := θj + α(y(i) - hθ(x(i)))(xj)(i)
}
}`
Логистическая регрессия:
Мой код:
data1 <- read.table("~/ex2data1.txt", sep = ",")
names(data1) <- c("Exam1", "Exam2", "Admit")
# Sample the data for stochastic gradient decent
ss<-data1[sample(nrow(data1),size=nrow(data1),replace=FALSE),]
x <- with(ss, matrix(cbind(1, Exam1), nrow = nrow(ss)))
y <- c(ss$Admit)
m <- nrow(x)
# startup parameters
iterations<-1
j<-vector()
alpha<-0.05
theta<-c(0,0)
#My loop
while(iterations<=10){
coste<-c(0,0)
suma<-0
for(i in 1:m){
# h<-1/(1+exp(-Q*x)
h<-1/(1+exp((-theta)*x[i,]))
#Cost(hQ(x),y)=y(i)*log(hQ(x))+(1-y(i))*log(1-hQ(x))
cost<-((y[i]*log(h))+((1-y[i])*log(1-h)))
#sum(cost) i=1 to m
suma<-suma+cost
#Diferences=(hQ(x(i))-y(i))*x(i)
difference<-(h-y[i])*x[i,]
#sum the differences
coste<-coste+difference
#calculation thetas and upgrade = Qj:= Qj - alpha* sum((h-y[i])*x[i,]*x(i))
theta[1]<-(theta[1]-alpha*1/m*(coste[1]))
theta[2]<-(theta[2]-alpha*1/m*(coste[2]))
}
#J(Q)=(-1/m)* sum ( y(i)*log(hQ(x))+(1-y(i))*log(1-hQ(x)))
j[iterations]<-(-1/m)*suma
iterations=iterations+1
}
#If I compare my thetas with R glm
Call: glm(formula = y ~ x[, 2], family = binomial("logit"), data = data1)
Coefficients:
Intercept:-4.71816
x[, 2] :0.08091
Мои теты
Intercept: 0.4624024
x[,2]: 1.3650234