Как симметрично сопоставить набор данных в [0,1]^d биективным способом
Предположим, у меня есть набор данных в [0,1]^d, который я хочу симметрировать в том смысле, что функция перераспределения "симметризованных" данных, F, должна содержать следующее утверждение:
Например, если d=2, функция перераспределения должна быть симметричной относительно первой биссектрисы:
Преобразование должно быть построено из данных. Если вы хотите, чтобы с некоторыми (тривариативными) данными пытались работать, вы можете запустить следующий код R (сначала необходимо установить связку пакетов):
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)
Кроме того, я хотел бы, чтобы это преобразование было биективным, чтобы оно могло вписаться.
Основная проблема заключается в следующем: у меня есть подходящий алгоритм для симметричных наборов данных, и я хочу расширить его до несимметричных с помощью этого преобразования, что я не могу написать правильно...
Идеи? Спасибо:)
1 ответ
Мы можем симметризовать функцию, взяв среднее по всем перестановкам ее аргументов. Хотя вопрос задали для биективного преобразования, которое невозможно сделать, поскольку проекция теряет информацию.
Вот 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