Холеський проти ейгендекомпозиції для малювання зразків з багатовимірного нормального розподілу


16

Я б хотів намалювати зразок . Вікіпедія пропонує або використовувати склад Холеського, або Ейгенде , тобто або Σ = D 1 D T 1xN(0,Σ)Σ=D1D1TΣ=QΛQT

Отже, зразок можна скласти через: або де \ mathbf {v} \ sim N \ зліва (\ mathbf {0}, \ mathbf {I} \ праворуч) x=D1vvN(0,I)x=QΛvvN(0,I)

Вікіпедія припускає, що вони обидва однаково хороші для отримання зразків, але метод Холеського має більш швидкий час обчислення. Це правда? Особливо чисельно при використанні методу Монте-Карло, де відхилення по діагоналях можуть відрізнятися на кілька порядків? Чи є офіційний аналіз цієї проблеми?


1
Дамієн, найкращий рецепт, щоб переконатися, що програма швидша, - це перевірити її самостійно на своєму програмному забезпеченні: функції розкладу Cholesky та Eigen можуть відрізнятися швидкістю в різних реалізаціях. Шолеський шлях більш популярний, AFAIK, але власний шлях може бути більш гнучким.
ttnphns

1
Я розумію, що Чолеський є швидшим O (N ^ 3/3 )O(N3/3) ( Вікіпедія ), тоді як ейгендекомпозиція - це O(N3) ( Алгоритм Якобі Ейенвалю . Однак, у мене є ще дві проблеми: (1) Що означає "потенційно більш гнучка" ? та (2) Відхилення відрізняються на кілька порядків ( 104 проти 109 для самих екстремальних елементів) - чи це має відношення до вибраного алгоритму?
Демієн,

@Damien Одним з аспектів "гнучкішого" є те, що ейгендекомпозиція, яка для коваріаційної матриці відповідає SVD , може бути усічена, щоб отримати оптимальне низьке рангове наближення повної матриці. Урізаний SVD можна обчислити безпосередньо, а не обчислити повну річ, а потім викинути невеликі власні значення.
GeoMatt22

Як щодо читання моєї відповіді під час переповнення стека: Отримайте вершини еліпса на графіці коваріації еліпса (створено car::ellipse) . Хоча питання задається в різному застосуванні, теорія позаду однакова. Ви побачите там приємні фігури для геометричного пояснення.
李哲源

Відповіді:


12

Проблему вивчав Страка та ін. Для фільтру Нецентризований Кальман, який черпає (детерміновані) зразки з багатоваріантного нормального розподілу як частини алгоритму. За деякої долі результати можуть бути застосовні до проблеми Монте-Карло.

Декомпозиція Чолеського (CD) та Ейконова декомпозиція (ED) - і з цього приводу власне матричне квадратне коріння (MSR) - це всі шляхи, за допомогою яких можна розбити позитивну напіввизначену матрицю (PSD).

Розглянемо SVD матриці PSD, . Оскільки Р СДП, це насправді так само , як Еди з . Крім того, ми можемо розділити діагональну матрицю її квадратного кореня: , зазначивши , що . P = U S U T P = U P=USVTP=USUTP=USSTUTS=ST

Тепер ми можемо ввести довільну ортогональну матрицю :O

P=USOOTSTUT=(USO)(USO)T .

Вибір фактично впливає на результати оцінки, особливо коли є сильні позадіагональні елементи коваріаційної матриці.O

У статті досліджено три варіанти :O

  • O=I , що відповідає ЕД;
  • O=Q з QR розкладання з - , що відповідає CD; іUS=QR
  • O=UT що призводить до симетричної матриці (тобто MSR)

На основі чого були зроблені наступні висновки після багаторічного аналізу (цитування):

  • Для трансформованої випадкової величини з некорельованими елементами всі три розглянуті МД забезпечують однакові сигма-точки, отже, вони майже не мають різниці в якості наближення [Нецензурована трансформація]. У такому випадку компакт-диск може віддавати перевагу за низькими витратами.

  • Якщо випадкова величина містить корельовані елементи, використання різних [декомпозицій] може суттєво вплинути на якість апроксимації [Нецензована трансформація] середньої або коваріаційної матриці перетвореної випадкової величини. Два вищевикладені випадки показали, що слід віддати перевагу [ЕД].

  • Якщо елементи змінної, що підлягає перетворенню, виявляють сильну кореляцію, так що відповідна матриця коваріації є майже сингулярною, слід враховувати ще одне питання - чисельну стабільність алгоритму, що обчислює MD. SVD набагато більш чисельно стійкий для майже сингулярних матриць коваріації, ніж ChD.

Довідка:

  • Страка, О.; Дуник, Дж .; Simandl, M. & Havlik, J. "Аспекти та порівняння матричних декомпозицій у недисперсному фільтрі Кальмана", American Control Conference (ACC), 2013, 2013, 3075-3080.

6

Ось проста ілюстрація за допомогою R для порівняння часу обчислення двох методів.

library(mvtnorm)
library(clusterGeneration)
set.seed(1234)
mean <- rnorm(1000, 0, 1)
sigma <- genPositiveDefMat(1000)
sigma <- sigma$Sigma

eigen.time <- system.time(
  rmvnorm(n=1000, mean=mean, sigma = sigma, method = "eigen")
  )

chol.time <- system.time(
  rmvnorm(n=1000, mean=mean, sigma = sigma, method = "chol")
  )

Часи роботи є

> eigen.time
   user  system elapsed 
   5.16    0.06    5.33 
> chol.time
   user  system elapsed 
   1.74    0.15    1.90

При збільшенні розміру вибірки до 10000 тривалість роботи є

> eigen.time <- system.time(
+   rmvnorm(n=10000, mean=mean, sigma = sigma, method = "eigen")
+   )
> 
> chol.time <- system.time(
+   rmvnorm(n=10000, mean=mean, sigma = sigma, method = "chol")
+   )
> eigen.time
   user  system elapsed 
   15.74    0.28   16.19 
> chol.time
   user  system elapsed 
   11.61    0.19   11.89 

Сподіваюсь, це допомагає.


3

Ось посібник чи демонстрація бідного чоловіка, що підтверджує себе:

> set.seed(0)
> # The correlation matrix
> corr_matrix = matrix(cbind(1, .80, .2, .80, 1, .7, .2, .7, 1), nrow=3)
> nvar = 3 # Three columns of correlated data points
> nobs = 1e6 # One million observations for each column
> std_norm = matrix(rnorm(nvar * nobs),nrow=nobs, ncol=nvar) # N(0,1)   

Corr=[1.8.2.81.7.2.71]

N=[[,1][,2][,3][1,]1.08063380.65639130.8400443[2,]1.14342410.17297380.9884772[999999,]0.48618270.035630062.1176976[1000000,]0.43945511.692655171.9534729]

1. МЕТОД СВД:

[U[3×3]Σ0.5[d1000d2000d3]NT[3×106]]T
> ptm <- proc.time()
> # Singular Value Decomposition method:
> svd = svd(corr_matrix)   
> rand_data_svd = t(svd$u %*% (diag(3) * sqrt(svd$d)) %*% t(std_norm))
> proc.time() - ptm
   user  system elapsed 
   0.29    0.05    0.34 
> 
> ptm <- proc.time()

2. ХОЛЕСКИЙ МЕТОД:

[Ch[c1100c21c220c31c32c33]NT[3×106]]T
> # Cholesky method:
> chole = t(chol(corr_matrix))
> rand_data_chole = t(chole %*% t(std_norm))
> proc.time() - ptm
   user  system elapsed 
   0.25    0.03    0.31 

Дякую @ userr11852, що вказав мені, що існує кращий спосіб обчислити різницю в продуктивності між SVD та Cholesky, на користь останнього, використовуючи функцію microbenchmark. За його пропозицією, ось результат:

microbenchmark(chol(corr_matrix), svd(corr_matrix))
Unit: microseconds
              expr     min     lq      mean  median      uq     max neval cld
 chol(corr_matrix)  24.104  25.05  28.74036  25.995  26.467  95.469   100  a 
  svd(corr_matrix) 108.701 110.12 116.27794 111.065 112.719 223.074   100   b

@ user11852 Дякую Я читаю курсиво запис, microbenchmarkі це дійсно має значення.
Антоні Пареллада

Звичайно, але чи є різниця в оцінці?
Демієн

Гарна думка. Я не встиг вивчити пакунок.
Антоні Пареллада
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.