【发布时间】:2019-03-15 03:59:15
【问题描述】:
我正在 R 中实现我的函数并尝试根据结果来确定它是否符合我的预期。我要评估的功能是:
在我增加数据矩阵的大小之前,该函数可以正常工作(例如,它适用于 N = 10,但不适用于 N = 12,下面将发布示例。)
我确定是否与我的实现或溢出问题有关。
# Generate Sample Data
gen.sample <- function(n){
x <- runif(n,min = -5,max = 5)
y <- ifelse(x < 0,-1,1)
return(data.frame(x,y))
}
# Objective function L_D
obj_fun <- function(X,y,alpha){
N <- length(X)
inner.product <- numeric(N)
for(i in 1:N){
for(k in 1:N){
inner.product[k] <- alpha[i]*alpha[k]*
y[i]*y[k]*(t(as.numeric(X[i]))%*%as.numeric(X[k]))
}
}
L_D <- sum(alpha) - 0.5*sum(inner.product)
return(L_D)
}
# L_D works when N = 10
set.seed(4997)
options(digits = 4,scipen = -4)
N = 10
sample.data <- gen.sample(n=N)
X.data <- sample.data$x
y.vec <- sample.data$y
alpha.vector <- matrix(rep(c(-5,-4,-3,-2,-1,0,1,2,3,4,5),11*N),ncol = 11, nrow = N, byrow = TRUE)
for(j in 1:N){
alpha.vector[j,2] <- rnorm(1,5,5)
}
for(i in 1:N){
print(obj_fun(X = X.data, y = y.vec, alpha = alpha.vector[i,]))
}
# It produces all NA when N = 12
set.seed(4997)
options(digits = 4,scipen = -4)
N = 12
sample.data <- gen.sample(n=N)
X.data <- sample.data$x
y.vec <- sample.data$y
alpha.vector <- matrix(rep(c(-5,-4,-3,-2,-1,0,1,2,3,4,5),11*N),ncol = 11, nrow = N, byrow = TRUE)
for(j in 1:N){
alpha.vector[j,2] <- rnorm(1,5,5)
}
for(i in 1:N){
print(obj_fun(X = X.data, y = y.vec, alpha = alpha.vector[i,]))
}
[1] NA
[1] NA
[1] NA
[1] NA
[1] NA
[1] NA
[1] NA
[1] NA
[1] NA
[1] NA
[1] NA
[1] NA
出了什么问题?我没有看到问题。
任何帮助都会很棒!
【问题讨论】:
-
在你刚刚添加的tex格式的数学方程中,alpha、y和x的维度是多少?它们都是长度为 n 的向量吗?还是 x 是一个 n*n 矩阵?还是别的什么?
-
@DanY 你好 Dan,alpha 的维度应该是一个 1×N 的向量,y 应该是一个 1×N 的向量,x 是数据(对于这个简单的例子),1×N . 稍后当我让我的代码适用于 1D 数据时,我将对其进行更多修改以适用于 2D 案例。我现在要做的就是评估我的函数 L_D 并绘制它以查看它是否是二次的。
-
我刚刚修改了下面的答案,将
newfun()包括在内,我认为这是您上面提供的数学方程式的忠实实现。 -
@DanY 我在上面修复了我的代码,它可以工作。我仍在研究为什么我的情节看起来不像二次函数。我所做的只是:L_D_eval
标签: r for-loop optimization