我用r写了一个梯度下降的算法,可是始终无法收敛,用下面的数据直接就可以在r中运行,运行后发现到100次,损失函数竟发散到无穷了 :cry: 这是怎么回事?是代码的问题,还是参数的问题?我断断续续搞了两天,请各位大侠帮我看看好吗?谢谢
#梯度下降法
grad <- function(x,y,learningRate=0.001,theta=matrix(c(0,0,0,0,0),ncol=1,nrow = 5)){
len <- ncol(x) #自变量个数
diff <- as.matrix(rep(1,len)) #定义导数
i=0 #迭代次数
#开始迭代
while ( crossprod(diff)>0.01){
calculateY <- as.matrix(x%*%theta) #对于某个给定的theta,计算y的预测值
loss <- 0.5*t((calculateY-y))%*%(calculateY-y) #计算损失函数值
for (k in 1:len){ #for循环计算关于theta的导数值
diff[k,1]<-t(calculateY)%*%as.matrix(x[,k])-t(y)%*%as.matrix(x[,k])
}
i<-i+1 #迭代次数+1
theta <- theta - learningRate*as.matrix(diff) #根据求导结果修正theta值
print(list("i"=i,"loss"=loss,"diff"=diff,"theta"=theta)) #打印
}
}
#设置自变量x和因变量y
x<-seq(1,5,0.2)
set.seed(10)
y<-rnorm(length(x),0,0.5)+sin(2*x)
y<-as.matrix(y)
x<-as.matrix(data.frame(1,x,x1,x2,x3))
#运行函数
grad(x,y,0.001,theta = matrix(c(0,0,0,0,0),ncol=1,nrow = 5))