python - 梯度下降算法需要很长时间才能完成 - 效率 - Python

标签 python algorithm python-2.7 gradient gradient-descent

我正在尝试使用 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

这段代码运行良好。但问题是,大约 600 次迭代需要超过 25 秒的时间。我觉得这不够有效,我尝试在进行计算之前将其转换为数组。这确实将时间从 300 秒减少到 25 秒。我仍然觉得它可以减少。谁能帮我改进这个算法?

谢谢

最佳答案

正如我评论的那样,我无法重现缓慢的过程,但是这里有一些潜在的问题:

  1. 看起来 length 没有改变,但是您在重复调用 range(length)。在 Python 2.x 中,range 创建一个列表,重复执行此操作会减慢速度(对象创建并不便宜。)使用 xrange(或导入 Py3 兼容的sixfuture 的迭代器 range)并预先创建一次范围,而不是每次都创建。

  2. i 在这里以可能导致问题的方式被重用。您正在尝试将其用作整体迭代计数,但是您使用 i 的每个列表理解都会覆盖函数范围内的 i ,这意味着“迭代”计数将始终以 length - 1 结束。

关于python - 梯度下降算法需要很长时间才能完成 - 效率 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35421348/

相关文章:

python - 如果丢失,强制 Django 重新打开数据库连接

python - 实现快速排序并得到一个我不明白的错误

python-2.7 - 删除嵌套列表Python中具有相同元素的重复元组

mysql - Mac OS Sierra virtualenv (python 2.7) pip install mysqlclient 报错

c++ - std::transform 的 lambda(parameter) 中的 const 限定符与 std::sregex_token_iterator

python - 从移动对象中获取的点列表

python - gtk:为什么要执行 Gtk::Main::Iteration?

python - 模块对象没有属性 'VideoCapture'

Python 反转列表的每两个元素

algorithm - 如何调整K-means聚类?