Есть ли более быстрый способ вычислить расстояние между элементами в одной матрице с помощью гауссовой функции? - PullRequest
0 голосов
/ 02 марта 2020

Исходя из матрицы М формы 7000 x 2, я вычисляю следующее количество: enter image description here

Я делаю это следующим образом (сигма дисперсии произвольна):

W = np.zeros((M.shape[0], M.shape[0]))
elements_sum_by_i = np.zeros((M.shape[0]))
for i in range (0,M.shape[0]):
    #normalization
    for k in range (0, M.shape[0]):
        elements_sum_by_i[k] = math.exp(-(np.linalg.norm(M[i,:] - M[k,:])**2)/(2*sigma**2))
    sum_by_i = sum(elements_sum_by_i)
    #calculation
    for j in range (0,M.shape[0]):
        W[i,j] = (math.exp(-(np.linalg.norm(M[i,:] - M[j,:]))**2/(2*sigma**2)))/(sum_by_i)

Проблема в том, что это действительно очень медленно (занимает около 30 минут). Есть ли более быстрый способ сделать этот расчет?

1 Ответ

0 голосов
/ 02 марта 2020

Может быть, вы можете извлечь некоторые идеи из следующих комментариев:

1) Рассчитать лог (W [i, j]) с упрощением формулы, показатели исчезают, обработка должна быть быстрее .

2) Возьмите его показатель степени: Exp (Log (W {i, j])) == W [i, j]

3) Используйте переменные для значений, которые являются постоянными внутри итераций, таких как sigma = 2 * sigma ** 2, которые вы можете вычислить при запуске вне итераций.

Важно, перед любым изменением запомнить результат, чтобы ваша новая разработка могла быть протестирована в финальной версии. Матричный результат, который вы уже знаете, я полагаю, правильный.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...