Мой код python выглядит следующим образом: он берет навсегда. Могу ли я использовать несколько трюков? Картина я анализирую крошечная и в оттенках серого ...Ускорение алгоритма ЭВМ Гуассиана
def gaussian_probability(x,mean,standard_dev):
termA = 1.0/(standard_dev*np.sqrt(2.0*np.pi))
termB = np.exp(-((x - mean)**2.0)/(2.0*(standard_dev**2.0)))
g = (termA*termB)
return g
def sum_of_gaussians(x):
return sum([self.mixing_coefficients[i] *
gaussian_probability(x, self.means[i], self.variances[i]**0.5)
for i in range(self.num_components)])
def expectation():
dim = self.image_matrix.shape
rows, cols = dim[0], dim[1]
responsibilities = []
for i in range(self.num_components):
gamma_k = np.zeros([rows, cols])
for j in range(rows):
for k in range(cols):
p = (self.mixing_coefficients[i] *
gaussian_probability(self.image_matrix[j,k],
self.means[i],
self.variances[i]**0.5))
gamma_k[j,k] = p/sum_of_gaussians(self.image_matrix[j,k])
responsibilities.append(gamma_k)
return responsibilities
я включил только шаг ожидания, потому что, в то время как шаг максимизации перебирает каждый элемент массива ответственности матриц, кажется, идут относительно быстро (так может быть узким местом является все расчеты gaussian_probability?)
Ха-ха, просто посмотрел на него снова ... Не могу поверить, что я сделал нормализацию внутри цикла. Спасибо чувак! – bordeo
выполняет 'respons.sum (0)' принимает сумму через значения? Например, каждый пиксель должен быть нормализован в соответствии с каждым компонентом ... так 'ответственность [0] [x, y] = ответственность [0] [x, y]/(ответственность [0] [x, y] + [1] [x, y] + [2] [x, y] и т. д.) ' – bordeo
Да, это именно то, что он делает: он суммируется по нулевой оси, которая охватывает компоненты. – jakevdp