使用Ucminf包优化R.

时间:2013-05-22 19:43:53

标签: r optimization

我无法应用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的最低费用和价值的地方。我不知道该怎么做。

2 个答案:

答案 0 :(得分:5)

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

此处无需使用ucminf个包,您只需使用R函数optim即可使用

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

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)
}

现在让我们加载数据,使这段代码可以重现,我将数据放入我的保管箱。

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

最后,我们可以使用optim来确定最佳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有问题,可以下载数据 here

答案 1 :(得分:0)

由于您没有提供reproducible example,因此很难准确地为您提供所需的代码,但一般的想法是将功能交给ucminf

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

请注意,start必须是初始起始值的向量,当将X作为runif移交给两个函数时,需要生成结果。通常使用随机起始值(例如{{1}})。