Как симметрично сопоставить набор данных в [0,1] ^ d биективным способом - PullRequest
0 голосов
/ 07 января 2019

Предположим, у меня есть набор данных в [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 Ответ

0 голосов
/ 07 января 2019

Мы можем симметризовать функцию, взяв среднее по всем перестановкам ее аргументов. Хотя вопрос задали для биективного преобразования, которое невозможно сделать, поскольку проекция теряет информацию.

Здесь 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...