R 关闭舍入数、二进制分类器

  • 本文关键字:二进制 分类器 舍入 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 时,我有一个 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。

最新更新