r - 如何以双射方式对称 [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)
此外,我希望这种转换是双射的,以便它可以嵌入合适的。
主要问题如下:我有一个适合对称数据集的算法,我想通过这种转换将它扩展到非对称数据集,我无法正确编写......
想法?谢谢 :)
解决方案
我们可以通过取其参数的所有排列的平均值来对称化一个函数。尽管该问题要求进行双射变换,但由于投影丢失信息而无法完成。
这里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
推荐阅读
- node.js - 从 Watson Discovery 搜索结果中获取相关字段作为 Watson 助手响应
- python - 我在哪里可以找到 tensorflow.keras.experimental 模型中的 export_saved_model 属性?
- javascript - 如何通过推送最旧的元素来逐一显示元素,而新元素将在顶部?
- regex - 匹配以逗号分隔的字符串的不同排列的正则表达式模式
- lua - 如何在Lua中的表格中分隔行中的文本
- linux - 在 shell 脚本中使用用户输入的 do-while 循环
- html - 如何使用 css 为移动设备设置 html div 的最大宽度
- node.js - 如何在 Node.js 应用程序中自动重新加载更新的 SSL 证书
- python - mysql中持续时间的唯一值
- java - Android - 如何在不使用 Intent 的情况下发送 ArrayList?