vonmises.py 963 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. from __future__ import division, print_function, absolute_import
  2. import numpy as np
  3. import scipy.stats
  4. from scipy.special import i0
  5. def von_mises_cdf_series(k,x,p):
  6. x = float(x)
  7. s = np.sin(x)
  8. c = np.cos(x)
  9. sn = np.sin(p*x)
  10. cn = np.cos(p*x)
  11. R = 0
  12. V = 0
  13. for n in range(p-1,0,-1):
  14. sn, cn = sn*c - cn*s, cn*c + sn*s
  15. R = 1./(2*n/k + R)
  16. V = R*(sn/n+V)
  17. return 0.5+x/(2*np.pi) + V/np.pi
  18. def von_mises_cdf_normalapprox(k, x):
  19. b = np.sqrt(2/np.pi)*np.exp(k)/i0(k)
  20. z = b*np.sin(x/2.)
  21. return scipy.stats.norm.cdf(z)
  22. def von_mises_cdf(k,x):
  23. ix = 2*np.pi*np.round(x/(2*np.pi))
  24. x = x-ix
  25. k = float(k)
  26. # These values should give 12 decimal digits
  27. CK = 50
  28. a = [28., 0.5, 100., 5.0]
  29. if k < CK:
  30. p = int(np.ceil(a[0]+a[1]*k-a[2]/(k+a[3])))
  31. F = np.clip(von_mises_cdf_series(k,x,p),0,1)
  32. else:
  33. F = von_mises_cdf_normalapprox(k, x)
  34. return F+ix