[SciPy-User] understanding machine precision

josef.pktd at gmail.com josef.pktd at gmail.com
Tue Dec 14 13:38:12 EST 2010


On Tue, Dec 14, 2010 at 1:09 PM, Francesc Alted <faltet at pytables.org> wrote:
> A Tuesday 14 December 2010 18:42:40 josef.pktd at gmail.com escrigué:
>> I thought that we get deterministic results, with identical machine
>> precision errors, but I get (with some random a0, b0)
>>
>> >>> for i in range(5):
>>       x = scipy.linalg.lstsq(a0,b0)[0]
>>       x2 = scipy.linalg.lstsq(a0,b0)[0]
>>       print np.max(np.abs(x-x2))
>>
>>
>> 9.99200722163e-016
>> 9.99200722163e-016
>> 0.0
>> 0.0
>> 9.99200722163e-016
>>
>> >>> a0.shape
>>
>> (100, 10)
>>
>> >>> b0.shape
>>
>> (100, 3)
>>
>> Why is the result not always the same? just curious
>
> That's really funny!  Could you please come up with a self-contained
> example so as to see if others can reproduce that?

Essentially all I did was

    a0 = np.random.randn(100,10)
    b0 = a0.sum(1)[:,None] + np.random.randn(100,3)

I copied scipy.linalg pinv, pinv2 and lstsq to a local module, and the
results where not exactly the same as with the ones in scipy.
So, I did this check for scipy also.

the attached script produces different results in each run (on
WindowsXP 32), for example

lstsq
1.55431223448e-015
1.55431223448e-015
0.0
1.55431223448e-015
1.55431223448e-015

pinv
5.20417042793e-017
5.20417042793e-017
0.0
0.0
0.0

pinv2
0.0
0.0
5.76795555762e-017
5.76795555762e-017
4.51028103754e-017

Thanks,

Josef

>
> --
> Francesc Alted
> _______________________________________________
> SciPy-User mailing list
> SciPy-User at scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
>
-------------- next part --------------

import numpy as np
import scipy.linalg

np.random.seed(12345)
a0 = np.random.randn(100,10)
b0 = a0.sum(1)[:,None] + np.random.randn(100,3)


print '\nlstsq'
for i in range(5):
    x = scipy.linalg.lstsq(a0,b0)[0]
    x2 = scipy.linalg.lstsq(a0,b0)[0]
    print np.max(np.abs(x-x2))

print '\npinv'
for i in range(5):
    x = scipy.linalg.pinv(a0)
    x2 = scipy.linalg.pinv(a0)
    print np.max(np.abs(x-x2))

print '\npinv2'
for i in range(5):
    x = scipy.linalg.pinv2(a0)
    x2 = scipy.linalg.pinv2(a0)
    print np.max(np.abs(x-x2))


More information about the SciPy-User mailing list