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))
def entropy_distance(v, y):
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
def weighted_entropy_distance(v, 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
def chebyshev_distance(v, 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}|)}$$

def squared_euclidean_distance(v, y):
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$$

def fidelity_similarity(v, y):
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}}$$

def matusita_distance(v, y):
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}$$

def squared_chord_distance(v, y):
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$$

def bhattacharya_1_distance(v, y):
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$$

def bhattacharya_2_distance(v, y):
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}})}$$

def harmonic_mean_similarity(v, y):
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}})$$

def chernoff_distance(v, y):
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$$

def ruzicka_distance(v, y):
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})}}$$

def roberts_distance(v, y):
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})}$$

def intersection_distance(v, y):
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})}}}$$

def motyka_distance(v, y):
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})}$$

def canberra_distance(v, y):
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}}$$

def canberra_metric(v, y):
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})}$$

def kulczynski_1_distance(v, y):
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)}$$

def baroni_urbani_buser_distance(v, y):
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)})}}}}$$

def penrose_size_distance(v, y):
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|}$$

def mean_character_distance(v, y):
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|}$$

def lorentzian_distance(v, y):
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|)}$$

def penrose_shape_distance(v, y):
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}$$

def clark_distance(v, y):
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}$$

def hellinger_distance(v, y):
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}$$

def whittaker_index_of_association_distance(v, y):
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}}|$$

def similarity_index_distance(v, 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}}$$

def improved_similarity_distance(v, y):
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}$$

def absolute_value_distance(v, y):
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}$$

def spectral_contrast_angle_distance(v, y):
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}}})$$

def wave_hedges_distance(v, y):
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)}}$$

def dice_similarity(v, y):
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}$$

def inner_product_distance(v, y):
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}$$

def divergence_distance(v, y):
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}$$

def jensen_difference_distance(v, y):
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})}]$$

def kumar_johnson_distance(v, y):
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}}$$

def avg_l_distance(v, y):
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|})$$

def vicis_wave_hadges_distance(v, y):
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)}}$$

def vicis_symmetric_chi_squared_1_distance(v, y):
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}}$$

def vicis_symmetric_chi_squared_2_distance(v, y):
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)}}$$

def vicis_symmetric_chi_squared_3_distance(v, y):
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)}}$$

def max_symmetric_chi_squared_distance(v, y):
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})}$$

def min_symmetric_chi_squared_distance(v, y):
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})}$$

def additive_sym_chi_sq(v, y):
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}}$$

def bhattacharya_distance(v, y):
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}})$$

def generalized_ochiai_index(v, y):
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}}}$$

def gower_distance(v, y):
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}|$$

def impr_sqrt_cosine_sim(v, y):
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}}}$$

def intersection_sim(v, y):
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})$$

def j_divergence(v, y):
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}})$$

def jensen_shannon_index(v, y):
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}})]$$

def k_divergence(v, y):
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}})$$

def topsoe_distance(v, y):
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
  • -----
def probabilistic_symmetric_chi_squared_distance(v, y):
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"

def VW6(v, y):
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"

def VW5(v, y):
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"

def VW4(v, y):
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"

def VW3(v, y):
1525def VW3(v, y):
1526    r"""
1527    "New"
1528    """
1529    return np.sum(np.power(y - v, 2) / np.minimum(y, v))

"New"

def VW2(v, y):
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"

def VW1(v, y):
1539def VW1(v, y):
1540    r"""
1541    "New"
1542    """
1543    return np.sum(np.abs(y - v) / np.minimum(y, v))

"New"

def taneja_divergence(v, y):
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"

def symmetric_chi_squared_distance(v, y):
1553def symmetric_chi_squared_distance(v, y):
1554    r"""
1555    "New"
1556    """
1557    return np.sum(np.power(y - v, 2) / (y * v))

"New"

def squared_chi_squared_distance(v, y):
1560def squared_chi_squared_distance(v, y):
1561    r"""
1562    "New"
1563    """
1564    return np.sum(np.power(y - v, 2) / (y + v))

"New"

def square_root_cosine_correlation(v, y):
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"

def sorensen_distance(v, y):
1574def sorensen_distance(v, y):
1575    r"""
1576    "New"
1577    """
1578    return np.sum(np.abs(y - v)) / (np.sum(y + v))

"New"

def Pearson_chi_squared_distance(v, y):
1581def Pearson_chi_squared_distance(v, y):
1582    r"""
1583    "New"
1584    """
1585    return np.sum(np.power(y - v, 2) / v)

"New"

def Neyman_chi_squared_distance(v, y):
1588def Neyman_chi_squared_distance(v, y):
1589    r"""
1590    "New"
1591    """
1592    return np.sum(np.power(y - v, 2) / y)

"New"

def Minokowski_3(v, y):
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"

def Minokowski_4(v, y):
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"

def kumarjohnson_divergence(v, y):
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"

def kumarhassebrook_similarity(v, y):
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"

def kullbackleibler_divergence(v, y):
1627def kullbackleibler_divergence(v, y):
1628    r"""
1629    "New"
1630    """
1631    return np.sum(v * np.log(v / y))

"New"

def soergel_distance(v, y):
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"