# Package for Non-Parametric Multivariate Discrete Distributions

**URL:** https://discourse.julialang.org/t/package-for-non-parametric-multivariate-discrete-distributions/125046
**Category:** General Usage
**Tags:** distributions, probability
**Created:** [January 21, 2025, 8:51pm UTC](https://discourse.julialang.org/t/package-for-non-parametric-multivariate-discrete-distributions/125046 "2025-01-21T20:51:24Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![bmit](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bmit/32/12443_2.png) [@bmit](https://discourse.julialang.org/u/bmit)
#### Post date: [January 21, 2025, 8:51pm UTC](https://discourse.julialang.org/t/package-for-non-parametric-multivariate-discrete-distributions/125046/1 "2025-01-21T20:51:24Z")

</div>

I’m looking for a package that implements tools for working with non-parametric multivariate discrete distributions. Ideally, this would look something like a `Multivariate` version of `DiscreteNonParametric` in `Distributions.jl`. I’m sure this wouldn’t be a big lift to implement, but I don’t want to reinvent the wheel if it’s already been done.

---

<div class="post-metadata">

### Author: ![gdalle](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gdalle/32/27854_2.png) [@gdalle](https://discourse.julialang.org/u/gdalle)
#### Post date: [January 22, 2025, 6:46am UTC](https://discourse.julialang.org/t/package-for-non-parametric-multivariate-discrete-distributions/125046/2 "2025-01-22T06:46:03Z")

</div>

If it is just for sampling, Distributions.jl contains utilities to build product distributions. However, I’m not sure they necessarily support parameter fitting

---

<div class="post-metadata">

### Author: ![bmit](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bmit/32/12443_2.png) [@bmit](https://discourse.julialang.org/u/bmit)
#### Post date: [January 26, 2025, 11:16pm UTC](https://discourse.julialang.org/t/package-for-non-parametric-multivariate-discrete-distributions/125046/3 "2025-01-26T23:16:13Z")

</div>

Unfortunately every joint distribution can’t just be represented as a product.

E.g.

```julia
using LinearAlgebra
a = normalize(rand(3,4), 1)
a1 = sum(a, dims=1)
a2 = sum(a, dims=2)
anew = a2 * a1
anew ≈ a #false

```

In this case `anew` is a valid joint distribution equal to the product of the marginals of `a`, but it is not equal to `a`.

---

<div class="post-metadata">

### Author: ![gdalle](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gdalle/32/27854_2.png) [@gdalle](https://discourse.julialang.org/u/gdalle)
#### Post date: [January 27, 2025, 6:48am UTC](https://discourse.julialang.org/t/package-for-non-parametric-multivariate-discrete-distributions/125046/4 "2025-01-27T06:48:29Z")

</div>

What kind of representation do you need? If you don’t mind an “extended” representation (as in, every tuple has its own probability mass and we disregard the connections between said masses), you can always encode all your tuples as integers, even though it’s a hassle.  
On the other hand, if you want a “compact” representation, where the dependencies between probability masses are accounted for (typically this would make sense for your example above), you may want to look for libraries to handle probabilistic graphical models.
