Вычисление Mahalanobis Расстояние компонент мудрый - PullRequest
0 голосов
/ 07 марта 2019

У меня 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 составляющих расстояния?

В качестве альтернативы, какой самый быстрый способ вычислить расстояние Махаланобиса?

1 Ответ

1 голос
/ 07 марта 2019

Прежде всего, чтобы было легче понять, это формула расстояния Махаланобиса:

Mahalanobis

Итак, чтобы вычислить расстояние махаланобиса для каждого элемента в соответствии с его классом, мы можем сделать:

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]]))]
...