我在处理R时遇到了一些问题。我正在尝试进行逻辑回归以做分类器,但我对 sigmoid 函数有一些问题。这是 sigmoid 函数的代码:
sigmoid<-function(z){
g=1/(1+exp(-z))
return(g)
}
当我计算成本函数 J. R 将数字四舍五入时,问题出现了,所以如果我做sigmoid(40)
它会返回给我 1。在 J 中,当我有这部分J=......(1-y)%*%log(1-sigmoid(40))
因为 sigmoid 函数返回 1 时,我有 log(0( 即 -Inf。因此,我不可能对我的分类器进行良好的训练。我尝试使用options(digits=22)
但在某些情况下我遇到了这个问题。您知道如何避免此问题吗?使用python,我对sigmoid没有这个问题。
发布了不完整的代码,但到了我有问题的地步。
sigmoid<-function(z){
g <- 1 / (1 + exp(-1 * z))
return(g)
}
gradient<-function(X,y,theta,niter){
#FITTING
alpha<-0.001
ep<-0.000001
converged <- FALSE
iter<-0
m<-nrow(X)
h<- sigmoid(X%*%theta)
J<-(1/m)* t(-y)%*%log(h) - (t(1-y)%*%log(1-h))
}
#LOAD DATASET
dataset<-read.csv('candy_1.csv',sep = ',')
X<-dataset[,1:10]
y<-dataset[,11]
m<-nrow(X)
n<-ncol(X)
X<-cbind(rep(1,m),X)
X<-as.matrix(X)
theta<-sample(1:5,11,replace = TRUE) #RANDOM THETA NUMBER
thetan<-gradient(X,y,theta,10)
x_dot_tetha变量具有以下输出:
217.98781
2 98.42926
3 141.97051
4 166.01540
5 168.66764
until 82 index.
因此,当我做这个向量的 sigmoid 时,我有一个 1 的向量。当我计算J时,log(1-h(变成了log(0(。如果我使用该库进行逻辑回归,则没有任何问题。我真的不明白我的代码是否正确。谢谢!
我很惊讶python给了你别的东西。
查看帮助页面?.Machine
我们看到:
双精度.eps
最小的正浮点数 x,使得 1 + x != 1。
exp(-40)
[1] 4.248354e-18
.Machine$double.eps
[1] 2.220446e-16
由于1 + exp(-40)
与 1 无法区分,sigmoid(40(应返回 1。