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