Tôi cố gắng để xây dựng hàm hồi quy logistic của riêng tôi sử dụng ngẫu nhiên gradient descent trong R, nhưng những gì tôi có ngay bây giờ làm cho trọng lượng lớn mà không bị ràng buộc và do đó không bao giờ ngừng:Thực hiện các công thức hồi quy logistic trong R
# Logistic regression
# Takes training example vector, output vector, learn rate scalar, and convergence delta limit scalar
my_logr <- function(training_examples,training_outputs,learn_rate,conv_lim) {
# Initialize gradient vector
gradient <- as.vector(rep(0,NCOL(training_examples)))
# Difference between weights
del_weights <- as.matrix(1)
# Weights
weights <- as.matrix(runif(NCOL(training_examples)))
weights_old <- as.matrix(rep(0,NCOL(training_examples)))
# Compute gradient
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,]))))))
}
# Update weights
weights <- weights_old - learn_rate*gradient
del_weights <- as.matrix(weights_old - weights)
weights_old <- weights
print(weights)
}
return(weights)
}
các chức năng có thể được thử nghiệm với đoạn mã sau:
data(iris) # Iris data already present in R
# Dataset for part a (first 50 vs. last 100)
iris_a <- iris
iris_a$Species <- as.integer(iris_a$Species)
# Convert list to binary class
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)
tôi kiểm tra lại thuật toán của tôi chống lại Abu-Mostafa's, đó là như sau:
- Khởi tạo vector trọng lượng
- Đối với mỗi bước thời gian tính toán gradient:
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
- Lặp lại cho đến khi đồng bằng trọng lượng là đủ nhỏ
Tôi có thiếu cái gì ở đây?
Tôi có thiếu thuật ngữ bình thường cho trọng số không? Đây có phải là vấn đề Cross Validated không? –
Từ góc độ toán học, một cường độ không bị giới hạn trên vectơ trọng số không mang lại một giải pháp duy nhất.Khi tôi bổ sung thêm hai dòng sau vào chức năng phân loại, nó hội tụ theo hai bước: 'trọng lượng <- trọng lượng/chỉ tiêu (khối lượng) ' ... ' trọng lượng <- weights_old - learn_rate * gradient' 'trọng lượng <- trọng lượng/chuẩn (trọng lượng) ' –
Câu trả lời dưới đây có giúp ích không? –