0

我无法应用 ucminf 函数来最小化我在 R 中的成本函数。

这是我的成本函数:

costfunction <- function(X,y,theta){ 
m <- length(y);
J = 1/m * ((-t(y)%*%log(sigmoid(as.matrix(X)%*%as.matrix(theta))))  - ((1-t(y))%*%log(1-sigmoid(as.matrix(X)%*%as.matrix(theta)))))
}

这是我的 sigmoid 函数:

sigmoid <- function(t){
g = 1./(1+exp(-t))  
} 

这是我的渐变函数:

gradfunction <- function(X,y,theta){ 

grad =  1/ m * t(X) %*% (sigmoid(as.matrix(X) %*% as.matrix(theta) - y));

}

我正在尝试执行以下操作:

library("ucminf")
data <- read.csv("ex2data1.txt",header=FALSE)
X <<- data[,c(1,2)]
y <<- data[,3]
qplot(X[,1],X[,2],colour=factor(y))
m <- dim(X)[1]
n <- dim(X)[2]
X <- cbind(1,X)
initial_theta <<- matrix(0,nrow=n+1,ncol=1)
cost <- costfunction(X,y,initial_theta)
grad <- gradfunction(X,y,initial_theta)

这就是我想调用ucminf来找到 theta 的最小成本和值的地方。我不知道该怎么做。

4

2 回答 2

5

看起来你正在尝试做 Coursera 机器学习课程的第 2 周问题。

这里不需要使用ucminf包,你可以简单地使用optim它工作的 R 函数

我们将首先定义 sigmoid 和成本函数。

sigmoid <- function(z)
    1 / (1 + exp(-z))


costFunction <- function(theta, X, y) {
    m <- length(y)
    J <- -(1 / m) * crossprod(c(y, 1 - y), 
                    c(log(sigmoid(X %*% theta)), log(1 - sigmoid(X %*% theta))))
    grad <- (1 / m) * crossprod(X, sigmoid(X %*% theta) - y)
    list(J = J, grad = grad)
}

现在让我们加载数据,为了使这段代码可复制,我将数据放在我的 Dropbox 中。

download.file("https://dl.dropboxusercontent.com/u/8750577/ex2data1.txt", 
 method = "curl", destfile = "/tmp/ex2data1.txt")

data <- matrix(scan('/tmp/ex2data1.txt', what = double(), sep = ","), 
         ncol = 3, byrow = TRUE)
X <- data[, 1:2]
y <- data[, 3, drop = FALSE]

m <- nrow(X)
n <- ncol(X)
X <- cbind(1, X)
initial_theta = matrix(0, nrow = n + 1)

然后我们可以像这样在初始 theta 处计算成本函数的结果

cost <- costFunction(initial_theta, X, y)

(grad <- cost$grad)
##         [,1]
## [1,]  -0.100
## [2,] -12.009
## [3,] -11.263


(cost <- cost$J)
##         [,1]
## [1,] 0.69315

最后我们可以用optimge 得到最优的 theta

res <- optim(par = initial_theta, 
             fn = function(t) costFunction(t, X, y)$J,
             gr = function(t) costFunction(t, X, y)$grad,
             method = "BFGS", control = list(maxit = 400))

(theta <- res$par)
##           [,1]
## [1,] -25.08949
## [2,]   0.20566
## [3,]   0.20089


(cost <- res$value)
## [1] 0.2035

如果您对功能有问题,download.file可以在 这里下载数据

于 2013-05-22T21:10:07.883 回答
0

由于您没有提供可重现的示例,因此很难准确地为您提供所需的代码,但总体思路是将函数移交给ucminf

ucminf(start, costfunction, gradfunction, y = y, theta = initial_theta)

请注意,start需要是初始起始值的向量,当移交X给两个函数时需要产生结果。通常您使用随机起始值(例如,runif)。

于 2013-05-22T20:28:16.893 回答