请帮助我在python的梯度下降实现中找到bug

请帮助我在python的梯度下降实现中找到bug,python,machine-learning,gradient,regression,Python,Machine Learning,Gradient,Regression,我正在尝试实现链接中解释的渐变下降。下面的代码返回的参数是指数级的,如果我增加迭代次数,参数将达到无穷大。我已经浪费了4个小时试图找出问题所在。请帮帮我 import pandas as pd import numpy as np advertising_data = pd.read_csv("http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv", index_col=0) target = np.array(advertising_data.

我正在尝试实现链接中解释的渐变下降。下面的代码返回的参数是指数级的,如果我增加迭代次数,参数将达到无穷大。我已经浪费了4个小时试图找出问题所在。请帮帮我

import pandas as pd
import numpy as np

advertising_data = pd.read_csv("http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv", index_col=0)
target = np.array(advertising_data.Sales.values)
advertising_data["ones"] = np.ones(200)
advertising_data = advertising_data[["ones", "TV"]]
features = np.array(advertising_data.values)

def error_ols(target, features):
    def h(betas):
        error = target - np.dot(features, betas)
        return error
    return h

def ols_loss(errors):
    return np.sum(errors*errors)

def gradient_descend(initial_guess, learning_step, gradient, iterations = 10):
    for i in range(0, iterations):
        update = initial_guess + learning_step*gradient( initial_guess)
        initial_guess = update
        error = error_ols(target, features)(update)
        print ols_loss(error)

    return update

def ols_gradient(target, features):
    def h(betas):
        error =  target - np.dot(features, betas)
        return -np.dot(error, features)
    return h



gradient_function = ols_gradient(target, features)
initial_guess = np.array([1,1])
gradient_descend(initial_guess, 0.0001, gradient_function) 

花了很长时间来经历这一切;将其视为“关注细节练习”

确保将学习率降至.0000001


有趣的是,最小的错误是最难发现的。

您编写的代码在链接中的任何地方都没有出现;这似乎是你自己的设计。说时间被“浪费”是很糟糕的形式——代码是你写的。我理解这些东西所需要的数学知识,现在我的工作“迫使”我学习几种全新的编程语言来实现它。我喜欢学习它;我要花很长时间才能将我的理论实现为代码,但这都是在学习。毫无疑问,我已经编写了非常冗长的代码,但我可以毫无疑问地向其他人解释它的作用。无论我做了多少尝试,我都无法理解你的代码。我很惊讶你花了这么多时间!这永远是一个+/-问题:)投票支持这项工作。还有一个问题,他正在做一个完整的批量下降,但没有用数据集中的行数除以梯度。这就是为什么你需要这么低的学习率,否则0.01应该是sufficient@ProgrammingRain我试图按照你的建议降低学习率,但损失仍在增加。我不明白为什么我在网上看到的其他实现会将损失除以行数。除以一个固定数字不应影响最佳值。谢谢你抽出时间来解决我的问题,但问题还没有解决。请帮忙。
def ols_gradient(target, features):
    def h(betas):
        error =  target - np.dot(features, betas)
        return np.dot(error, features)
    return h