Guest User

Untitled

a guest
Jan 21st, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.99 KB | None | 0 0
  1.  
  2. import datetime
  3. import sys
  4. import random
  5. import numpy as np
  6.  
  7.  
  8. def _rank_dists(ranks1, ranks2):
  9. """Finds the difference between the values in ranks1 and ranks2 for keys
  10. present in both arrays.
  11. """
  12. #Find keys in both arrays
  13. d = ranks1[np.in1d(ranks1['keys'], ranks2['keys'])]
  14. d2 = ranks2[np.in1d(ranks2['keys'], ranks1['keys'])]
  15.  
  16. #Sort the arrays (based on the keys)
  17. d = np.sort(d, order=['ranks'])[::-1]
  18. d2 = np.sort(d2, order=['ranks'])[::-1]
  19.  
  20. #Return the differences
  21. return d['ranks'] - d2['ranks']
  22.  
  23.  
  24. #@profile
  25. def spearman_correlation(ranks1, ranks2):
  26. """Returns the Spearman correlation coefficient for two rankings, which
  27. should be dicts or sequences of (key, rank). The coefficient ranges from
  28. -1.0 (ranks are opposite) to 1.0 (ranks are identical), and is only
  29. calculated for keys in both rankings (for meaningful results, remove keys
  30. present in only one list before ranking)."""
  31.  
  32. ranks1 = np.array(ranks1, dtype=[('keys', int), ('ranks', float)])
  33. ranks2 = np.array(ranks2, dtype=[('keys', int), ('ranks', float)])
  34.  
  35. diffs = _rank_dists(ranks1, ranks2)
  36. # diffs ** 2
  37. diffs_s2 = diffs * diffs
  38. #sum all diffs
  39. diffs = np.sum(diffs_s2)
  40.  
  41. n_diffs = diffs_s2.size
  42.  
  43. if diffs_s2.size > 0:
  44. return 1 - (6 * diffs / (n_diffs * (n_diffs * n_diffs - 1)))
  45. else:
  46. return 0.0
  47.  
  48.  
  49. if __name__ == '__main__':
  50. n = sys.argv[1]
  51. n = int(n)
  52.  
  53. possible_items_x = range(1, n+1)
  54. possible_items_y = range(1, n+1)
  55. random.shuffle(possible_items_y)
  56. random.shuffle(possible_items_x)
  57.  
  58. ranks1 = []
  59. ranks2 = []
  60. for x in xrange(n):
  61. item1 = possible_items_x.pop()
  62. item2 = possible_items_y.pop()
  63. ranks1.append((item1, random.random() * 4.0 + 1.0))
  64. ranks2.append((item2, random.random() * 4.0 + 1.0))
  65.  
  66. start_time = datetime.datetime.now()
  67. print spearman_correlation(ranks1, ranks2)
  68. end_time = datetime.datetime.now()
  69. secs = end_time - start_time
  70. print "Main took", secs
Add Comment
Please, Sign In to add comment