我在下面有一个方形矩阵“a”作为例子见下文。矩阵a,是nxn方阵。
a = matrix(
c(1, 5 , 3, 7 , 3,
5, 1, 2, 2, 4,
3, 2 , 1, 2,4,
7, 2, 2,1,3,
2, 4,4 ,3 , 1
),ncol = 5,nrow =5)
我正在尝试在R中编写函数(x),如下所示,以便将其提供给优化例程。我正在尝试最小化函数(x),其中x是未知的。 x是矢量。
sumx <- function(x) {
sum(((a[i,j]*a[j,k])-(x[i]/x[j]))^2) for all i,j,k such that i not eq to j not eq to k
}
请你帮忙在R?
中编写这个逻辑和功能非常感谢
答案 0 :(得分:1)
您可以使用:
comb3 <- function(n){
result <- expand.grid(i=1:n,j=1:n,k=1:n)
result[with(result, i!=j & j!=k & i!=k & j>i),]
}
编辑:我已将条件i!=j & j!=k & i!=k & j>i
表达为更具可读性,并包括您在评论中提到的条件。
sumx <- function(x) {
sum(with(comb3(length(x)), ((a[cbind(i,j)]*a[cbind(j,k)])-(x[i]/x[j]))^2))
}
示例:
sumx(1:5)
#[1] 3584.542
请注意,我已将a[i,j]
替换为a[cbind(i,j)]
,以允许对矩阵元素进行矢量化访问。
您现在可以对sumx
进行优化,但最好将comb3(length(x))
和不依赖x
的部分保存为全局对象,以减少计算时间,例如这样:
y <- within(comb3(nrow(a)), b <- a[cbind(i,j)]*a[cbind(j,k)])
sumx <- function(x) {
sum(with(y, (b-(x[i]/x[j]))^2))
}
对于最小化,您可以使用optim
。请注意,我发现了两种不同的吸引子:
> optim(rep(1,5), sumx)
$par
[1] 1.9739966 1.5882750 1.5626338 0.1592725 0.1521839
$value
[1] 1436.526
$counts
function gradient
502 NA
$convergence
[1] 1
$message
NULL
> optim(1:5, sumx)
$par
[1] 5.4254668 4.3857303 4.3029354 0.4374246 0.4199909
$value
[1] 1436.503
$counts
function gradient
218 NA
$convergence
[1] 0
$message
NULL