corems.molecular_id.calc.math_distance
1import warnings 2 3import numpy as np 4import scipy.stats 5 6""" Collection of spectral similarity methods. 7 8Based on Yuanyue Li code at https://github.com/YuanyueLi/SpectralEntropy/blob/master/spectral_entropy/math_distance.py 9and paper: Li, Y., Kind, T., Folz, J. et al. Spectral entropy outperforms MS/MS dot product similarity for small-molecule compound identification. Nat Methods 18, 1524–1531 (2021). https://doi.org/10.1038/s41592-021-01331-z 10""" 11 12 13def entropy_distance(v, y): 14 """Calculate entropy distance between two vectors 15 16 Parameters 17 ---------- 18 v : array_like 19 Vector 1 20 y : array_like 21 Vector 2 22 23 Returns 24 ------- 25 float 26 Entropy distance between v and y 27 28 """ 29 merged = v + y 30 entropy_increase = ( 31 2 * scipy.stats.entropy(merged) 32 - scipy.stats.entropy(v) 33 - scipy.stats.entropy(y) 34 ) 35 return entropy_increase 36 37 38def _weight_intensity_for_entropy(x): 39 """Weight intensity for entropy 40 41 Parameters 42 ---------- 43 x : array_like 44 Vector 45 46 Returns 47 ------- 48 array_like 49 Weighted vector 50 """ 51 if sum(x) > 0: 52 WEIGHT_START = 0.25 53 WEIGHT_SLOPE = 0.5 54 55 entropy_x = scipy.stats.entropy(x) 56 weight = WEIGHT_START + WEIGHT_SLOPE * entropy_x 57 x = np.power(x, weight) 58 x = x / sum(x) 59 return x 60 61 62def weighted_entropy_distance(v, y): 63 """Calculate weighted entropy distance between two vectors 64 65 Parameters 66 ---------- 67 v : array_like 68 Vector 1 69 y : array_like 70 Vector 2 71 72 Returns 73 ------- 74 float 75 Weighted entropy distance between v and y 76 """ 77 v = _weight_intensity_for_entropy(v) 78 y = _weight_intensity_for_entropy(y) 79 80 merged = v + y 81 entropy_increase = ( 82 2 * scipy.stats.entropy(merged) 83 - scipy.stats.entropy(v) 84 - scipy.stats.entropy(y) 85 ) 86 return entropy_increase 87 88 89def chebyshev_distance(v, y): 90 r"""Chebyshev distance 91 92 Parameters 93 ---------- 94 v : array_like 95 Vector 1 96 y : array_like 97 Vector 2 98 99 Returns 100 ------- 101 float 102 Chebyshev distance between v and y 103 104 Notes 105 ----- 106 .. math:: 107 108 \underset{i}{\max}{(|v_{i}\ -\ y_{i}|)} 109 """ 110 return np.max(np.abs(v - y)) 111 112 113def squared_euclidean_distance(v, y): 114 r"""Squared Euclidean distance: 115 116 Parameters 117 ---------- 118 v : array_like 119 Vector 1 120 y : array_like 121 Vector 2 122 123 Returns 124 ------- 125 float 126 Squared Euclidean distance between v and y 127 128 Notes 129 ----- 130 .. math:: 131 132 \sum(v_{i}-y_{i})^2 133 """ 134 return np.sum(np.power(v - y, 2)) 135 136 137def fidelity_similarity(v, y): 138 r"""Fidelity similarity: 139 140 Parameters 141 ---------- 142 v : array_like 143 Vector 1 144 y : array_like 145 Vector 2 146 147 Returns 148 ------- 149 float 150 Fidelity similarity between v and y 151 Notes 152 ----- 153 .. math:: 154 155 \sum\sqrt{v_{i}y_{i}} 156 """ 157 return np.sum(np.sqrt(v * y)) 158 159 160def matusita_distance(v, y): 161 r"""Matusita distance: 162 163 Parameters 164 ---------- 165 v : array_like 166 Vector 1 167 y : array_like 168 Vector 2 169 170 Returns 171 ------- 172 float 173 Matusita distance between v and y 174 175 Notes 176 ----- 177 .. math:: 178 179 \sqrt{\sum(\sqrt{v_{i}}-\sqrt{y_{i}})^2} 180 """ 181 return np.sqrt(np.sum(np.power(np.sqrt(v) - np.sqrt(y), 2))) 182 183 184def squared_chord_distance(v, y): 185 r"""Squared-chord distance: 186 187 Parameters 188 ---------- 189 v : array_like 190 Vector 1 191 y : array_like 192 Vector 2 193 194 Returns 195 ------- 196 float 197 Squared-chord distance between v and y 198 199 Notes 200 ----- 201 .. math:: 202 203 \sum(\sqrt{v_{i}}-\sqrt{y_{i}})^2 204 """ 205 return np.sum(np.power(np.sqrt(v) - np.sqrt(y), 2)) 206 207 208def bhattacharya_1_distance(v, y): 209 r"""Bhattacharya 1 distance: 210 211 Parameters 212 ---------- 213 v : array_like 214 Vector 1 215 y : array_like 216 Vector 2 217 218 Returns 219 ------- 220 float 221 Bhattacharya 1 distance between v and y 222 223 Notes 224 ----- 225 .. math:: 226 227 (\arccos{(\sum\sqrt{v_{i}y_{i}})})^2 228 """ 229 s = np.sum(np.sqrt(v * y)) 230 # TODO:Fix this! 231 if s > 1: 232 if s > 1 + 1e-6: 233 warnings.warn( 234 "Error in calculating Bhattacharya 1 distance, got arccos {}".format(s) 235 ) 236 s = 1 237 return np.power(np.arccos(s), 2) 238 239 240def bhattacharya_2_distance(v, y): 241 r"""Bhattacharya 2 distance: 242 243 Parameters 244 ---------- 245 v : array_like 246 Vector 1 247 y : array_like 248 Vector 2 249 250 Returns 251 ------- 252 float 253 Bhattacharya 2 distance between v and y 254 Notes 255 ----- 256 .. math:: 257 258 -\ln{(\sum\sqrt{v_{i}y_{i}})} 259 """ 260 s = np.sum(np.sqrt(v * y)) 261 if s == 0: 262 return np.inf 263 else: 264 return -np.log(s) 265 266 267def harmonic_mean_similarity(v, y): 268 r"""Harmonic mean similarity: 269 270 Parameters 271 ---------- 272 v : array_like 273 Vector 1 274 y : array_like 275 Vector 2 276 277 Returns 278 ------- 279 float 280 Harmonic mean similarity between v and y 281 282 Notes 283 ----- 284 .. math:: 285 286 #1-2\sum(\frac{v_{i}y_{i}}{v_{i}+y_{i}}) 287 2\sum(\frac{v_{i}y_{i}}{v_{i}+y_{i}}) 288 """ 289 # return 1 - 2 * np.sum(v * y / (v + y)) 290 return 2 * np.sum(v * y / (v + y)) 291 292 293# def pearson_chi_squared_distance(v, y): 294# r""" 295# Pearson χ2 distance: 296# 297# .. math:: 298# 299# \sum\frac{(v_{i}-y_{i})^2}{y_{i}} 300# """ 301# return np.sum(np.power(v - y, 2) / y) 302 303 304# def neyman_chi_squared_distance(v, y): 305# r""" 306# Neyman χ2 distance: 307# 308# .. math:: 309# 310# \sum\frac{(v_{i}-y_{i})^2}{v_{i}} 311# """ 312# return np.sum(np.power(v - y, 2) / v) 313 314 315# def probabilistic_symmetric_chi_squared_distance(v, y): 316# r""" 317# Probabilistic symmetric χ2 distance: 318# 319# .. math:: 320# 321# \frac{1}{2} \times \sum\frac{(v_{i}-y_{i}\ )^2}{v_{i}+y_{i}\ } 322# """ 323# return 1 / 2 * np.sum(np.power(v - y, 2) / (v + y)) 324 325 326# def topsoe_distance(v, y): 327# r""" 328# Topsøe distance: 329# 330# .. math:: 331# 332# \sum{(v_{i}ln\frac{v_{i}}{Z_i}+y_{i}ln\frac{y_{i}}{Z_i}),\ \ \ Z_i=\frac{1}{2}(v_{i}+y_{i})} 333# """ 334# z = 1 / 2 * (v + y) 335# z[z == 0] = 1 336# vz = v / z 337# yz = y / z 338# vz[v == 0] = 1 339# yz[y == 0] = 1 340# return np.sum(v * np.log(vz) + y * np.log(yz)) 341 342 343def chernoff_distance(v, y): 344 r"""Chernoff distance: 345 346 Parameters 347 ---------- 348 v : array_like 349 Vector 1 350 y : array_like 351 Vector 2 352 353 Returns 354 ------- 355 float 356 Chernoff distance between v and y 357 358 Notes 359 ----- 360 .. math:: 361 362 \max{(-ln\sum(v_{i}^ty_{i}^{1-t})^{1-t})},\ t=0.1,\ 0\le\ t<1 363 """ 364 t = 0.1 365 return np.max(-np.log(np.sum(np.power(np.power(v, t) * np.power(y, 1 - t), 1 - t)))) 366 367 368def ruzicka_distance(v, y): 369 r"""Ruzicka distance: 370 371 Parameters 372 ---------- 373 v : array_like 374 Vector 1 375 y : array_like 376 Vector 2 377 378 Returns 379 ------- 380 float 381 Ruzicka distance between v and y 382 383 Notes 384 ----- 385 .. math:: 386 387 \frac{\sum{|v_{i}-y_{i}|}}{\sum{\max(v_{i},y_{i})}} 388 """ 389 dist = np.sum(np.abs(v - y)) / np.sum(np.maximum(v, y)) 390 return dist 391 392 393def roberts_distance(v, y): 394 r"""Roberts distance: 395 396 Parameters 397 ---------- 398 v : array_like 399 Vector 1 400 y : array_like 401 Vector 2 402 403 Returns 404 ------- 405 float 406 Roberts distance between v and y 407 408 Notes 409 ----- 410 .. math:: 411 412 1-\sum\frac{(v_{i}+y_{i})\frac{\min{(v_{i},y_{i})}}{\max{(v_{i},y_{i})}}}{\sum(v_{i}+y_{i})} 413 """ 414 return 1 - np.sum((v + y) * np.minimum(v, y) / np.maximum(v, y) / np.sum(v + y)) 415 416 417def intersection_distance(v, y): 418 r"""Intersection distance: 419 420 Parameters 421 ---------- 422 v : array_like 423 Vector 1 424 y : array_like 425 Vector 2 426 427 Returns 428 ------- 429 float 430 Intersection distance between v and y 431 432 Notes 433 ----- 434 .. math:: 435 436 1-\frac{\sum\min{(v_{i},y_{i})}}{\min(\sum{v_{i},\sum{y_{i})}}} 437 """ 438 return 1 - np.sum(np.minimum(v, y)) / min(np.sum(v), np.sum(y)) 439 440 441def motyka_distance(v, y): 442 r"""Motyka distance: 443 444 Parameters 445 ---------- 446 v : array_like 447 Vector 1 448 y : array_like 449 Vector 2 450 451 Returns 452 ------- 453 float 454 Motyka distance between v and y 455 Notes 456 ----- 457 .. math:: 458 459 -\frac{\sum\min{(y_{i},v_{i})}}{\sum(y_{i}+v_{i})} 460 """ 461 dist = np.sum(np.minimum(v, y)) / np.sum(v + y) 462 return dist 463 464 465def canberra_distance(v, y): 466 r"""Canberra distance: 467 468 Parameters 469 ---------- 470 v : array_like 471 Vector 1 472 y : array_like 473 Vector 2 474 475 Returns 476 ------- 477 float 478 Canberra distance between v and y 479 480 Notes 481 ----- 482 .. math:: 483 484 #\sum\frac{|v_{i}-y_{i}|}{|v_{i}|+|y_{i}|} 485 \sum_{i}\frac{|y_{i} - v_{i}|}{y_{i} + v_{i}} 486 """ 487 # return np.sum(np.abs(v - y) / (np.abs(v) + np.abs(y))) 488 return np.sum(np.abs(y - v) / (y + v)) 489 490 491def canberra_metric(v, y): 492 r"""Canberra Metric 493 494 Parameters 495 ---------- 496 v : array_like 497 Vector 1 498 y : array_like 499 Vector 2 500 501 Returns 502 ------- 503 float 504 Canberra metric between v and y 505 Notes 506 ----- 507 .. math:: 508 509 \frac{1}{\sum_{i}I(v_{i}\neq 0)}\sum_{i}\frac{|y_{i}-v_{i}|}{(y_{i}+v_{i})} 510 """ 511 512 return (1 / np.sum(v > 0)) * np.sum(np.abs(y - v) / (y + v)) 513 514 515def kulczynski_1_distance(v, y): 516 r"""Kulczynski 1 distance: 517 518 Parameters 519 ---------- 520 v : array_like 521 Vector 1 522 y : array_like 523 Vector 2 524 525 Returns 526 ------- 527 float 528 Kulczynski 1 distance between v and y 529 530 Notes 531 ----- 532 .. math:: 533 534 \frac{\sum{|v_i}-y_i|}{\sum m\ i\ n\ (v_i,y_i)} 535 """ 536 return np.sum(np.abs(y - v)) / np.sum(np.minimum(y, v)) 537 538 539def baroni_urbani_buser_distance(v, y): 540 r"""Baroni-Urbani-Buser distance: 541 542 Parameters 543 ---------- 544 v : array_like 545 Vector 1 546 y : array_like 547 Vector 2 548 549 Returns 550 ------- 551 float 552 Baroni-Urbani-Buser distance between v and y 553 554 Notes 555 ----- 556 .. math:: 557 558 1-\frac{\sum\min{(v_i,y_i)}+\sqrt{\sum\min{(v_i,y_i)}\sum(\max{(v)}-\max{(v_i,y_i)})}}{\sum{\max{(v_i,y_i)}+\sqrt{\sum{\min{(v_i,y_i)}\sum(\max{(v)}-\max{(v_i,y_i)})}}}} 559 """ 560 if np.max(v) < np.max(y): 561 v, y = y, v 562 d1 = np.sqrt(np.sum(np.minimum(v, y) * np.sum(max(v) - np.maximum(v, y)))) 563 return 1 - (np.sum(np.minimum(v, y)) + d1) / (np.sum(np.maximum(v, y)) + d1) 564 565 566def penrose_size_distance(v, y): 567 r"""Penrose size distance: 568 569 Parameters 570 ---------- 571 v : array_like 572 Vector 1 573 y : array_like 574 Vector 2 575 576 Returns 577 ------- 578 float 579 Penrose size distance between v and y 580 581 Notes 582 ----- 583 .. math:: 584 585 \sqrt N\sum{|y_i-v_i|} 586 """ 587 n = np.sum(v > 0) 588 return np.sqrt(n) * np.sum(np.abs(y - v)) 589 590 591def mean_character_distance(v, y): 592 r""" 593 Mean character distance: 594 595 Parameters 596 ---------- 597 v : array_like 598 Vector 1 599 y : array_like 600 Vector 2 601 602 Returns 603 ------- 604 float 605 Mean character distance between v and y 606 607 Notes 608 ----- 609 .. math:: 610 611 \frac{1}{N}\sum{|y_i-v_i|} 612 """ 613 n = np.sum(v > 0) 614 return 1 / n * np.sum(np.abs(y - v)) 615 616 617def lorentzian_distance(v, y): 618 r""" 619 Lorentzian distance: 620 621 Parameters 622 ---------- 623 v : array_like 624 Vector 1 625 y : array_like 626 Vector 2 627 628 Returns 629 ------- 630 float 631 Lorentzian distance between v and y 632 633 Notes 634 ----- 635 .. math:: 636 637 \sum{\ln(1+|v_i-y_i|)} 638 """ 639 return np.sum(np.log(1 + np.abs(y - v))) 640 641 642def penrose_shape_distance(v, y): 643 r""" 644 Penrose shape distance: 645 646 Parameters 647 ---------- 648 v : array_like 649 Vector 1 650 y : array_like 651 Vector 2 652 653 Returns 654 ------- 655 float 656 Penrose shape distance between v and y 657 Notes 658 ----- 659 .. math:: 660 661 \sqrt{\sum((v_i-\bar{v})-(y_i-\bar{y}))^2} 662 """ 663 v_avg = np.mean(v) 664 y_avg = np.mean(y) 665 return np.sqrt(np.sum(np.power((y - y_avg) - (v - v_avg), 2))) 666 667 668def clark_distance(v, y): 669 r""" 670 Clark distance: 671 672 Parameters 673 ---------- 674 v : array_like 675 Vector 1 676 y : array_like 677 Vector 2 678 679 Returns 680 ------- 681 float 682 Clark distance between v and y 683 684 Notes 685 ----- 686 .. math:: 687 688 #(\frac{1}{N}\sum(\frac{v_i-y_i}{|v_i|+|y_i|})^2)^\frac{1}{2} 689 \sqrt{\sum(\frac{|v_i-y_i|}{v_i+y_i})^2} 690 """ 691 # n = np.sum(v > 0) 692 # return np.sqrt(1 / n * np.sum(np.power((v - y) / (np.abs(v) + np.abs(y)), 2))) 693 return np.sqrt(np.sum(np.power(np.abs(y - v) / (y + v), 2))) 694 695 696def hellinger_distance(v, y): 697 r""" 698 Hellinger distance: 699 700 Parameters 701 ---------- 702 v : array_like 703 Vector 1 704 y : array_like 705 Vector 2 706 707 Returns 708 ------- 709 float 710 Hellinger distance between v and y 711 712 Notes 713 ----- 714 .. math:: 715 716 #\sqrt{2\sum(\sqrt{\frac{v_i}{\bar{v}}}-\sqrt{\frac{y_i}{\bar{y}}})^2} 717 \sqrt{2\sum(\sqrt{v_i}-\sqrt{y_i})^2} 718 """ 719 # v_avg = np.mean(v) 720 # y_avg = np.mean(y) 721 # return np.sqrt(2 * np.sum(np.power(np.sqrt(v / v_avg) - np.sqrt(y / y_avg), 2))) 722 return np.sqrt(2 * np.sum(np.power(np.sqrt(y) - np.sqrt(v), 2))) 723 724 725def whittaker_index_of_association_distance(v, y): 726 r""" 727 Whittaker index of association distance: 728 729 Parameters 730 ---------- 731 v : array_like 732 Vector 1 733 y : array_like 734 Vector 2 735 736 Returns 737 ------- 738 float 739 Whittaker index of association distance between v and y 740 741 Notes 742 ----- 743 .. math:: 744 745 \frac{1}{2}\sum|\frac{v_i}{\bar{v}}-\frac{y_i}{\bar{y}}| 746 """ 747 v_avg = np.mean(v) 748 y_avg = np.mean(y) 749 return 1 / 2 * np.sum(np.abs(v / v_avg - y / y_avg)) 750 751 752# def symmetric_chi_squared_distance(v, y): 753# r""" 754# Symmetric χ2 distance: 755# 756# .. math:: 757# 758# \sqrt{\sum{\frac{\bar{v}+\bar{y}}{N(\bar{v}+\bar{y})^2}\frac{(v_i\bar{y}-y_i\bar{v})^2}{v_i+y_i}\ }} 759# """ 760# v_avg = np.mean(v) 761# y_avg = np.mean(y) 762# n = np.sum(v > 0) 763# 764# d1 = (v_avg + y_avg) / (n * np.power(v_avg + y_avg, 2)) 765# return np.sqrt(d1 * np.sum(np.power(v * y_avg - y * v_avg, 2) / (v + y))) 766 767 768def similarity_index_distance(v, y): 769 r""" 770 Similarity Index Distance: 771 772 Parameters 773 ---------- 774 v : array_like 775 Vector 1 776 y : array_like 777 Vector 2 778 779 Returns 780 ------- 781 float 782 Similarity Index Distance between v and y 783 784 Notes 785 ----- 786 .. math:: 787 788 \sqrt{\frac{\sum\{\frac{v_i-y_i}{y_i}\}^2}{N}} 789 """ 790 n = np.sum(v > 0) 791 return np.sqrt(1 / n * np.sum(np.power((v - y) / y, 2))) 792 793 794def improved_similarity_distance(v, y): 795 r""" 796 Improved Similarity Index: 797 798 Parameters 799 ---------- 800 v : array_like 801 Vector 1 802 y : array_like 803 Vector 2 804 805 Returns 806 ------- 807 float 808 Improved Similarity Index between v and y 809 810 Notes 811 ----- 812 .. math:: 813 814 \sqrt{\frac{1}{N}\sum\{\frac{y_i-v_i}{y_i+v_i}\}^2} 815 """ 816 n = np.sum(v > 0) 817 return np.sqrt(1 / n * np.sum(np.power((y - v) / (y + v), 2))) 818 819 820def absolute_value_distance(v, y): 821 r""" 822 Absolute Value Distance: 823 824 Parameters 825 ---------- 826 v : array_like 827 Vector 1 828 y : array_like 829 Vector 2 830 831 Returns 832 ------- 833 float 834 Absolute Value Distance between v and y 835 836 Notes 837 ----- 838 .. math:: 839 840 \frac { \sum(|y_i-v_i|)}{\sum v_i} 841 842 """ 843 dist = np.sum(np.abs(y - v)) / np.sum(v) 844 return dist 845 846 847def spectral_contrast_angle_distance(v, y): 848 r""" 849 Spectral Contrast Angle: 850 851 Parameters 852 ---------- 853 v : array_like 854 Vector 1 855 y : array_like 856 Vector 2 857 858 Returns 859 ------- 860 float 861 Spectral Contrast Angle between v and y 862 863 Notes 864 ----- 865 .. math:: 866 867 1 - \frac{\sum{y_iv_i}}{\sqrt{\sum y_i^2\sum v_i^2}} 868 \arccos(\frac{\sum_{P}y_{p}^* v_{p}^*}{\sqrt{\sum_{P}y_{p}^{*2} \sum_{P}v_{p}^{*2}}}) 869 """ 870 # return 1 - np.sum(y * v) / \ 871 # np.sqrt(np.sum(np.power(y, 2)) * np.sum(np.power(v, 2))) 872 873 return np.arccos( 874 np.sum(y * v) / (np.sqrt(np.sum(np.power(y, 2)) * np.sum(np.power(v, 2)))) 875 ) 876 877 878def wave_hedges_distance(v, y): 879 r""" 880 Wave Hedges distance: 881 882 Parameters 883 ---------- 884 v : array_like 885 Vector 1 886 y : array_like 887 Vector 2 888 889 Returns 890 ------- 891 float 892 Wave Hedges distance between v and y 893 894 Notes 895 ----- 896 .. math:: 897 898 \sum\frac{|v_i-y_i|}{\max{(v_i,y_i)}} 899 """ 900 return np.sum(np.abs(v - y) / np.maximum(v, y)) 901 902 903def dice_similarity(v, y): 904 r""" 905 Dice similarity: 906 907 Parameters 908 ---------- 909 v : array_like 910 Vector 1 911 y : array_like 912 Vector 2 913 914 Returns 915 ------- 916 float 917 Dice similarity between v and y 918 919 Notes 920 ----- 921 .. math:: 922 923 \frac{\sum(v_i-y_i)^2}{\sum v_i^2+\sum y_i^2} 924 \frac{2 * \sum_{i}v_{i}y_{i}}{\sum_{i}y_{i}^2 + \sum_{i}v_{i}^2} 925 """ 926 return 2 * np.sum(v * y) / (np.sum(np.power(v, 2)) + np.sum(np.power(y, 2))) 927 928 929def inner_product_distance(v, y): 930 r""" 931 Inner Product distance: 932 933 Parameters 934 ---------- 935 v : array_like 936 Vector 1 937 y : array_like 938 Vector 2 939 940 Returns 941 ------- 942 float 943 Inner product distance between v and y 944 945 Notes 946 ----- 947 .. math:: 948 949 1-\sum{v_iy_i} 950 """ 951 return 1 - np.sum(v * y) 952 953 954def divergence_distance(v, y): 955 r""" 956 Divergence distance: 957 958 Parameters 959 ---------- 960 v : array_like 961 Vector 1 962 y : array_like 963 Vector 2 964 965 Returns 966 ------- 967 float 968 Divergence distance between v and y 969 970 Notes 971 ----- 972 .. math:: 973 974 2\sum\frac{(v_i-y_i)^2}{(v_i+y_i)^2} 975 """ 976 return 2 * np.sum((np.power(v - y, 2)) / np.power(v + y, 2)) 977 978 979def _chi_squared_distance(v, y): 980 r""" 981 Additive symmetric χ2 distance: 982 983 Parameters 984 ---------- 985 v : array_like 986 Vector 1 987 y : array_like 988 Vector 2 989 990 Returns 991 ------- 992 float 993 Additive symmetric χ2 distance between v and y 994 995 Notes 996 ----- 997 .. math:: 998 999 \sum\frac{(v_i-y_i)^2(v_i+y_i)}{v_iy_i} 1000 """ 1001 dist = np.sum(np.power(v - y, 2) * (v + y) / (v * y)) 1002 return dist 1003 1004 1005def jensen_difference_distance(v, y): 1006 r""" 1007 Jensen difference: 1008 1009 Parameters 1010 ---------- 1011 v : array_like 1012 Vector 1 1013 y : array_like 1014 Vector 2 1015 1016 Returns 1017 ------- 1018 float 1019 Jensen difference distance between v and y 1020 1021 Notes 1022 ----- 1023 .. math:: 1024 1025 \sum[\frac{1}{2}(v_i\ln{v_i}+y_i\ln{y_i})-(\frac{v_i+y_i}{2})\ln{(\frac{v_i+y_i}{2})}] 1026 """ 1027 y_v_avg = (y + v) / 2 1028 return np.sum(1 / 2 * (y * np.log(y) + v * np.log(v)) - y_v_avg * np.log(y_v_avg)) 1029 1030 1031def kumar_johnson_distance(v, y): 1032 r""" 1033 Kumar-Johnson distance: 1034 1035 Parameters 1036 ---------- 1037 v : array_like 1038 Vector 1 1039 y : array_like 1040 Vector 2 1041 1042 Returns 1043 ------- 1044 float 1045 Kumar Johnson distance between v and y 1046 1047 Notes 1048 ----- 1049 .. math:: 1050 1051 \sum\frac{(v_i^2-y_i^2)^2}{2(v_iy_i)^\frac{3}{2}} 1052 """ 1053 return np.sum( 1054 np.power(np.power(v, 2) - np.power(y, 2), 2) / (2 * np.power(v * y, 3 / 2)) 1055 ) 1056 1057 1058def avg_l_distance(v, y): 1059 r""" 1060 Avg (L1, L∞) distance: 1061 1062 Parameters 1063 ---------- 1064 v : array_like 1065 Vector 1 1066 y : array_like 1067 Vector 2 1068 1069 Returns 1070 ------- 1071 float 1072 Average L distance between v and y 1073 1074 Notes 1075 ----- 1076 .. math:: 1077 1078 \frac{1}{2}(\sum|v_i-y_i|+\underset{i}{\max}{|v_i-y_i|}) 1079 """ 1080 return 1 / 2 * (np.sum(np.abs(v - y)) + max(np.abs(v - y))) 1081 1082 1083def vicis_wave_hadges_distance(v, y): 1084 r""" 1085 Vicis-Wave Hadges distance: 1086 1087 Parameters 1088 ---------- 1089 v : array_like 1090 Vector 1 1091 y : array_like 1092 Vector 2 1093 1094 Returns 1095 ------- 1096 float 1097 Vicis Wave Hadges distance between v and y 1098 1099 Notes 1100 ----- 1101 .. math:: 1102 1103 \sum\frac{|v_i-y_i|}{\min{(v_i,\ y_i)}} 1104 """ 1105 return np.sum(np.abs(v - y) / np.minimum(v, y)) 1106 1107 1108def vicis_symmetric_chi_squared_1_distance(v, y): 1109 r""" 1110 Vicis-Symmetric χ2 1 distance: 1111 1112 Parameters 1113 ---------- 1114 v : array_like 1115 Vector 1 1116 y : array_like 1117 Vector 2 1118 1119 Returns 1120 ------- 1121 float 1122 Vici Symmetric χ2 1 distance between v and y 1123 1124 Notes 1125 ----- 1126 .. math:: 1127 1128 \sum\frac{(v_i-y_i)^2}{\min{(v_i,y_i)^2}} 1129 """ 1130 return np.sum(np.power(v - y, 2) / np.power(np.minimum(v, y), 2)) 1131 1132 1133def vicis_symmetric_chi_squared_2_distance(v, y): 1134 r""" 1135 Vicis-Symmetric χ2 2 distance: 1136 1137 Parameters 1138 ---------- 1139 v : array_like 1140 Vector 1 1141 y : array_like 1142 Vector 2 1143 1144 Returns 1145 ------- 1146 float 1147 Vicis Symmetric χ2 2 distance between v and y 1148 1149 Notes 1150 ----- 1151 1152 .. math:: 1153 1154 \sum\frac{(v_i-y_i)^2}{\min{(v_i,y_i)}} 1155 """ 1156 return np.sum(np.power(v - y, 2) / np.minimum(v, y)) 1157 1158 1159def vicis_symmetric_chi_squared_3_distance(v, y): 1160 r""" 1161 Vicis-Symmetric χ2 3 distance: 1162 1163 Parameters 1164 ---------- 1165 v : array_like 1166 Vector 1 1167 y : array_like 1168 Vector 2 1169 1170 Returns 1171 ------- 1172 float 1173 Vici Symmetric χ2 3 distance between v and y 1174 1175 Notes 1176 ----- 1177 1178 .. math:: 1179 1180 \sum\frac{(v_i-y_i)^2}{\max{(v_i,y_i)}} 1181 """ 1182 return np.sum(np.power(v - y, 2) / np.maximum(v, y)) 1183 1184 1185def max_symmetric_chi_squared_distance(v, y): 1186 r""" 1187 Max-Symmetric χ2 distance: 1188 1189 Parameters 1190 ---------- 1191 v : array_like 1192 Vector 1 1193 y : array_like 1194 Vector 2 1195 1196 Returns 1197 ------- 1198 float 1199 Max-Symmetric χ2 distance between v and y 1200 1201 Notes 1202 ----- 1203 .. math:: 1204 1205 \max{(\sum\frac{(v_i-y_i)^2}{v_i},\sum\frac{(v_i-y_i)^2}{y_i})} 1206 """ 1207 return max(np.sum(np.power(v - y, 2) / v), np.sum(np.power(v - y, 2) / y)) 1208 1209 1210def min_symmetric_chi_squared_distance(v, y): 1211 r""" 1212 Min-Symmetric χ2 distance: 1213 1214 Parameters 1215 ---------- 1216 v : array_like 1217 Vector 1 1218 y : array_like 1219 Vector 2 1220 1221 Returns 1222 ------- 1223 float 1224 Min-Symmetric χ2 distance between v and y 1225 1226 Notes 1227 ----- 1228 .. math:: 1229 1230 \min{(\sum\frac{(v_i-y_i)^2}{v_i},\sum\frac{(v_i-y_i)^2}{y_i})} 1231 """ 1232 return min(np.sum(np.power(v - y, 2) / v), np.sum(np.power(v - y, 2) / y)) 1233 1234 1235def additive_sym_chi_sq(v, y): 1236 r""" 1237 Additive Symmetric χ2 distance: 1238 1239 Parameters 1240 ---------- 1241 v : array_like 1242 Vector 1 1243 y : array_like 1244 Vector 2 1245 1246 Returns 1247 ------- 1248 float 1249 Additive Symmetric χ2 distance between v and y 1250 1251 Notes 1252 ----- 1253 .. math:: 1254 1255 \sum_{i}\frac{(y_{i} - v_{i})^2(y_{i}+v_{i})}{y_{i}v_{i}} 1256 """ 1257 return np.sum((np.power(y - v, 2) * (y + v)) / (y * v)) 1258 1259 1260def bhattacharya_distance(v, y): 1261 r""" 1262 Bhattacharya Distance: 1263 1264 Parameters 1265 ---------- 1266 v : array_like 1267 Vector 1 1268 y : array_like 1269 Vector 2 1270 1271 Returns 1272 ------- 1273 float 1274 Bhattcharya distance between v and y 1275 1276 Notes 1277 ----- 1278 .. math:: 1279 1280 -ln(\sum_{i}\sqrt{y_{i}v_{i}}) 1281 """ 1282 return -1 * np.log(np.sum(np.sqrt(y * v))) 1283 1284 1285def generalized_ochiai_index(v, y): 1286 r""" 1287 Generalized Ochiai Index 1288 1289 Parameters 1290 ---------- 1291 v : array_like 1292 Vector 1 1293 y : array_like 1294 Vector 2 1295 1296 Returns 1297 ------- 1298 float 1299 Generalized Ochiai Index between v and y 1300 1301 Notes 1302 ----- 1303 .. math:: 1304 1305 1 - \frac{\sum_{i}min(y_{i}, v_{i})}{\sqrt{\sum_{i}y_{i} \sum_{i}v_{i}}} 1306 """ 1307 1308 ind = np.sum(np.minimum(y, v)) / np.sqrt(np.sum(y) * np.sum(v)) 1309 return 1 - ind 1310 1311 1312def gower_distance(v, y): 1313 r""" 1314 Gower Distance 1315 1316 Parameters 1317 ---------- 1318 v : array_like 1319 Vector 1 1320 y : array_like 1321 Vector 2 1322 1323 Returns 1324 ------- 1325 float 1326 Gower distance between v and y 1327 1328 Notes 1329 ----- 1330 1331 .. math:: 1332 1333 \frac{1}{N}\sum_{i}|y_{i} - v_{i}| 1334 """ 1335 1336 n = np.sum(y > 0) 1337 return (1 / n) * np.sum(np.abs(y - v)) 1338 1339 1340def impr_sqrt_cosine_sim(v, y): 1341 r""" 1342 Improved Square Root Cosine Similarity 1343 1344 Parameters 1345 ---------- 1346 v : array_like 1347 Vector 1 1348 y : array_like 1349 Vector 2 1350 1351 Returns 1352 ------- 1353 float 1354 Improved Square Root Cosine Similarity between v and y 1355 1356 Notes 1357 ----- 1358 .. math:: 1359 1360 \frac{\sum_{i}\sqrt{y_{i}v_{i}}}{\sum_{i}\sqrt{y_{i}}\sum_{i}\sqrt{v_{i}}} 1361 """ 1362 1363 return np.sum(np.sqrt(y * v)) / (np.sum(np.sqrt(y)) * np.sum(np.sqrt(v))) 1364 1365 1366def intersection_sim(v, y): 1367 r""" 1368 Intersection Similarity 1369 1370 Parameters 1371 ---------- 1372 v : array_like 1373 Vector 1 1374 y : array_like 1375 Vector 2 1376 1377 Returns 1378 ------- 1379 float 1380 Intersection Similarity between v and y 1381 1382 Notes 1383 ----- 1384 .. math:: 1385 1386 \sum_{i}min(y_{i}, v_{i}) 1387 """ 1388 1389 return np.sum(np.minimum(y, v)) 1390 1391 1392def j_divergence(v, y): 1393 r""" 1394 J Divergence 1395 1396 Parameters 1397 ---------- 1398 v : array_like 1399 Vector 1 1400 y : array_like 1401 Vector 2 1402 1403 Returns 1404 ------- 1405 float 1406 J Divergence between v and y 1407 1408 Notes 1409 ----- 1410 .. math:: 1411 1412 \sum_{i}(y_{i} - v_{i}) ln(\frac{y_{i}}{v_{i}}) 1413 """ 1414 1415 return np.sum((v - y) * np.log(v / y)) 1416 1417 1418def jensen_shannon_index(v, y): 1419 r""" 1420 Jensen-Shannon Index 1421 1422 Parameters 1423 ---------- 1424 v : array_like 1425 Vector 1 1426 y : array_like 1427 Vector 2 1428 1429 Returns 1430 ------- 1431 float 1432 Jensen Shannon Index between v and y 1433 1434 Notes 1435 ----- 1436 .. math:: 1437 1438 \frac{1}{2}[\sum_{i}y_{i}ln(\frac{2y_{i}}{y_{i} + v_{i}}) + \sum_{i}v_{i}ln(\frac{2v_{i}}{y_{i}+v_{i}})] 1439 """ 1440 1441 return (1 / 2) * ( 1442 np.sum(y * np.log(2 * y / (y + v))) + np.sum(v * np.log(2 * v / (y + v))) 1443 ) 1444 1445 1446def k_divergence(v, y): 1447 r""" 1448 K-Divergence 1449 1450 Parameters 1451 ---------- 1452 v : array_like 1453 Vector 1 1454 y : array_like 1455 Vector 2 1456 1457 Returns 1458 ------- 1459 float 1460 K-Divergence between v and y 1461 1462 Notes 1463 ----- 1464 .. math:: 1465 1466 \sum_{i}y_{i}ln(\frac{2y_{i}}{y_{i} + v_{i}}) 1467 """ 1468 1469 return np.sum(v * np.log((2 * v) / (y + v))) 1470 1471 1472def topsoe_distance(v, y): 1473 r"""Topsoe distance 1474 1475 Parameters 1476 ---------- 1477 v : array_like 1478 Vector 1 1479 y : array_like 1480 Vector 2 1481 1482 Returns 1483 ------- 1484 float 1485 Topsoe distance between v and y 1486 1487 Notes 1488 ----- 1489 """ 1490 # [Chae] commented out the previous one; please review 1491 # v[v==0] = 1 #added by amt 1492 # y[y==0] = 1 #added by amt 1493 return np.sum((y * np.log((2 * y) / (y + v))) + (v * np.log((2 * v) / (y + v)))) 1494 1495 1496def probabilistic_symmetric_chi_squared_distance(v, y): 1497 r"""Fixed 1498 "I commented out the previous one; please review" 1499 """ 1500 return 2 * np.sum(np.sum(np.power(y - v, 2) / (y + v))) 1501 1502 1503def VW6(v, y): 1504 r""" 1505 "appears to be the same as max_symmetric_chi_squared_distance" 1506 """ 1507 return min(np.sum(np.power(y - v, 2) / y), np.sum(np.power(y - v, 2) / v)) 1508 1509 1510def VW5(v, y): 1511 r""" 1512 "appears to be the same as max_symmetric_chi_squared_distance" 1513 """ 1514 return max(np.sum(np.power(y - v, 2) / y), np.sum(np.power(y - v, 2) / v)) 1515 1516 1517def VW4(v, y): 1518 r""" 1519 "Tecnically the Symmetric chi2 eq63" 1520 """ 1521 return np.sum(np.power(y - v, 2) / np.maximum(y, v)) 1522 1523 1524def VW3(v, y): 1525 r""" 1526 "New" 1527 """ 1528 return np.sum(np.power(y - v, 2) / np.minimum(y, v)) 1529 1530 1531def VW2(v, y): 1532 r""" 1533 "New" 1534 """ 1535 return np.sum(np.power(y - v, 2) / np.power(np.minimum(y, v), 2)) 1536 1537 1538def VW1(v, y): 1539 r""" 1540 "New" 1541 """ 1542 return np.sum(np.abs(y - v) / np.minimum(y, v)) 1543 1544 1545def taneja_divergence(v, y): 1546 r""" 1547 "New" 1548 """ 1549 return np.sum(((y + v) / 2) * np.log((y + v) / (2 * np.sqrt(y * v)))) 1550 1551 1552def symmetric_chi_squared_distance(v, y): 1553 r""" 1554 "New" 1555 """ 1556 return np.sum(np.power(y - v, 2) / (y * v)) 1557 1558 1559def squared_chi_squared_distance(v, y): 1560 r""" 1561 "New" 1562 """ 1563 return np.sum(np.power(y - v, 2) / (y + v)) 1564 1565 1566def square_root_cosine_correlation(v, y): 1567 r""" 1568 "New" 1569 """ 1570 return np.sum(np.sqrt(y * v)) / (np.sum(y) * np.sum(v)) 1571 1572 1573def sorensen_distance(v, y): 1574 r""" 1575 "New" 1576 """ 1577 return np.sum(np.abs(y - v)) / (np.sum(y + v)) 1578 1579 1580def Pearson_chi_squared_distance(v, y): 1581 r""" 1582 "New" 1583 """ 1584 return np.sum(np.power(y - v, 2) / v) 1585 1586 1587def Neyman_chi_squared_distance(v, y): 1588 r""" 1589 "New" 1590 """ 1591 return np.sum(np.power(y - v, 2) / y) 1592 1593 1594def Minokowski_3(v, y): 1595 r""" 1596 "New" 1597 """ 1598 return np.power(np.sum(np.power(np.abs(y - v), 3)), 1 / 3) 1599 1600 1601def Minokowski_4(v, y): 1602 r""" 1603 "New" 1604 """ 1605 return np.power(np.sum(np.power(np.abs(y - v), 4)), 1 / 4) 1606 1607 1608def kumarjohnson_divergence(v, y): 1609 r""" 1610 "New" 1611 """ 1612 return np.sum( 1613 np.power(np.power(y, 2) + np.power(v, 2), 2) / (2 * np.power(y * v, 3 / 2)) 1614 ) 1615 1616 1617def kumarhassebrook_similarity(v, y): 1618 r""" 1619 "New" 1620 """ 1621 return np.sum(y * v) / ( 1622 np.sum(np.power(y, 2)) + np.sum(np.power(v, 2)) - np.sum(y * v) 1623 ) 1624 1625 1626def kullbackleibler_divergence(v, y): 1627 r""" 1628 "New" 1629 """ 1630 return np.sum(v * np.log(v / y)) 1631 1632 1633def soergel_distance(v, y): 1634 r""" 1635 "New" 1636 """ 1637 return np.sum(np.abs(y - v)) / np.sum(np.maximum(y, v))
14def entropy_distance(v, y): 15 """Calculate entropy distance between two vectors 16 17 Parameters 18 ---------- 19 v : array_like 20 Vector 1 21 y : array_like 22 Vector 2 23 24 Returns 25 ------- 26 float 27 Entropy distance between v and y 28 29 """ 30 merged = v + y 31 entropy_increase = ( 32 2 * scipy.stats.entropy(merged) 33 - scipy.stats.entropy(v) 34 - scipy.stats.entropy(y) 35 ) 36 return entropy_increase
Calculate entropy distance between two vectors
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Entropy distance between v and y
63def weighted_entropy_distance(v, y): 64 """Calculate weighted entropy distance between two vectors 65 66 Parameters 67 ---------- 68 v : array_like 69 Vector 1 70 y : array_like 71 Vector 2 72 73 Returns 74 ------- 75 float 76 Weighted entropy distance between v and y 77 """ 78 v = _weight_intensity_for_entropy(v) 79 y = _weight_intensity_for_entropy(y) 80 81 merged = v + y 82 entropy_increase = ( 83 2 * scipy.stats.entropy(merged) 84 - scipy.stats.entropy(v) 85 - scipy.stats.entropy(y) 86 ) 87 return entropy_increase
Calculate weighted entropy distance between two vectors
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Weighted entropy distance between v and y
90def chebyshev_distance(v, y): 91 r"""Chebyshev distance 92 93 Parameters 94 ---------- 95 v : array_like 96 Vector 1 97 y : array_like 98 Vector 2 99 100 Returns 101 ------- 102 float 103 Chebyshev distance between v and y 104 105 Notes 106 ----- 107 .. math:: 108 109 \underset{i}{\max}{(|v_{i}\ -\ y_{i}|)} 110 """ 111 return np.max(np.abs(v - y))
Chebyshev distance
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Chebyshev distance between v and y
Notes
$$\underset{i}{\max}{(|v_{i}\ -\ y_{i}|)}$$
114def squared_euclidean_distance(v, y): 115 r"""Squared Euclidean distance: 116 117 Parameters 118 ---------- 119 v : array_like 120 Vector 1 121 y : array_like 122 Vector 2 123 124 Returns 125 ------- 126 float 127 Squared Euclidean distance between v and y 128 129 Notes 130 ----- 131 .. math:: 132 133 \sum(v_{i}-y_{i})^2 134 """ 135 return np.sum(np.power(v - y, 2))
Squared Euclidean distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Squared Euclidean distance between v and y
Notes
$$\sum(v_{i}-y_{i})^2$$
138def fidelity_similarity(v, y): 139 r"""Fidelity similarity: 140 141 Parameters 142 ---------- 143 v : array_like 144 Vector 1 145 y : array_like 146 Vector 2 147 148 Returns 149 ------- 150 float 151 Fidelity similarity between v and y 152 Notes 153 ----- 154 .. math:: 155 156 \sum\sqrt{v_{i}y_{i}} 157 """ 158 return np.sum(np.sqrt(v * y))
Fidelity similarity:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Fidelity similarity between v and y
Notes
$$\sum\sqrt{v_{i}y_{i}}$$
161def matusita_distance(v, y): 162 r"""Matusita distance: 163 164 Parameters 165 ---------- 166 v : array_like 167 Vector 1 168 y : array_like 169 Vector 2 170 171 Returns 172 ------- 173 float 174 Matusita distance between v and y 175 176 Notes 177 ----- 178 .. math:: 179 180 \sqrt{\sum(\sqrt{v_{i}}-\sqrt{y_{i}})^2} 181 """ 182 return np.sqrt(np.sum(np.power(np.sqrt(v) - np.sqrt(y), 2)))
Matusita distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Matusita distance between v and y
Notes
$$\sqrt{\sum(\sqrt{v_{i}}-\sqrt{y_{i}})^2}$$
185def squared_chord_distance(v, y): 186 r"""Squared-chord distance: 187 188 Parameters 189 ---------- 190 v : array_like 191 Vector 1 192 y : array_like 193 Vector 2 194 195 Returns 196 ------- 197 float 198 Squared-chord distance between v and y 199 200 Notes 201 ----- 202 .. math:: 203 204 \sum(\sqrt{v_{i}}-\sqrt{y_{i}})^2 205 """ 206 return np.sum(np.power(np.sqrt(v) - np.sqrt(y), 2))
Squared-chord distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Squared-chord distance between v and y
Notes
$$\sum(\sqrt{v_{i}}-\sqrt{y_{i}})^2$$
209def bhattacharya_1_distance(v, y): 210 r"""Bhattacharya 1 distance: 211 212 Parameters 213 ---------- 214 v : array_like 215 Vector 1 216 y : array_like 217 Vector 2 218 219 Returns 220 ------- 221 float 222 Bhattacharya 1 distance between v and y 223 224 Notes 225 ----- 226 .. math:: 227 228 (\arccos{(\sum\sqrt{v_{i}y_{i}})})^2 229 """ 230 s = np.sum(np.sqrt(v * y)) 231 # TODO:Fix this! 232 if s > 1: 233 if s > 1 + 1e-6: 234 warnings.warn( 235 "Error in calculating Bhattacharya 1 distance, got arccos {}".format(s) 236 ) 237 s = 1 238 return np.power(np.arccos(s), 2)
Bhattacharya 1 distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Bhattacharya 1 distance between v and y
Notes
$$(\arccos{(\sum\sqrt{v_{i}y_{i}})})^2$$
241def bhattacharya_2_distance(v, y): 242 r"""Bhattacharya 2 distance: 243 244 Parameters 245 ---------- 246 v : array_like 247 Vector 1 248 y : array_like 249 Vector 2 250 251 Returns 252 ------- 253 float 254 Bhattacharya 2 distance between v and y 255 Notes 256 ----- 257 .. math:: 258 259 -\ln{(\sum\sqrt{v_{i}y_{i}})} 260 """ 261 s = np.sum(np.sqrt(v * y)) 262 if s == 0: 263 return np.inf 264 else: 265 return -np.log(s)
Bhattacharya 2 distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Bhattacharya 2 distance between v and y
Notes
$$-\ln{(\sum\sqrt{v_{i}y_{i}})}$$
268def harmonic_mean_similarity(v, y): 269 r"""Harmonic mean similarity: 270 271 Parameters 272 ---------- 273 v : array_like 274 Vector 1 275 y : array_like 276 Vector 2 277 278 Returns 279 ------- 280 float 281 Harmonic mean similarity between v and y 282 283 Notes 284 ----- 285 .. math:: 286 287 #1-2\sum(\frac{v_{i}y_{i}}{v_{i}+y_{i}}) 288 2\sum(\frac{v_{i}y_{i}}{v_{i}+y_{i}}) 289 """ 290 # return 1 - 2 * np.sum(v * y / (v + y)) 291 return 2 * np.sum(v * y / (v + y))
Harmonic mean similarity:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Harmonic mean similarity between v and y
Notes
$$#1-2\sum(\frac{v_{i}y_{i}}{v_{i}+y_{i}}) 2\sum(\frac{v_{i}y_{i}}{v_{i}+y_{i}})$$
344def chernoff_distance(v, y): 345 r"""Chernoff distance: 346 347 Parameters 348 ---------- 349 v : array_like 350 Vector 1 351 y : array_like 352 Vector 2 353 354 Returns 355 ------- 356 float 357 Chernoff distance between v and y 358 359 Notes 360 ----- 361 .. math:: 362 363 \max{(-ln\sum(v_{i}^ty_{i}^{1-t})^{1-t})},\ t=0.1,\ 0\le\ t<1 364 """ 365 t = 0.1 366 return np.max(-np.log(np.sum(np.power(np.power(v, t) * np.power(y, 1 - t), 1 - t))))
Chernoff distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Chernoff distance between v and y
Notes
$$\max{(-ln\sum(v_{i}^ty_{i}^{1-t})^{1-t})},\ t=0.1,\ 0\le\ t<1$$
369def ruzicka_distance(v, y): 370 r"""Ruzicka distance: 371 372 Parameters 373 ---------- 374 v : array_like 375 Vector 1 376 y : array_like 377 Vector 2 378 379 Returns 380 ------- 381 float 382 Ruzicka distance between v and y 383 384 Notes 385 ----- 386 .. math:: 387 388 \frac{\sum{|v_{i}-y_{i}|}}{\sum{\max(v_{i},y_{i})}} 389 """ 390 dist = np.sum(np.abs(v - y)) / np.sum(np.maximum(v, y)) 391 return dist
Ruzicka distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Ruzicka distance between v and y
Notes
$$\frac{\sum{|v_{i}-y_{i}|}}{\sum{\max(v_{i},y_{i})}}$$
394def roberts_distance(v, y): 395 r"""Roberts distance: 396 397 Parameters 398 ---------- 399 v : array_like 400 Vector 1 401 y : array_like 402 Vector 2 403 404 Returns 405 ------- 406 float 407 Roberts distance between v and y 408 409 Notes 410 ----- 411 .. math:: 412 413 1-\sum\frac{(v_{i}+y_{i})\frac{\min{(v_{i},y_{i})}}{\max{(v_{i},y_{i})}}}{\sum(v_{i}+y_{i})} 414 """ 415 return 1 - np.sum((v + y) * np.minimum(v, y) / np.maximum(v, y) / np.sum(v + y))
Roberts distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Roberts distance between v and y
Notes
$$1-\sum\frac{(v_{i}+y_{i})\frac{\min{(v_{i},y_{i})}}{\max{(v_{i},y_{i})}}}{\sum(v_{i}+y_{i})}$$
418def intersection_distance(v, y): 419 r"""Intersection distance: 420 421 Parameters 422 ---------- 423 v : array_like 424 Vector 1 425 y : array_like 426 Vector 2 427 428 Returns 429 ------- 430 float 431 Intersection distance between v and y 432 433 Notes 434 ----- 435 .. math:: 436 437 1-\frac{\sum\min{(v_{i},y_{i})}}{\min(\sum{v_{i},\sum{y_{i})}}} 438 """ 439 return 1 - np.sum(np.minimum(v, y)) / min(np.sum(v), np.sum(y))
Intersection distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Intersection distance between v and y
Notes
$$1-\frac{\sum\min{(v_{i},y_{i})}}{\min(\sum{v_{i},\sum{y_{i})}}}$$
442def motyka_distance(v, y): 443 r"""Motyka distance: 444 445 Parameters 446 ---------- 447 v : array_like 448 Vector 1 449 y : array_like 450 Vector 2 451 452 Returns 453 ------- 454 float 455 Motyka distance between v and y 456 Notes 457 ----- 458 .. math:: 459 460 -\frac{\sum\min{(y_{i},v_{i})}}{\sum(y_{i}+v_{i})} 461 """ 462 dist = np.sum(np.minimum(v, y)) / np.sum(v + y) 463 return dist
Motyka distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Motyka distance between v and y
Notes
$$-\frac{\sum\min{(y_{i},v_{i})}}{\sum(y_{i}+v_{i})}$$
466def canberra_distance(v, y): 467 r"""Canberra distance: 468 469 Parameters 470 ---------- 471 v : array_like 472 Vector 1 473 y : array_like 474 Vector 2 475 476 Returns 477 ------- 478 float 479 Canberra distance between v and y 480 481 Notes 482 ----- 483 .. math:: 484 485 #\sum\frac{|v_{i}-y_{i}|}{|v_{i}|+|y_{i}|} 486 \sum_{i}\frac{|y_{i} - v_{i}|}{y_{i} + v_{i}} 487 """ 488 # return np.sum(np.abs(v - y) / (np.abs(v) + np.abs(y))) 489 return np.sum(np.abs(y - v) / (y + v))
Canberra distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Canberra distance between v and y
Notes
$$#\sum\frac{|v_{i}-y_{i}|}{|v_{i}|+|y_{i}|} \sum_{i}\frac{|y_{i} - v_{i}|}{y_{i} + v_{i}}$$
492def canberra_metric(v, y): 493 r"""Canberra Metric 494 495 Parameters 496 ---------- 497 v : array_like 498 Vector 1 499 y : array_like 500 Vector 2 501 502 Returns 503 ------- 504 float 505 Canberra metric between v and y 506 Notes 507 ----- 508 .. math:: 509 510 \frac{1}{\sum_{i}I(v_{i}\neq 0)}\sum_{i}\frac{|y_{i}-v_{i}|}{(y_{i}+v_{i})} 511 """ 512 513 return (1 / np.sum(v > 0)) * np.sum(np.abs(y - v) / (y + v))
Canberra Metric
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Canberra metric between v and y
Notes
$$\frac{1}{\sum_{i}I(v_{i}\neq 0)}\sum_{i}\frac{|y_{i}-v_{i}|}{(y_{i}+v_{i})}$$
516def kulczynski_1_distance(v, y): 517 r"""Kulczynski 1 distance: 518 519 Parameters 520 ---------- 521 v : array_like 522 Vector 1 523 y : array_like 524 Vector 2 525 526 Returns 527 ------- 528 float 529 Kulczynski 1 distance between v and y 530 531 Notes 532 ----- 533 .. math:: 534 535 \frac{\sum{|v_i}-y_i|}{\sum m\ i\ n\ (v_i,y_i)} 536 """ 537 return np.sum(np.abs(y - v)) / np.sum(np.minimum(y, v))
Kulczynski 1 distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Kulczynski 1 distance between v and y
Notes
$$\frac{\sum{|v_i}-y_i|}{\sum m\ i\ n\ (v_i,y_i)}$$
540def baroni_urbani_buser_distance(v, y): 541 r"""Baroni-Urbani-Buser distance: 542 543 Parameters 544 ---------- 545 v : array_like 546 Vector 1 547 y : array_like 548 Vector 2 549 550 Returns 551 ------- 552 float 553 Baroni-Urbani-Buser distance between v and y 554 555 Notes 556 ----- 557 .. math:: 558 559 1-\frac{\sum\min{(v_i,y_i)}+\sqrt{\sum\min{(v_i,y_i)}\sum(\max{(v)}-\max{(v_i,y_i)})}}{\sum{\max{(v_i,y_i)}+\sqrt{\sum{\min{(v_i,y_i)}\sum(\max{(v)}-\max{(v_i,y_i)})}}}} 560 """ 561 if np.max(v) < np.max(y): 562 v, y = y, v 563 d1 = np.sqrt(np.sum(np.minimum(v, y) * np.sum(max(v) - np.maximum(v, y)))) 564 return 1 - (np.sum(np.minimum(v, y)) + d1) / (np.sum(np.maximum(v, y)) + d1)
Baroni-Urbani-Buser distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Baroni-Urbani-Buser distance between v and y
Notes
$$1-\frac{\sum\min{(v_i,y_i)}+\sqrt{\sum\min{(v_i,y_i)}\sum(\max{(v)}-\max{(v_i,y_i)})}}{\sum{\max{(v_i,y_i)}+\sqrt{\sum{\min{(v_i,y_i)}\sum(\max{(v)}-\max{(v_i,y_i)})}}}}$$
567def penrose_size_distance(v, y): 568 r"""Penrose size distance: 569 570 Parameters 571 ---------- 572 v : array_like 573 Vector 1 574 y : array_like 575 Vector 2 576 577 Returns 578 ------- 579 float 580 Penrose size distance between v and y 581 582 Notes 583 ----- 584 .. math:: 585 586 \sqrt N\sum{|y_i-v_i|} 587 """ 588 n = np.sum(v > 0) 589 return np.sqrt(n) * np.sum(np.abs(y - v))
Penrose size distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Penrose size distance between v and y
Notes
$$\sqrt N\sum{|y_i-v_i|}$$
592def mean_character_distance(v, y): 593 r""" 594 Mean character distance: 595 596 Parameters 597 ---------- 598 v : array_like 599 Vector 1 600 y : array_like 601 Vector 2 602 603 Returns 604 ------- 605 float 606 Mean character distance between v and y 607 608 Notes 609 ----- 610 .. math:: 611 612 \frac{1}{N}\sum{|y_i-v_i|} 613 """ 614 n = np.sum(v > 0) 615 return 1 / n * np.sum(np.abs(y - v))
Mean character distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Mean character distance between v and y
Notes
$$\frac{1}{N}\sum{|y_i-v_i|}$$
618def lorentzian_distance(v, y): 619 r""" 620 Lorentzian distance: 621 622 Parameters 623 ---------- 624 v : array_like 625 Vector 1 626 y : array_like 627 Vector 2 628 629 Returns 630 ------- 631 float 632 Lorentzian distance between v and y 633 634 Notes 635 ----- 636 .. math:: 637 638 \sum{\ln(1+|v_i-y_i|)} 639 """ 640 return np.sum(np.log(1 + np.abs(y - v)))
Lorentzian distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Lorentzian distance between v and y
Notes
$$\sum{\ln(1+|v_i-y_i|)}$$
643def penrose_shape_distance(v, y): 644 r""" 645 Penrose shape distance: 646 647 Parameters 648 ---------- 649 v : array_like 650 Vector 1 651 y : array_like 652 Vector 2 653 654 Returns 655 ------- 656 float 657 Penrose shape distance between v and y 658 Notes 659 ----- 660 .. math:: 661 662 \sqrt{\sum((v_i-\bar{v})-(y_i-\bar{y}))^2} 663 """ 664 v_avg = np.mean(v) 665 y_avg = np.mean(y) 666 return np.sqrt(np.sum(np.power((y - y_avg) - (v - v_avg), 2)))
Penrose shape distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Penrose shape distance between v and y
Notes
$$\sqrt{\sum((v_i-\bar{v})-(y_i-\bar{y}))^2}$$
669def clark_distance(v, y): 670 r""" 671 Clark distance: 672 673 Parameters 674 ---------- 675 v : array_like 676 Vector 1 677 y : array_like 678 Vector 2 679 680 Returns 681 ------- 682 float 683 Clark distance between v and y 684 685 Notes 686 ----- 687 .. math:: 688 689 #(\frac{1}{N}\sum(\frac{v_i-y_i}{|v_i|+|y_i|})^2)^\frac{1}{2} 690 \sqrt{\sum(\frac{|v_i-y_i|}{v_i+y_i})^2} 691 """ 692 # n = np.sum(v > 0) 693 # return np.sqrt(1 / n * np.sum(np.power((v - y) / (np.abs(v) + np.abs(y)), 2))) 694 return np.sqrt(np.sum(np.power(np.abs(y - v) / (y + v), 2)))
Clark distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Clark distance between v and y
Notes
$$#(\frac{1}{N}\sum(\frac{v_i-y_i}{|v_i|+|y_i|})^2)^\frac{1}{2} \sqrt{\sum(\frac{|v_i-y_i|}{v_i+y_i})^2}$$
697def hellinger_distance(v, y): 698 r""" 699 Hellinger distance: 700 701 Parameters 702 ---------- 703 v : array_like 704 Vector 1 705 y : array_like 706 Vector 2 707 708 Returns 709 ------- 710 float 711 Hellinger distance between v and y 712 713 Notes 714 ----- 715 .. math:: 716 717 #\sqrt{2\sum(\sqrt{\frac{v_i}{\bar{v}}}-\sqrt{\frac{y_i}{\bar{y}}})^2} 718 \sqrt{2\sum(\sqrt{v_i}-\sqrt{y_i})^2} 719 """ 720 # v_avg = np.mean(v) 721 # y_avg = np.mean(y) 722 # return np.sqrt(2 * np.sum(np.power(np.sqrt(v / v_avg) - np.sqrt(y / y_avg), 2))) 723 return np.sqrt(2 * np.sum(np.power(np.sqrt(y) - np.sqrt(v), 2)))
Hellinger distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Hellinger distance between v and y
Notes
$$#\sqrt{2\sum(\sqrt{\frac{v_i}{\bar{v}}}-\sqrt{\frac{y_i}{\bar{y}}})^2} \sqrt{2\sum(\sqrt{v_i}-\sqrt{y_i})^2}$$
726def whittaker_index_of_association_distance(v, y): 727 r""" 728 Whittaker index of association distance: 729 730 Parameters 731 ---------- 732 v : array_like 733 Vector 1 734 y : array_like 735 Vector 2 736 737 Returns 738 ------- 739 float 740 Whittaker index of association distance between v and y 741 742 Notes 743 ----- 744 .. math:: 745 746 \frac{1}{2}\sum|\frac{v_i}{\bar{v}}-\frac{y_i}{\bar{y}}| 747 """ 748 v_avg = np.mean(v) 749 y_avg = np.mean(y) 750 return 1 / 2 * np.sum(np.abs(v / v_avg - y / y_avg))
Whittaker index of association distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Whittaker index of association distance between v and y
Notes
$$\frac{1}{2}\sum|\frac{v_i}{\bar{v}}-\frac{y_i}{\bar{y}}|$$
769def similarity_index_distance(v, y): 770 r""" 771 Similarity Index Distance: 772 773 Parameters 774 ---------- 775 v : array_like 776 Vector 1 777 y : array_like 778 Vector 2 779 780 Returns 781 ------- 782 float 783 Similarity Index Distance between v and y 784 785 Notes 786 ----- 787 .. math:: 788 789 \sqrt{\frac{\sum\{\frac{v_i-y_i}{y_i}\}^2}{N}} 790 """ 791 n = np.sum(v > 0) 792 return np.sqrt(1 / n * np.sum(np.power((v - y) / y, 2)))
Similarity Index Distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Similarity Index Distance between v and y
Notes
$$\sqrt{\frac{\sum{\frac{v_i-y_i}{y_i}}^2}{N}}$$
795def improved_similarity_distance(v, y): 796 r""" 797 Improved Similarity Index: 798 799 Parameters 800 ---------- 801 v : array_like 802 Vector 1 803 y : array_like 804 Vector 2 805 806 Returns 807 ------- 808 float 809 Improved Similarity Index between v and y 810 811 Notes 812 ----- 813 .. math:: 814 815 \sqrt{\frac{1}{N}\sum\{\frac{y_i-v_i}{y_i+v_i}\}^2} 816 """ 817 n = np.sum(v > 0) 818 return np.sqrt(1 / n * np.sum(np.power((y - v) / (y + v), 2)))
Improved Similarity Index:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Improved Similarity Index between v and y
Notes
$$\sqrt{\frac{1}{N}\sum{\frac{y_i-v_i}{y_i+v_i}}^2}$$
821def absolute_value_distance(v, y): 822 r""" 823 Absolute Value Distance: 824 825 Parameters 826 ---------- 827 v : array_like 828 Vector 1 829 y : array_like 830 Vector 2 831 832 Returns 833 ------- 834 float 835 Absolute Value Distance between v and y 836 837 Notes 838 ----- 839 .. math:: 840 841 \frac { \sum(|y_i-v_i|)}{\sum v_i} 842 843 """ 844 dist = np.sum(np.abs(y - v)) / np.sum(v) 845 return dist
Absolute Value Distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Absolute Value Distance between v and y
Notes
$$\frac { \sum(|y_i-v_i|)}{\sum v_i}$$
848def spectral_contrast_angle_distance(v, y): 849 r""" 850 Spectral Contrast Angle: 851 852 Parameters 853 ---------- 854 v : array_like 855 Vector 1 856 y : array_like 857 Vector 2 858 859 Returns 860 ------- 861 float 862 Spectral Contrast Angle between v and y 863 864 Notes 865 ----- 866 .. math:: 867 868 1 - \frac{\sum{y_iv_i}}{\sqrt{\sum y_i^2\sum v_i^2}} 869 \arccos(\frac{\sum_{P}y_{p}^* v_{p}^*}{\sqrt{\sum_{P}y_{p}^{*2} \sum_{P}v_{p}^{*2}}}) 870 """ 871 # return 1 - np.sum(y * v) / \ 872 # np.sqrt(np.sum(np.power(y, 2)) * np.sum(np.power(v, 2))) 873 874 return np.arccos( 875 np.sum(y * v) / (np.sqrt(np.sum(np.power(y, 2)) * np.sum(np.power(v, 2)))) 876 )
Spectral Contrast Angle:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Spectral Contrast Angle between v and y
Notes
$$1 - \frac{\sum{y_iv_i}}{\sqrt{\sum y_i^2\sum v_i^2}} \arccos(\frac{\sum_{P}y_{p}^* v_{p}^}{\sqrt{\sum_{P}y_{p}^{2} \sum_{P}v_{p}^{*2}}})$$
879def wave_hedges_distance(v, y): 880 r""" 881 Wave Hedges distance: 882 883 Parameters 884 ---------- 885 v : array_like 886 Vector 1 887 y : array_like 888 Vector 2 889 890 Returns 891 ------- 892 float 893 Wave Hedges distance between v and y 894 895 Notes 896 ----- 897 .. math:: 898 899 \sum\frac{|v_i-y_i|}{\max{(v_i,y_i)}} 900 """ 901 return np.sum(np.abs(v - y) / np.maximum(v, y))
Wave Hedges distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Wave Hedges distance between v and y
Notes
$$\sum\frac{|v_i-y_i|}{\max{(v_i,y_i)}}$$
904def dice_similarity(v, y): 905 r""" 906 Dice similarity: 907 908 Parameters 909 ---------- 910 v : array_like 911 Vector 1 912 y : array_like 913 Vector 2 914 915 Returns 916 ------- 917 float 918 Dice similarity between v and y 919 920 Notes 921 ----- 922 .. math:: 923 924 \frac{\sum(v_i-y_i)^2}{\sum v_i^2+\sum y_i^2} 925 \frac{2 * \sum_{i}v_{i}y_{i}}{\sum_{i}y_{i}^2 + \sum_{i}v_{i}^2} 926 """ 927 return 2 * np.sum(v * y) / (np.sum(np.power(v, 2)) + np.sum(np.power(y, 2)))
Dice similarity:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Dice similarity between v and y
Notes
$$\frac{\sum(v_i-y_i)^2}{\sum v_i^2+\sum y_i^2} \frac{2 * \sum_{i}v_{i}y_{i}}{\sum_{i}y_{i}^2 + \sum_{i}v_{i}^2}$$
930def inner_product_distance(v, y): 931 r""" 932 Inner Product distance: 933 934 Parameters 935 ---------- 936 v : array_like 937 Vector 1 938 y : array_like 939 Vector 2 940 941 Returns 942 ------- 943 float 944 Inner product distance between v and y 945 946 Notes 947 ----- 948 .. math:: 949 950 1-\sum{v_iy_i} 951 """ 952 return 1 - np.sum(v * y)
Inner Product distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Inner product distance between v and y
Notes
$$1-\sum{v_iy_i}$$
955def divergence_distance(v, y): 956 r""" 957 Divergence distance: 958 959 Parameters 960 ---------- 961 v : array_like 962 Vector 1 963 y : array_like 964 Vector 2 965 966 Returns 967 ------- 968 float 969 Divergence distance between v and y 970 971 Notes 972 ----- 973 .. math:: 974 975 2\sum\frac{(v_i-y_i)^2}{(v_i+y_i)^2} 976 """ 977 return 2 * np.sum((np.power(v - y, 2)) / np.power(v + y, 2))
Divergence distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Divergence distance between v and y
Notes
$$2\sum\frac{(v_i-y_i)^2}{(v_i+y_i)^2}$$
1006def jensen_difference_distance(v, y): 1007 r""" 1008 Jensen difference: 1009 1010 Parameters 1011 ---------- 1012 v : array_like 1013 Vector 1 1014 y : array_like 1015 Vector 2 1016 1017 Returns 1018 ------- 1019 float 1020 Jensen difference distance between v and y 1021 1022 Notes 1023 ----- 1024 .. math:: 1025 1026 \sum[\frac{1}{2}(v_i\ln{v_i}+y_i\ln{y_i})-(\frac{v_i+y_i}{2})\ln{(\frac{v_i+y_i}{2})}] 1027 """ 1028 y_v_avg = (y + v) / 2 1029 return np.sum(1 / 2 * (y * np.log(y) + v * np.log(v)) - y_v_avg * np.log(y_v_avg))
Jensen difference:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Jensen difference distance between v and y
Notes
$$\sum[\frac{1}{2}(v_i\ln{v_i}+y_i\ln{y_i})-(\frac{v_i+y_i}{2})\ln{(\frac{v_i+y_i}{2})}]$$
1032def kumar_johnson_distance(v, y): 1033 r""" 1034 Kumar-Johnson distance: 1035 1036 Parameters 1037 ---------- 1038 v : array_like 1039 Vector 1 1040 y : array_like 1041 Vector 2 1042 1043 Returns 1044 ------- 1045 float 1046 Kumar Johnson distance between v and y 1047 1048 Notes 1049 ----- 1050 .. math:: 1051 1052 \sum\frac{(v_i^2-y_i^2)^2}{2(v_iy_i)^\frac{3}{2}} 1053 """ 1054 return np.sum( 1055 np.power(np.power(v, 2) - np.power(y, 2), 2) / (2 * np.power(v * y, 3 / 2)) 1056 )
Kumar-Johnson distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Kumar Johnson distance between v and y
Notes
$$\sum\frac{(v_i^2-y_i^2)^2}{2(v_iy_i)^\frac{3}{2}}$$
1059def avg_l_distance(v, y): 1060 r""" 1061 Avg (L1, L∞) distance: 1062 1063 Parameters 1064 ---------- 1065 v : array_like 1066 Vector 1 1067 y : array_like 1068 Vector 2 1069 1070 Returns 1071 ------- 1072 float 1073 Average L distance between v and y 1074 1075 Notes 1076 ----- 1077 .. math:: 1078 1079 \frac{1}{2}(\sum|v_i-y_i|+\underset{i}{\max}{|v_i-y_i|}) 1080 """ 1081 return 1 / 2 * (np.sum(np.abs(v - y)) + max(np.abs(v - y)))
Avg (L1, L∞) distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Average L distance between v and y
Notes
$$\frac{1}{2}(\sum|v_i-y_i|+\underset{i}{\max}{|v_i-y_i|})$$
1084def vicis_wave_hadges_distance(v, y): 1085 r""" 1086 Vicis-Wave Hadges distance: 1087 1088 Parameters 1089 ---------- 1090 v : array_like 1091 Vector 1 1092 y : array_like 1093 Vector 2 1094 1095 Returns 1096 ------- 1097 float 1098 Vicis Wave Hadges distance between v and y 1099 1100 Notes 1101 ----- 1102 .. math:: 1103 1104 \sum\frac{|v_i-y_i|}{\min{(v_i,\ y_i)}} 1105 """ 1106 return np.sum(np.abs(v - y) / np.minimum(v, y))
Vicis-Wave Hadges distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Vicis Wave Hadges distance between v and y
Notes
$$\sum\frac{|v_i-y_i|}{\min{(v_i,\ y_i)}}$$
1109def vicis_symmetric_chi_squared_1_distance(v, y): 1110 r""" 1111 Vicis-Symmetric χ2 1 distance: 1112 1113 Parameters 1114 ---------- 1115 v : array_like 1116 Vector 1 1117 y : array_like 1118 Vector 2 1119 1120 Returns 1121 ------- 1122 float 1123 Vici Symmetric χ2 1 distance between v and y 1124 1125 Notes 1126 ----- 1127 .. math:: 1128 1129 \sum\frac{(v_i-y_i)^2}{\min{(v_i,y_i)^2}} 1130 """ 1131 return np.sum(np.power(v - y, 2) / np.power(np.minimum(v, y), 2))
Vicis-Symmetric χ2 1 distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Vici Symmetric χ2 1 distance between v and y
Notes
$$\sum\frac{(v_i-y_i)^2}{\min{(v_i,y_i)^2}}$$
1134def vicis_symmetric_chi_squared_2_distance(v, y): 1135 r""" 1136 Vicis-Symmetric χ2 2 distance: 1137 1138 Parameters 1139 ---------- 1140 v : array_like 1141 Vector 1 1142 y : array_like 1143 Vector 2 1144 1145 Returns 1146 ------- 1147 float 1148 Vicis Symmetric χ2 2 distance between v and y 1149 1150 Notes 1151 ----- 1152 1153 .. math:: 1154 1155 \sum\frac{(v_i-y_i)^2}{\min{(v_i,y_i)}} 1156 """ 1157 return np.sum(np.power(v - y, 2) / np.minimum(v, y))
Vicis-Symmetric χ2 2 distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Vicis Symmetric χ2 2 distance between v and y
Notes
$$\sum\frac{(v_i-y_i)^2}{\min{(v_i,y_i)}}$$
1160def vicis_symmetric_chi_squared_3_distance(v, y): 1161 r""" 1162 Vicis-Symmetric χ2 3 distance: 1163 1164 Parameters 1165 ---------- 1166 v : array_like 1167 Vector 1 1168 y : array_like 1169 Vector 2 1170 1171 Returns 1172 ------- 1173 float 1174 Vici Symmetric χ2 3 distance between v and y 1175 1176 Notes 1177 ----- 1178 1179 .. math:: 1180 1181 \sum\frac{(v_i-y_i)^2}{\max{(v_i,y_i)}} 1182 """ 1183 return np.sum(np.power(v - y, 2) / np.maximum(v, y))
Vicis-Symmetric χ2 3 distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Vici Symmetric χ2 3 distance between v and y
Notes
$$\sum\frac{(v_i-y_i)^2}{\max{(v_i,y_i)}}$$
1186def max_symmetric_chi_squared_distance(v, y): 1187 r""" 1188 Max-Symmetric χ2 distance: 1189 1190 Parameters 1191 ---------- 1192 v : array_like 1193 Vector 1 1194 y : array_like 1195 Vector 2 1196 1197 Returns 1198 ------- 1199 float 1200 Max-Symmetric χ2 distance between v and y 1201 1202 Notes 1203 ----- 1204 .. math:: 1205 1206 \max{(\sum\frac{(v_i-y_i)^2}{v_i},\sum\frac{(v_i-y_i)^2}{y_i})} 1207 """ 1208 return max(np.sum(np.power(v - y, 2) / v), np.sum(np.power(v - y, 2) / y))
Max-Symmetric χ2 distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Max-Symmetric χ2 distance between v and y
Notes
$$\max{(\sum\frac{(v_i-y_i)^2}{v_i},\sum\frac{(v_i-y_i)^2}{y_i})}$$
1211def min_symmetric_chi_squared_distance(v, y): 1212 r""" 1213 Min-Symmetric χ2 distance: 1214 1215 Parameters 1216 ---------- 1217 v : array_like 1218 Vector 1 1219 y : array_like 1220 Vector 2 1221 1222 Returns 1223 ------- 1224 float 1225 Min-Symmetric χ2 distance between v and y 1226 1227 Notes 1228 ----- 1229 .. math:: 1230 1231 \min{(\sum\frac{(v_i-y_i)^2}{v_i},\sum\frac{(v_i-y_i)^2}{y_i})} 1232 """ 1233 return min(np.sum(np.power(v - y, 2) / v), np.sum(np.power(v - y, 2) / y))
Min-Symmetric χ2 distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Min-Symmetric χ2 distance between v and y
Notes
$$\min{(\sum\frac{(v_i-y_i)^2}{v_i},\sum\frac{(v_i-y_i)^2}{y_i})}$$
1236def additive_sym_chi_sq(v, y): 1237 r""" 1238 Additive Symmetric χ2 distance: 1239 1240 Parameters 1241 ---------- 1242 v : array_like 1243 Vector 1 1244 y : array_like 1245 Vector 2 1246 1247 Returns 1248 ------- 1249 float 1250 Additive Symmetric χ2 distance between v and y 1251 1252 Notes 1253 ----- 1254 .. math:: 1255 1256 \sum_{i}\frac{(y_{i} - v_{i})^2(y_{i}+v_{i})}{y_{i}v_{i}} 1257 """ 1258 return np.sum((np.power(y - v, 2) * (y + v)) / (y * v))
Additive Symmetric χ2 distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Additive Symmetric χ2 distance between v and y
Notes
$$\sum_{i}\frac{(y_{i} - v_{i})^2(y_{i}+v_{i})}{y_{i}v_{i}}$$
1261def bhattacharya_distance(v, y): 1262 r""" 1263 Bhattacharya Distance: 1264 1265 Parameters 1266 ---------- 1267 v : array_like 1268 Vector 1 1269 y : array_like 1270 Vector 2 1271 1272 Returns 1273 ------- 1274 float 1275 Bhattcharya distance between v and y 1276 1277 Notes 1278 ----- 1279 .. math:: 1280 1281 -ln(\sum_{i}\sqrt{y_{i}v_{i}}) 1282 """ 1283 return -1 * np.log(np.sum(np.sqrt(y * v)))
Bhattacharya Distance:
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Bhattcharya distance between v and y
Notes
$$-ln(\sum_{i}\sqrt{y_{i}v_{i}})$$
1286def generalized_ochiai_index(v, y): 1287 r""" 1288 Generalized Ochiai Index 1289 1290 Parameters 1291 ---------- 1292 v : array_like 1293 Vector 1 1294 y : array_like 1295 Vector 2 1296 1297 Returns 1298 ------- 1299 float 1300 Generalized Ochiai Index between v and y 1301 1302 Notes 1303 ----- 1304 .. math:: 1305 1306 1 - \frac{\sum_{i}min(y_{i}, v_{i})}{\sqrt{\sum_{i}y_{i} \sum_{i}v_{i}}} 1307 """ 1308 1309 ind = np.sum(np.minimum(y, v)) / np.sqrt(np.sum(y) * np.sum(v)) 1310 return 1 - ind
Generalized Ochiai Index
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Generalized Ochiai Index between v and y
Notes
$$1 - \frac{\sum_{i}min(y_{i}, v_{i})}{\sqrt{\sum_{i}y_{i} \sum_{i}v_{i}}}$$
1313def gower_distance(v, y): 1314 r""" 1315 Gower Distance 1316 1317 Parameters 1318 ---------- 1319 v : array_like 1320 Vector 1 1321 y : array_like 1322 Vector 2 1323 1324 Returns 1325 ------- 1326 float 1327 Gower distance between v and y 1328 1329 Notes 1330 ----- 1331 1332 .. math:: 1333 1334 \frac{1}{N}\sum_{i}|y_{i} - v_{i}| 1335 """ 1336 1337 n = np.sum(y > 0) 1338 return (1 / n) * np.sum(np.abs(y - v))
Gower Distance
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Gower distance between v and y
Notes
$$\frac{1}{N}\sum_{i}|y_{i} - v_{i}|$$
1341def impr_sqrt_cosine_sim(v, y): 1342 r""" 1343 Improved Square Root Cosine Similarity 1344 1345 Parameters 1346 ---------- 1347 v : array_like 1348 Vector 1 1349 y : array_like 1350 Vector 2 1351 1352 Returns 1353 ------- 1354 float 1355 Improved Square Root Cosine Similarity between v and y 1356 1357 Notes 1358 ----- 1359 .. math:: 1360 1361 \frac{\sum_{i}\sqrt{y_{i}v_{i}}}{\sum_{i}\sqrt{y_{i}}\sum_{i}\sqrt{v_{i}}} 1362 """ 1363 1364 return np.sum(np.sqrt(y * v)) / (np.sum(np.sqrt(y)) * np.sum(np.sqrt(v)))
Improved Square Root Cosine Similarity
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Improved Square Root Cosine Similarity between v and y
Notes
$$\frac{\sum_{i}\sqrt{y_{i}v_{i}}}{\sum_{i}\sqrt{y_{i}}\sum_{i}\sqrt{v_{i}}}$$
1367def intersection_sim(v, y): 1368 r""" 1369 Intersection Similarity 1370 1371 Parameters 1372 ---------- 1373 v : array_like 1374 Vector 1 1375 y : array_like 1376 Vector 2 1377 1378 Returns 1379 ------- 1380 float 1381 Intersection Similarity between v and y 1382 1383 Notes 1384 ----- 1385 .. math:: 1386 1387 \sum_{i}min(y_{i}, v_{i}) 1388 """ 1389 1390 return np.sum(np.minimum(y, v))
Intersection Similarity
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Intersection Similarity between v and y
Notes
$$\sum_{i}min(y_{i}, v_{i})$$
1393def j_divergence(v, y): 1394 r""" 1395 J Divergence 1396 1397 Parameters 1398 ---------- 1399 v : array_like 1400 Vector 1 1401 y : array_like 1402 Vector 2 1403 1404 Returns 1405 ------- 1406 float 1407 J Divergence between v and y 1408 1409 Notes 1410 ----- 1411 .. math:: 1412 1413 \sum_{i}(y_{i} - v_{i}) ln(\frac{y_{i}}{v_{i}}) 1414 """ 1415 1416 return np.sum((v - y) * np.log(v / y))
J Divergence
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: J Divergence between v and y
Notes
$$\sum_{i}(y_{i} - v_{i}) ln(\frac{y_{i}}{v_{i}})$$
1419def jensen_shannon_index(v, y): 1420 r""" 1421 Jensen-Shannon Index 1422 1423 Parameters 1424 ---------- 1425 v : array_like 1426 Vector 1 1427 y : array_like 1428 Vector 2 1429 1430 Returns 1431 ------- 1432 float 1433 Jensen Shannon Index between v and y 1434 1435 Notes 1436 ----- 1437 .. math:: 1438 1439 \frac{1}{2}[\sum_{i}y_{i}ln(\frac{2y_{i}}{y_{i} + v_{i}}) + \sum_{i}v_{i}ln(\frac{2v_{i}}{y_{i}+v_{i}})] 1440 """ 1441 1442 return (1 / 2) * ( 1443 np.sum(y * np.log(2 * y / (y + v))) + np.sum(v * np.log(2 * v / (y + v))) 1444 )
Jensen-Shannon Index
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Jensen Shannon Index between v and y
Notes
$$\frac{1}{2}[\sum_{i}y_{i}ln(\frac{2y_{i}}{y_{i} + v_{i}}) + \sum_{i}v_{i}ln(\frac{2v_{i}}{y_{i}+v_{i}})]$$
1447def k_divergence(v, y): 1448 r""" 1449 K-Divergence 1450 1451 Parameters 1452 ---------- 1453 v : array_like 1454 Vector 1 1455 y : array_like 1456 Vector 2 1457 1458 Returns 1459 ------- 1460 float 1461 K-Divergence between v and y 1462 1463 Notes 1464 ----- 1465 .. math:: 1466 1467 \sum_{i}y_{i}ln(\frac{2y_{i}}{y_{i} + v_{i}}) 1468 """ 1469 1470 return np.sum(v * np.log((2 * v) / (y + v)))
K-Divergence
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: K-Divergence between v and y
Notes
$$\sum_{i}y_{i}ln(\frac{2y_{i}}{y_{i} + v_{i}})$$
1473def topsoe_distance(v, y): 1474 r"""Topsoe distance 1475 1476 Parameters 1477 ---------- 1478 v : array_like 1479 Vector 1 1480 y : array_like 1481 Vector 2 1482 1483 Returns 1484 ------- 1485 float 1486 Topsoe distance between v and y 1487 1488 Notes 1489 ----- 1490 """ 1491 # [Chae] commented out the previous one; please review 1492 # v[v==0] = 1 #added by amt 1493 # y[y==0] = 1 #added by amt 1494 return np.sum((y * np.log((2 * y) / (y + v))) + (v * np.log((2 * v) / (y + v))))
Topsoe distance
Parameters
- v (array_like): Vector 1
- y (array_like): Vector 2
Returns
- float: Topsoe distance between v and y
- Notes
- -----
1497def probabilistic_symmetric_chi_squared_distance(v, y): 1498 r"""Fixed 1499 "I commented out the previous one; please review" 1500 """ 1501 return 2 * np.sum(np.sum(np.power(y - v, 2) / (y + v)))
Fixed "I commented out the previous one; please review"
1504def VW6(v, y): 1505 r""" 1506 "appears to be the same as max_symmetric_chi_squared_distance" 1507 """ 1508 return min(np.sum(np.power(y - v, 2) / y), np.sum(np.power(y - v, 2) / v))
"appears to be the same as max_symmetric_chi_squared_distance"
1511def VW5(v, y): 1512 r""" 1513 "appears to be the same as max_symmetric_chi_squared_distance" 1514 """ 1515 return max(np.sum(np.power(y - v, 2) / y), np.sum(np.power(y - v, 2) / v))
"appears to be the same as max_symmetric_chi_squared_distance"
1518def VW4(v, y): 1519 r""" 1520 "Tecnically the Symmetric chi2 eq63" 1521 """ 1522 return np.sum(np.power(y - v, 2) / np.maximum(y, v))
"Tecnically the Symmetric chi2 eq63"
1525def VW3(v, y): 1526 r""" 1527 "New" 1528 """ 1529 return np.sum(np.power(y - v, 2) / np.minimum(y, v))
"New"
1532def VW2(v, y): 1533 r""" 1534 "New" 1535 """ 1536 return np.sum(np.power(y - v, 2) / np.power(np.minimum(y, v), 2))
"New"
1539def VW1(v, y): 1540 r""" 1541 "New" 1542 """ 1543 return np.sum(np.abs(y - v) / np.minimum(y, v))
"New"
1546def taneja_divergence(v, y): 1547 r""" 1548 "New" 1549 """ 1550 return np.sum(((y + v) / 2) * np.log((y + v) / (2 * np.sqrt(y * v))))
"New"
1553def symmetric_chi_squared_distance(v, y): 1554 r""" 1555 "New" 1556 """ 1557 return np.sum(np.power(y - v, 2) / (y * v))
"New"
1560def squared_chi_squared_distance(v, y): 1561 r""" 1562 "New" 1563 """ 1564 return np.sum(np.power(y - v, 2) / (y + v))
"New"
1567def square_root_cosine_correlation(v, y): 1568 r""" 1569 "New" 1570 """ 1571 return np.sum(np.sqrt(y * v)) / (np.sum(y) * np.sum(v))
"New"
1574def sorensen_distance(v, y): 1575 r""" 1576 "New" 1577 """ 1578 return np.sum(np.abs(y - v)) / (np.sum(y + v))
"New"
1581def Pearson_chi_squared_distance(v, y): 1582 r""" 1583 "New" 1584 """ 1585 return np.sum(np.power(y - v, 2) / v)
"New"
1588def Neyman_chi_squared_distance(v, y): 1589 r""" 1590 "New" 1591 """ 1592 return np.sum(np.power(y - v, 2) / y)
"New"
1595def Minokowski_3(v, y): 1596 r""" 1597 "New" 1598 """ 1599 return np.power(np.sum(np.power(np.abs(y - v), 3)), 1 / 3)
"New"
1602def Minokowski_4(v, y): 1603 r""" 1604 "New" 1605 """ 1606 return np.power(np.sum(np.power(np.abs(y - v), 4)), 1 / 4)
"New"
1609def kumarjohnson_divergence(v, y): 1610 r""" 1611 "New" 1612 """ 1613 return np.sum( 1614 np.power(np.power(y, 2) + np.power(v, 2), 2) / (2 * np.power(y * v, 3 / 2)) 1615 )
"New"
1618def kumarhassebrook_similarity(v, y): 1619 r""" 1620 "New" 1621 """ 1622 return np.sum(y * v) / ( 1623 np.sum(np.power(y, 2)) + np.sum(np.power(v, 2)) - np.sum(y * v) 1624 )
"New"
1627def kullbackleibler_divergence(v, y): 1628 r""" 1629 "New" 1630 """ 1631 return np.sum(v * np.log(v / y))
"New"
1634def soergel_distance(v, y): 1635 r""" 1636 "New" 1637 """ 1638 return np.sum(np.abs(y - v)) / np.sum(np.maximum(y, v))
"New"