Hi, I would like to sample joint probability densities of size nxm from a Dirichlet distribution defined on the simplex of size nxm, i.e. each sample is a joint probability density. The only thing I can do so far is generate a doubly-stochastic matrix, which columns and rows sum to a vector of 1. Any input would be appreciated.
@SBY54 Welcome to the Tensorflow Forum!
You can sample joint probability densities of size nxm from a Dirichlet distribution defined on the simplex of size nxm :
Refer below sample code :
import numpy as np
def sample_dirichlet_doubly_stochastic(n, m):
"""Samples a joint probability density from a Dirichlet distribution defined on the simplex of size nxm using a doubly-stochastic matrix.
Args:
n (int): The number of rows in the matrix.
m (int): The number of columns in the matrix.
Returns:
np.ndarray: The sampled joint probability density.
"""
ds_matrix = np.random.rand(n, m)
ds_matrix = ds_matrix / np.sum(ds_matrix, axis=1, keepdims=True)
p = ds_matrix @ ds_matrix.T
return p
if __name__ == "__main__":
n = 3
m = 2
p = sample_dirichlet_doubly_stochastic(n, m)
print(p)
This code will first generate a doubly-stochastic matrix. Then, it will multiply the matrix by its transpose. The result will be a joint probability density sampled from a Dirichlet distribution.
I hope this helps! Let me know if you have any further queries.
Thank you for you reply, Tanya,
The matrix you are using is not bi-stochastic, you are normalizing only rows. Also , I think that the product of two bi-stochastic matrices is a bi-stochastic matrix. What I am looking for is to sample from the generalized Dirichlet in the space of matrices, where the marginals are pmfs.