假设我有一个[0,1] ^ d的数据集,我想在“对称”数据F的重新划分函数应包含以下断言的意义上进行暗示:
例如,如果d = 2,则重新划分函数应在第一个bissectrix周围对称:
应从数据构建转换。如果要使用某些(三变量)数据,可以运行以下R代码(必须首先安装copula软件包):
library(copula)
source(system.file("Rsource", "AC-Liouville.R", package="copula"))
U <- rLiouville(n=1000, alpha=c(1, 10,20), theta=0.6, Rdist="Gamma")
pairs(U)
此外,我希望此变换是双射的,以便可以嵌入拟合。
主要问题如下:我有一个适合对称数据集的算法,我想通过这种转换将其扩展到非对称数据集,以至于我无法正确编写...
想法?谢谢:)
答案 0 :(得分:2)
我们可以通过对参数的所有排列取平均值来对称化一个函数。尽管该问题要求进行双射变换,但由于投影会丢失信息,因此无法进行双射变换。
此处FunSym
输入标量值函数Fun
,并输出对称函数。
library(combinat)
FunSym <- function(Fun) {
function(...) mean(unlist(permn(list(...), do.call, what = Fun)))
}
Fun <- function(x, y) x - y # test function
FunS <- FunSym(Fun) # FunS is Fun symmetrized
FunS(1,2) # run FunS for particular arguments
## [1] 0
如果我们知道Fun
有2个参数,那么我们可以编写更简单的代码:
FunSym2 <- function(Fun) {
function(x, y) (Fun(x,y) + Fun(y,x))/2
}
FunS2 <- FunSym2(Fun) # FunS is Fun symmetrized
FunS2(1,2) # run FunS for particular arguments
## [1] 0
如果Fun
是向量值,我们可以像这样修改FunSym
:
FunSymV <- function(Fun) {
function(...) rowMeans(simplify2array(permn(list(...), do.call, what = Fun)))
}
# test
FunSymV(Fun)(1:3, 4:6)
## [1] 0 0 0