bri*_*tar 6 r linear-regression
我想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)
}
Run Code Online (Sandbox Code Playgroud)
可以使用以下代码测试该函数:
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)
Run Code Online (Sandbox Code Playgroud)
我仔细检查了我对阿布 - 莫斯塔法的算法,如下:
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我在这里错过了什么吗?
从数学角度来看,权重向量上不受约束的大小不会产生唯一的解决方案。当我将这两行添加到分类器函数时,它分两步收敛:
# Normalize
weights <- weights/norm(weights)
Run Code Online (Sandbox Code Playgroud)
...
# Update weights
weights <- weights_old - learn_rate*gradient
weights <- weights / norm(weights)
Run Code Online (Sandbox Code Playgroud)
我无法使 @SimonO101 工作,并且我没有使用此代码进行实际工作(有像 之类的内置函数glm),因此足以执行我理解的循环。整个函数如下:
# 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)))
# Normalize
weights <- weights/norm(weights)
# Compute gradient
while(norm(del_weights) > conv_lim) {
for (k in 1:NCOL(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,]))))))
}
# gradient <- -1/NROW(training_examples) * sum(training_outputs * training_examples / (1 + exp(training_outputs * weights%*%training_outputs) ) )
# Update weights
weights <- weights_old - learn_rate*gradient
weights <- weights / norm(weights)
del_weights <- as.matrix(weights_old - weights)
weights_old <- weights
print(weights)
}
return(weights)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2544 次 |
| 最近记录: |