首页 > 解决方案 > R关闭舍入数,二进制分类器

问题描述

我在处理 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时,我有一个向量。当我计算 J 时,log(1-h) 变为 log(0)。如果我使用库进行逻辑回归,我没有任何问题。我真的不明白我的代码是否正确。谢谢!

标签: r

解决方案


我很惊讶 python 给了你别的东西。

查看帮助页面?.Machine,我们看到:

double.eps
满足 1 + x != 1 的最小正浮点数 x。

exp(-40)
[1] 4.248354e-18
.Machine$double.eps
[1] 2.220446e-16

由于1 + exp(-40)与 1 无法区分,sigmoid(40)应该返回 1。


推荐阅读