Я пытаюсь реализовать алгоритм градиентного спуска с помощью питона и после мой код,градиентный алгоритм спуска с много времени, чтобы закончить - Эффективность - Python
def grad_des(xvalues, yvalues, R=0.01, epsilon = 0.0001, MaxIterations=1000):
xvalues= np.array(xvalues)
yvalues = np.array(yvalues)
length = len(xvalues)
alpha = 1
beta = 1
converged = False
i=0
cost = sum([(alpha + beta*xvalues[i] - yvalues[i])**2 for i in range(length)])/(2 * length)
start_time = time.time()
while not converged:
alpha_deriv = sum([(alpha + beta*xvalues[i] - yvalues[i]) for i in range(length)])/(length)
beta_deriv = sum([(alpha + beta*xvalues[i] - yvalues[i])*xvalues[i] for i in range(length)])/(length)
alpha = alpha - R * alpha_deriv
beta = beta - R * beta_deriv
new_cost = sum([ (alpha + beta*xvalues[i] - yvalues[i])**2 for i in range(length)])/(2*length)
if abs(cost - new_cost) <= epsilon:
print 'Converged'
print 'Number of Iterations:', i
converged = True
cost = new_cost
i = i + 1
if i == MaxIterations:
print 'Maximum Iterations Exceeded'
converged = True
print "Time taken: " + str(round(time.time() - start_time,2)) + " seconds"
return alpha, beta
Этот код работает отлично. Но проблема в том, что она занимает более 25 секунд примерно для 600 итераций. Я считаю, что это недостаточно эффективно, и я попытался преобразовать его в массив перед выполнением вычислений. Это сократило время от 300 до 25 секунд. Тем не менее, я чувствую, что его можно уменьшить. Может ли кто-нибудь помочь мне в улучшении этого алгоритма?
Благодаря
Здесь разные вещи, но я не могу воспроизвести конкретную проблему с медлительностью. Какова природа вашего ввода (значения x и yvalues)? –
@JasonS Могу ли я узнать, в чем ошибки? Это фактически кадр данных с 506 значениями. На данный момент я использую inbuild boston dataset – haimen
Прокомментировал некоторые потенциальные предметы. Кроме того, каков диапазон входных данных? Когда я добавляю что-то большее, чем 20 или около того, я получаю ошибки переполнения. –