From 5155844034f62cb02bba70b58e297b6ea0118154 Mon Sep 17 00:00:00 2001 From: Rojan Shrestha Date: Sun, 1 Dec 2024 22:30:21 +0545 Subject: [PATCH 1/5] updated docstring for pm.MatrixNormal to ensure compatibility with current version --- pymc/distributions/multivariate.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pymc/distributions/multivariate.py b/pymc/distributions/multivariate.py index bcc5b4fcef7..e3a80e99ff4 100644 --- a/pymc/distributions/multivariate.py +++ b/pymc/distributions/multivariate.py @@ -1827,8 +1827,8 @@ class MatrixNormal(Continuous): with pm.Model() as model: # Setup right cholesky matrix sd_dist = pm.HalfCauchy.dist(beta=2.5, shape=3) - colchol_packed = pm.LKJCholeskyCov('colcholpacked', n=3, eta=2, - sd_dist=sd_dist) + colchol_packed = pm.LKJCholeskyCov('colcholpacked', n=3, eta=2,compute_corr=False, + sd_dist=sd_dist) colchol = pm.expand_packed_triangular(3, colchol_packed) # Setup left covariance matrix @@ -1836,7 +1836,7 @@ class MatrixNormal(Continuous): rowcov = pt.diag([scale**(2*i) for i in range(m)]) vals = pm.MatrixNormal('vals', mu=mu, colchol=colchol, rowcov=rowcov, - observed=data) + observed=data) """ rv_op = matrixnormal From 3f57642d95e61537eb26ff90956c338c71ff7ae6 Mon Sep 17 00:00:00 2001 From: roesta07 <63225055+roesta07@users.noreply.github.com> Date: Tue, 3 Dec 2024 22:47:43 +0545 Subject: [PATCH 2/5] Update pymc/distributions/multivariate.py Co-authored-by: Ricardo Vieira <28983449+ricardoV94@users.noreply.github.com> --- pymc/distributions/multivariate.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pymc/distributions/multivariate.py b/pymc/distributions/multivariate.py index e3a80e99ff4..a00013e0bbb 100644 --- a/pymc/distributions/multivariate.py +++ b/pymc/distributions/multivariate.py @@ -1827,8 +1827,7 @@ class MatrixNormal(Continuous): with pm.Model() as model: # Setup right cholesky matrix sd_dist = pm.HalfCauchy.dist(beta=2.5, shape=3) - colchol_packed = pm.LKJCholeskyCov('colcholpacked', n=3, eta=2,compute_corr=False, - sd_dist=sd_dist) + colchol_packed, _, _ = pm.LKJCholeskyCov('colcholpacked', n=3, eta=2, sd_dist=sd_dist) colchol = pm.expand_packed_triangular(3, colchol_packed) # Setup left covariance matrix From c219a4a21fb5342b10e5998a1c4ed518b90e7e09 Mon Sep 17 00:00:00 2001 From: Rojan Shrestha Date: Sat, 7 Dec 2024 15:59:41 +0545 Subject: [PATCH 3/5] updated docstring for pm.MatrixNormal after review --- pymc/distributions/multivariate.py | 48 ++++++++++++++---------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/pymc/distributions/multivariate.py b/pymc/distributions/multivariate.py index a00013e0bbb..4f1b7f3402d 100644 --- a/pymc/distributions/multivariate.py +++ b/pymc/distributions/multivariate.py @@ -1811,31 +1811,29 @@ class MatrixNormal(Continuous): .. code:: python - # Setup data - true_colcov = np.array([[1.0, 0.5, 0.1], - [0.5, 1.0, 0.2], - [0.1, 0.2, 1.0]]) - m = 3 - n = true_colcov.shape[0] - true_scale = 3 - true_rowcov = np.diag([true_scale**(2*i) for i in range(m)]) - mu = np.zeros((m, n)) - true_kron = np.kron(true_rowcov, true_colcov) - data = np.random.multivariate_normal(mu.flatten(), true_kron) - data = data.reshape(m, n) - - with pm.Model() as model: - # Setup right cholesky matrix - sd_dist = pm.HalfCauchy.dist(beta=2.5, shape=3) - colchol_packed, _, _ = pm.LKJCholeskyCov('colcholpacked', n=3, eta=2, sd_dist=sd_dist) - colchol = pm.expand_packed_triangular(3, colchol_packed) - - # Setup left covariance matrix - scale = pm.LogNormal('scale', mu=np.log(true_scale), sigma=0.5) - rowcov = pt.diag([scale**(2*i) for i in range(m)]) - - vals = pm.MatrixNormal('vals', mu=mu, colchol=colchol, rowcov=rowcov, - observed=data) + # Setup data + true_colcov = np.array([[1.0, 0.5, 0.1], + [0.5, 1.0, 0.2], + [0.1, 0.2, 1.0]]) + m = 3 + n = true_colcov.shape[0] + true_scale = 3 + true_rowcov = np.diag([true_scale**(2*i) for i in range(m)]) + mu = np.zeros((m, n)) + true_kron = np.kron(true_rowcov, true_colcov) + data = np.random.multivariate_normal(mu.flatten(), true_kron) + data = data.reshape(m, n) + + with pm.Model() as model: + # Setup right cholesky matrix + sd_dist = pm.HalfCauchy.dist(beta=2.5, shape=3) + colchol,_,_ = pm.LKJCholeskyCov('colchol', n=3, eta=2,sd_dist=sd_dist) + # Setup left covariance matrix + scale = pm.LogNormal('scale', mu=np.log(true_scale), sigma=0.5) + rowcov = pt.diag([scale**(2*i) for i in range(m)]) + + vals = pm.MatrixNormal('vals', mu=mu, colchol=colchol, rowcov=rowcov, + observed=data) """ rv_op = matrixnormal From 7e47f7a7047d6f41006d790bd245fa23974d4792 Mon Sep 17 00:00:00 2001 From: Rojan Shrestha Date: Tue, 10 Dec 2024 17:20:49 +0545 Subject: [PATCH 4/5] updated docstring for pm.MatrixNormal-after review --- pymc/distributions/multivariate.py | 48 +++++++++++++++--------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/pymc/distributions/multivariate.py b/pymc/distributions/multivariate.py index 4f1b7f3402d..05c331d3325 100644 --- a/pymc/distributions/multivariate.py +++ b/pymc/distributions/multivariate.py @@ -1792,7 +1792,7 @@ class MatrixNormal(Continuous): -------- Define a matrixvariate normal variable for given row and column covariance matrices:: - + with pm.Model() as model: colcov = np.array([[1.0, 0.5], [0.5, 2]]) rowcov = np.array([[1, 0, 0], [0, 4, 0], [0, 0, 16]]) m = rowcov.shape[0] @@ -1811,29 +1811,29 @@ class MatrixNormal(Continuous): .. code:: python - # Setup data - true_colcov = np.array([[1.0, 0.5, 0.1], - [0.5, 1.0, 0.2], - [0.1, 0.2, 1.0]]) - m = 3 - n = true_colcov.shape[0] - true_scale = 3 - true_rowcov = np.diag([true_scale**(2*i) for i in range(m)]) - mu = np.zeros((m, n)) - true_kron = np.kron(true_rowcov, true_colcov) - data = np.random.multivariate_normal(mu.flatten(), true_kron) - data = data.reshape(m, n) - - with pm.Model() as model: - # Setup right cholesky matrix - sd_dist = pm.HalfCauchy.dist(beta=2.5, shape=3) - colchol,_,_ = pm.LKJCholeskyCov('colchol', n=3, eta=2,sd_dist=sd_dist) - # Setup left covariance matrix - scale = pm.LogNormal('scale', mu=np.log(true_scale), sigma=0.5) - rowcov = pt.diag([scale**(2*i) for i in range(m)]) - - vals = pm.MatrixNormal('vals', mu=mu, colchol=colchol, rowcov=rowcov, - observed=data) + # Setup data + true_colcov = np.array([[1.0, 0.5, 0.1], + [0.5, 1.0, 0.2], + [0.1, 0.2, 1.0]]) + m = 3 + n = true_colcov.shape[0] + true_scale = 3 + true_rowcov = np.diag([true_scale**(2*i) for i in range(m)]) + mu = np.zeros((m, n)) + true_kron = np.kron(true_rowcov, true_colcov) + data = np.random.multivariate_normal(mu.flatten(), true_kron) + data = data.reshape(m, n) + + with pm.Model() as model: + # Setup right cholesky matrix + sd_dist = pm.HalfCauchy.dist(beta=2.5, shape=3) + colchol,_,_ = pm.LKJCholeskyCov('colchol', n=3, eta=2,sd_dist=sd_dist) + # Setup left covariance matrix + scale = pm.LogNormal('scale', mu=np.log(true_scale), sigma=0.5) + rowcov = pt.diag([scale**(2*i) for i in range(m)]) + + vals = pm.MatrixNormal('vals', mu=mu, colchol=colchol, rowcov=rowcov, + observed=data) """ rv_op = matrixnormal From c2edfb18ac5d8c3af4aea89051c1d0c5bac518ce Mon Sep 17 00:00:00 2001 From: Rojan Shrestha Date: Tue, 10 Dec 2024 21:11:35 +0545 Subject: [PATCH 5/5] after adding codeblocks,imports --- pymc/distributions/multivariate.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/pymc/distributions/multivariate.py b/pymc/distributions/multivariate.py index 05c331d3325..e44008fe652 100644 --- a/pymc/distributions/multivariate.py +++ b/pymc/distributions/multivariate.py @@ -1791,14 +1791,21 @@ class MatrixNormal(Continuous): Examples -------- Define a matrixvariate normal variable for given row and column covariance - matrices:: - with pm.Model() as model: - colcov = np.array([[1.0, 0.5], [0.5, 2]]) - rowcov = np.array([[1, 0, 0], [0, 4, 0], [0, 0, 16]]) - m = rowcov.shape[0] - n = colcov.shape[0] - mu = np.zeros((m, n)) - vals = pm.MatrixNormal("vals", mu=mu, colcov=colcov, rowcov=rowcov) + matrices. + + .. code:: python + + import pymc as pm + import numpy as np + import pytensor.tensor as pt + + with pm.Model() as model: + colcov = np.array([[1.0, 0.5], [0.5, 2]]) + rowcov = np.array([[1, 0, 0], [0, 4, 0], [0, 0, 16]]) + m = rowcov.shape[0] + n = colcov.shape[0] + mu = np.zeros((m, n)) + vals = pm.MatrixNormal("vals", mu=mu, colcov=colcov, rowcov=rowcov) Above, the ith row in vals has a variance that is scaled by 4^i. Alternatively, row or column cholesky matrices could be substituted for