【问题标题】:Computing Mahalanobis Distance Component Wise明智地计算马氏距离分量
【发布时间】:2019-07-28 18:58:01
【问题描述】:

我有 60000 个 784 维的向量。该数据有 10 个类别。

我必须评估一个取出一维并再次计算距离度量的函数。这个函数正在计算每个向量到它的类的平均值的距离。在代码中:

def objectiveFunc(self, X, y, indices):

    subX = np.array([X[:,i] for i in indices]).T
    d = np.zeros((10,1))
    for n in range(10):
        C = subX[np.where(y == n)]
        u = np.mean(C, axis = 0)
        Sinv = pinv(covariance(C))
        d[n] = np.mean(np.apply_along_axis(mahalanobis, axis = 1, arr=C, v=u, VI=Sinv))

其中索引在每次迭代期间被删除一个索引。

您可以想象,在计算马氏距离的过程中,我计算了很多单独的分量。有没有办法存储所有 784 个组件的距离?

或者,计算马氏距离的最快方法是什么?

【问题讨论】:

    标签: python performance distance


    【解决方案1】:

    首先,为了更容易理解,这是马氏距离公式:

    因此,要根据每个元素的类计算每个元素的马氏距离,我们可以这样做:

    X_train=X_train.reshape(-1,784)
    
    def mahalanobis(element,classe):
        part=np.where(y_train==classe)[0]
        ave=np.mean(X_train[part])
        distance_example=np.sqrt(((np.mean(X_train[part[[element]]])-ave)**2)/np.var(X_train[part]))
        return distance_example
    
    mahalanobis(20,2)    
    # Out[91]: 0.13947337027828757
    

    然后您可以创建一个for 语句来计算所有距离。比如0类:

    [mahalanobis(i,0) for i in range(0,len(X_train[np.where(y_train==0)[0]]))]
    

    【讨论】:

    • 谢谢。那不是我以前见过的形式。您能否提供一个链接,以便我进一步阅读?其次,Sigma是方差的平方?
    • Sigma 是标准偏差。 Sigma 平方是方差。作为参考,请阅读 Hair: Multivariate Data Analysis 中的书。它更像是一种统计方法,而不是真正实用的机器学习。
    • 我在网上找到了这本书的PDF。我找不到上面的表格;我搜索了 mahalanobis 这个词。
    • 您是如何得出不存在协方差的假设的?
    • Y 是否存在协方差?它是分类的,有 10 个类,你不能像协方差一样用分类变量计算 Y 均值。例如,考虑使用 K 最近邻的 MNIST 解决方案。它与您的方法类似,但它将使用X 的质心而不是马氏平均值。
    猜你喜欢
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 2015-06-25
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    相关资源
    最近更新 更多