[Numpy-discussion] np.random.multinomial weird results

Robert Kern robert.kern at gmail.com
Sat Mar 7 18:57:34 EST 2009


On Sat, Mar 7, 2009 at 17:29,  <josef.pktd at gmail.com> wrote:
> np.random.multinomial  looks weird. Are these bugs, or is there
> something not correct with the explanation.

I would like to know how you are interpreting the documentation.

> Josef
>
> from the help/ docstring:
>
>>>> np.random.multinomial(20, [1/6.]*6, size=2)
> array([[3, 4, 3, 3, 4, 3],
>       [2, 4, 3, 4, 0, 7]])
> For the first run, we threw 3 times 1, 4 times 2, etc. For the second,
> we threw 2 times 1, 4 times 2, etc.
>
>
> Note: we also get a 7 in a six sided dice

No you don't. That value means that in the second trial of 20 tosses,
you rolled a 6-spot seven times. The result of drawing from a
multinomial distribution is the number of times a particular result
came up, *not* the results themselves.

> some more examples with a funny shaped six sided dice:
>
>>>> rvsmn=np.random.multinomial(20, [1/6.]*6, size=2000)
>>>> for i in range(rvsmn.min(),rvsmn.max()+1):print i, (rvsmn==i).sum(0)/20.0
>
> 0 [ 2.9   2.25  2.45  2.55  2.65  2.85]
> 1 [  9.15   9.75  10.8   11.4   11.1   10.7 ]
> 2 [ 20.8   20.    20.25  19.65  18.9   19.2 ]
> 3 [ 23.75  24.4   23.3   22.75  23.5   23.15]
> 4 [ 20.85  20.8   20.4   20.95  20.15  19.25]
> 5 [ 12.6   12.55  12.6   12.55  13.3   14.75]
> 6 [ 6.4   6.65  6.95  6.55  6.8   6.35]
> 7 [ 2.8   2.25  2.45  2.8   2.55  2.75]
> 8 [ 0.5   0.85  0.55  0.55  0.85  0.85]
> 9 [ 0.2   0.4   0.15  0.1   0.15  0.05]
> 10 [ 0.05  0.1   0.1   0.1   0.05  0.1 ]
> 11 [ 0.    0.    0.    0.05  0.    0.  ]

And? What do you think you are testing here? A more appropriate test would be:

rvsmn = np.random.multinomial(N, np.ones(M)/M, size=L)
assert is_kinda_close(rvsmn.mean(axis=0) / N, np.ones(M)/M)

>>>> rvsmn=np.random.multinomial(1, [1/6.]*6, size=2000)
>>>> for i in range(rvsmn.min(),rvsmn.max()+1):print i, (rvsmn==i).sum(0)/20.0
>
> 0 [ 81.9   83.35  84.85  84.25  83.7   81.95]
> 1 [ 18.1   16.65  15.15  15.75  16.3   18.05]
>>>> rvsmn=np.random.multinomial(2, [1/6.]*6, size=2000)
>>>> for i in range(rvsmn.min(),rvsmn.max()+1):print i, (rvsmn==i).sum(0)/20.0
>
> 0 [ 70.45  71.6   68.9   68.1   68.    69.75]
> 1 [ 26.45  26.1   28.35  28.75  29.6   27.15]
> 2 [ 3.1   2.3   2.75  3.15  2.4   3.1 ]
>
>>>> rvsmn=np.random.multinomial(2000, [1/6.]*6, size=1)
>>>> rvsmn.shape
> (1, 6)
>>>> rvsmn
> array([[330, 348, 332, 326, 337, 327]])
>>>> rvsmn=np.random.multinomial(2000, [1/6.]*6)
>>>> rvsmn.shape
> (6,)
>>>> rvsmn
> array([334, 322, 323, 348, 322, 351])
>
>
> Note: this are the tests for multinomial
> class TestMultinomial(TestCase):
>    def test_basic(self):
>        random.multinomial(100, [0.2, 0.8])
>
>    def test_zero_probability(self):
>        random.multinomial(100, [0.2, 0.8, 0.0, 0.0, 0.0])

These are testing that the call doesn't fail.

-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless
enigma that is made terrible by our own mad attempt to interpret it as
though it had an underlying truth."
  -- Umberto Eco



More information about the NumPy-Discussion mailing list