首页 > 解决方案 > 如何以双射方式对称 [0,1]^d 中的数据集

问题描述

假设我在 [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)

此外,我希望这种转换是双射的,以便它可以嵌入合适的。

主要问题如下:我有一个适合对称数据集的算法,我想通过这种转换将它扩展到非对称数据集,我无法正确编写......

想法?谢谢 :)

标签: rdatasetasymmetric

解决方案


我们可以通过取其参数的所有排列的平均值来对称化一个函数。尽管该问题要求进行双射变换,但由于投影丢失信息而无法完成。

这里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

推荐阅读