У меня есть код для решения следующей проблемы, но он кажется слишком медленным для использования (я думаю, O (n ^ 4)).Помогите начинающему питону превратить правильный код в пригодный для использования код!
Нейрон может быть задан своим слоем и двумерным индексом.Например, N {0} (1,1) - это нейрон в первом слое, 2-й строке, 2-м столбце.Каждый нейрон расположен в двухмерном пространстве, и оба слоя равномерно заполняют одно и то же пространство.Поэтому мы можем назначить координаты (x, y) каждому нейрону на основе его двумерного индекса и количества строк / столбцов в его слое.Например: скажем, первый слой имеет s0 строк и столбцов.Тогда N {0} (1,1) будет расположен в (x, y) = (1.5 / s0,1.5 / s0)
Я должен указать схему соединения между 2 слоями нейронов.Скажем, первый слой s0 на s0, а следующий - s1 на s1.Для каждого слоя я могу дать нейрону уникальный индекс, перейдя сначала по столбцу.Результатом моей функции будет матрица с s0 * s0 строками и s1 * s1 столбцами: каждая запись указывает силу соединения от уровня 0 до уровня 1. Я хочу, чтобы сила этого соединения была значениемГауссовская функция оценивается по разнице между пространственным расположением (x, y) двух нейронов.
Мой первый подход заключался в использовании вложенных циклов, но это ужасно медленно:
def multiscaleNormalConnection(s0,s1,standardDeviationOfGaussian):
C = zeros((scale1**2),(scale2**2)) #connection matrix
sigma = matrix([[standardDeviationOfGaussian**2, 0],[0, standardDeviationOfGaussian**2]])
coeff = power(2*pi*linalg.det(sigma),-.5)
for i in range(C.shape[0]):
for j in range(C.shape[1]):
inColumn = i/scale1
inX = float(inColumn)/s0
inRow = mod(i,scale1)
inY = float(inRow)/s0
outColumn = j/s1
outX = float(outColumn)/s1
outRow = mod(j,scale1)
outY = float(outRow)/s1
dev = array([outX-inX,outY-inY])
C[i,j] = coeff*exp(-0.5*dot(dot(dev.T,sigma.I),dev))
return C
Возможно, есть какой-то способ рассчитать все значения, которые вам понадобятся заранее?Есть ли какие-нибудь трюки с питоном, чтобы помочь мне ускорить это?Если бы это был Matlab, я бы попытался векторизовать код, но мне нужно написать это на Python.
Любые идеи приветствуются!Спасибо.