One dimensional Mahalanobis Distance in Python

后端 未结 2 1102
梦毁少年i
梦毁少年i 2021-02-10 11:09

I\'ve been trying to validate my code to calculate Mahalanobis distance written in Python (and double check to compare the res

相关标签:
2条回答
  • 2021-02-10 11:31

    One-dimensional Mahalanobis distance is really easy to calculate manually:

    import numpy as np
    s = np.array([[20], [123], [113], [103], [123]])
    std = s.std()
    print np.abs(s[0] - s[1]) / std
    

    (reducing the formula to the one-dimensional case).

    But the problem with scipy.spatial.distance is that for some reason np.cov returns a scalar, i.e. a zero-dimensional array, when given a set of 1d variables. You want to pass in a 2d array:

    >>> covar = np.cov(s, rowvar=0)
    
    >>> covar.shape
    ()
    
    >>> invcovar = np.linalg.inv(covar.reshape((1,1)))
    
    >>> invcovar.shape
    (1, 1)
    
    >>> mahalanobis(s[0], s[1], invcovar)
    2.3674720531046645
    
    0 讨论(0)
  • 2021-02-10 11:42

    Covariance needs 2 arrays to compare. In both np.cov() and Opencv CalcCovarMatrix, it expects the two arrays to be stacked on top of each other (Use vstack). You can also have the 2 arrays to be side by side if you change the Rowvar to false in numpy or use COVAR_COL in opencv. If your arrays are multidimentional, just flatten() them first.

    So if I want to compare two 24x24 images, I flatten them both into 2 1x1024 images, then stack the two to get a 2x1024, and that is the first argument of np.cov().

    You should then get a large square matrix, where it shows the results of comparing each element in array1 with each element in array2. In my example it will be 1024x1024. THAT is what you pass into your invert function.

    0 讨论(0)
提交回复
热议问题