Python梯度下降-成本持续增长

Python梯度下降-成本持续增长,python,numpy,machine-learning,regression,gradient-descent,Python,Numpy,Machine Learning,Regression,Gradient Descent,我试图在python中实现梯度下降,每次迭代我的损失/成本都会不断增加 我看到一些人发表了关于这一点的帖子,并在这里看到了答案: 我相信我的实现是类似的,但看不出我在做什么错事以获得爆炸式的成本价值: Iteration: 1 | Cost: 697361.660000 Iteration: 2 | Cost: 42325117406694536.000000 Iteration: 3 | Cost: 2582619233752172973298548736.000000 Iteration:

我试图在python中实现梯度下降,每次迭代我的损失/成本都会不断增加

我看到一些人发表了关于这一点的帖子,并在这里看到了答案:

我相信我的实现是类似的,但看不出我在做什么错事以获得爆炸式的成本价值:

Iteration: 1 | Cost: 697361.660000
Iteration: 2 | Cost: 42325117406694536.000000
Iteration: 3 | Cost: 2582619233752172973298548736.000000
Iteration: 4 | Cost: 157587870187822131053636619678439702528.000000
Iteration: 5 | Cost: 9615794890267613993157742129590663647488278265856.000000
我正在网上找到的一个数据集(洛杉矶心脏数据)上对此进行测试:

导入代码:

dataset = np.genfromtxt('heart.csv', delimiter=",")

x = dataset[:]
x = np.insert(x,0,1,axis=1)  # Add 1's for bias
y = dataset[:,6]
y = np.reshape(y, (y.shape[0],1))
梯度下降:

def gradientDescent(weights, X, Y, iterations = 1000, alpha = 0.01):
    theta = weights
    m = Y.shape[0]
    cost_history = []

    for i in xrange(iterations):
        residuals, cost = calculateCost(theta, X, Y)
        gradient = (float(1)/m) * np.dot(residuals.T, X).T
        theta = theta - (alpha * gradient)

        # Store the cost for this iteration
        cost_history.append(cost)
        print "Iteration: %d | Cost: %f" % (i+1, cost)
计算成本:

def calculateCost(weights, X, Y):
    m = Y.shape[0]
    residuals = h(weights, X) - Y
    squared_error = np.dot(residuals.T, residuals)

    return residuals, float(1)/(2*m) * squared_error
计算假设:

def h(weights, X):   
    return np.dot(X, weights)
要实际运行它,请执行以下操作:

gradientDescent(np.ones((x.shape[1],1)), x, y, 5)

假设梯度的推导是正确的,则使用:
=-
,并且应该使用:
-=
。您没有更新
theta
,而是将其重新分配到
-(alpha*梯度)

编辑(在代码中修复上述问题后):


我在我认为正确的数据集上运行了代码,并通过设置
alpha=1e-7
获得了行为成本。如果您在
1e6
迭代中运行它,您应该会看到它正在收敛。此数据集上的这种方法似乎对学习率非常敏感

一般来说,如果你的成本在增加,那么你应该首先检查你的学习率是否太高。在这种情况下,利率会导致成本函数跳过最佳值并向上增加到无穷大。尝试不同的学习率小值。当我面对你描述的问题时,我通常会反复尝试学习率的1/10,直到我能找到一个J(w)减小的速率


另一个问题可能是派生实现中的错误。调试的一个好方法是进行梯度检查,比较分析梯度和数值梯度。

我的最佳选择是微不足道的签名问题,因为它似乎走错了方向。我认为这是我在将事情转移到堆栈溢出时的一个小错误。我用
theta=theta-(alpha*gradient)
替换这一行,使代码更加明确,但我仍然遇到同样的问题