Path: blob/master/site/ko/probability/examples/Gaussian_Copula.ipynb
25118 views
Copyright 2018 The TensorFlow Probability Authors.
Licensed under the Apache License, Version 2.0 (the "License");
[Copula](https://en.wikipedia.org/wiki/Copula_(probability_theory))는 확률 변수 간의 종속성을 캡처하기 위한 고전적인 접근 방식입니다. 더 공식적으로 코퓰러는 다변량 분포 이므로 주변화(marginalizing)를 통해 을 얻게 됩니다.
코퓰러는 임의의 한계가 있는 다변량 분포를 만드는 데 사용할 수 있으므로 흥미롭습니다. 다음은 공식입니다.
확률 적분 변환을 사용하면 임의의 연속 R.V. 를 균일한 로 변환합니다. 여기서 는 의 CDF입니다.
코퓰러(이변량) 가 주어지면 와 가 균일한 주변 분포를 갖게 됩니다.
이제 관심 있는 R.V의 가 주어지면 새 분포 를 만듭니다. 와 의 한계는 원하는 한계입니다.
한계는 일변량이므로 측정 및/또는 모델링이 더 쉬울 수 있습니다. 코퓰러는 한계에서 시작하면서 차원 간의 임의의 상관관계를 달성할 수 있습니다.
가우시안 코퓰러
코퓰러가 어떻게 구성되는지 설명하려면 다변량 가우시안 상관관계에 따라 의존성을 캡처하는 경우를 고려하세요. 가우시안 코퓰러로는 가 주어졌습니다. 여기서 는 공분산 와 평균 0을 가진 MultivariateNormal의 CDF를 나타내고, 는 표준 정규 분포를 위한 역 CDF입니다.
정규 분포의 역 CDF를 적용하면 균일한 차원이 정규 분포로 왜곡됩니다. 그런 다음 다변량 정규 분포의 CDF를 적용하면 분포가 어느 정도 균일하고 가우시안 상관관계를 갖도록 압축됩니다.
따라서 얻게 된 점은 가우시안 코퓰러가 균일한 한계를 갖는 단위 하이퍼큐브 [0, 1]^n$에 대한 분포라는 것입니다.
이와 같이 정의된 가우시안 코퓰러는 tfd.TransformedDistribution
및 적절한 Bijector
로 구현할 수 있습니다. 즉, tfb.NormalCDF
bijector로 구현된, 정규 분포의 역 CDF를 사용하여 MultivariateNormal을 변환합니다.
아래에서는 공분산이 콜레스키(Cholesky) 인자(따라서 MultivariateNormalTriL
대한 공분산)에 의해 매개변수화된다는 단순화 가정을 사용하여 가우시안 코퓰러를 구현합니다(다른 tf.linalg.LinearOperators
를 사용하여 행렬이 없는 다양한 가정을 인코딩할 수 있음).
하지만 이러한 모델의 힘은 확률 적분 변환을 사용하여 임의의 R.V.에서 코퓰러를 사용하는 것입니다. 이런 방식으로 임의의 한계를 지정하고 코퓰러를 사용하여 함께 연결할 수 있습니다.
다음 모델로 시작합니다.
코퓰러를 사용하여 한계 Kumaraswamy 및 Gumbel을 갖는 이변량 R.V. 를 얻습니다.
이들 두 R.V.로 생성된 제품 분포를 플롯하여 시작하겠습니다. 이는 코퓰러를 적용할 때 비교 지점 역할을 하기 위한 것입니다.
다양한 한계를 가진 결합 분포
이제 가우시안 코퓰러를 사용하여 분포를 함께 연결하고 플롯합니다. 선택한 도구는 TransformedDistribution
이며, 이를 통해 적절한 Bijector
를 적용하여 선택한 한계를 얻습니다.
특히 벡터의 여러 부분에 다양한 bijector를 적용하는 Blockwise
bijector를 사용합니다(여전히 전단사 변환임).
이제 원하는 코퓰러를 정의할 수 있습니다. 목표 한계 목록(bijector로 인코딩됨)이 주어지면 코퓰러를 사용하고 지정된 한계를 갖는 새 분포를 쉽게 구성할 수 있습니다.
마지막으로 이 가우시안 코퓰러를 실제로 사용해 봅시다. 의 콜레스키를 사용합니다. 이는 분산 1에 해당하며, 다변량 정규 분포인 경우 상관관계 에 해당합니다.
몇 가지 경우를 살펴보겠습니다.
마지막으로 원하는 한계를 실제로 얻었는지 확인해봅니다.
결론
이제 됐습니다. Bijector
API로 가우시안 코퓰러를 생성할 수 있음을 입증했습니다.
더 일반적으로는 Bijector
API로 bijector를 작성하고 이를 분포로 구성하면 유연한 모델링을 위한 풍부한 분포군을 만들 수 있습니다.