# On mixtures of normals in the documentation

In the documentation of mixture model (https://docs.pymc.io/api/distributions/mixture.html)
I saw the following snippet:

What’s the difference between the `sigma` in `pm.Normal` and the `sigma` in `pm.Normal.dist`?

``````npop = 5
nd = (3, 4)
with pm.Model() as model:
mu = pm.Normal('mu', mu=np.arange(npop), sigma=1, shape=npop) # Each component has an independent mean

w = pm.Dirichlet('w', a=np.ones(npop))

components = pm.Normal.dist(mu=mu, sigma=1, shape=nd + (npop,))  # nd + (npop,) shaped multinomial

like = pm.Mixture('like', w=w, comp_dists = components, observed=data, shape=nd)  # The resulting mixture is nd-shaped
``````

The `pm.Normal` defines the prior distribution of the component means. `pm.Normal.dist` is the component-specific distribution. So the exact mean of each component is unknown but has the prior distribution given by `pm.Normal` and the random variables of a given component `i` are known to be distributed as given by `pm.Normal.dist(mu=mu[i], sigma=1)`.

Setting a small `sigma` in `pm.Normal.dist` and a large `sigma` in `pm.Normal` would result in a mixture distribution that consists of narrow peaks that are far apart. `sigma` of `pm.Normal.dist` corresponds to the width of the peaks and `sigma` of `pm.Normal` to how sparsely they are distributed.

3 Likes

Also, from a program execution point of view, `pm.Normal.dist(...)` returns an object with type `<pymc3.distributions.continuous.Normal>`, it is not a random variable and will not be added to your model directly (as one of the node in the computation). And since it is not a variable you cannot do operation on it (you cannot multiple, add, etc).

Thank you for the answers and insights. @Dominik @junpenglao