线性回归:从头开始执行numpy操作,梯度增加到无穷大

2024-06-16 15:55:54 发布

您现在位置:Python中文网/ 问答频道 /正文

下面我实现了找到here的梯度下降函数。(方法:批处理梯度下降法)我想尝试在没有numpy的情况下实现它,因为我不太了解numpy数组,我想直观地理解所需的操作

我在列表x和y中创建了一个简单的线性关系,使得y0=5x0+1。x最初是两个元素列表,其中包含n个元素,y是n个元素中的st个元素。x的第二个元素是1,用于说明偏差权重。权重初始化为[0,0]

我认为我的问题在于GetGradient()因为我已经测试了getHyposition()——权重和每个2元素输入列表之间的点积运算——以及Subtract1d()——当权重为0时,这两个都很容易在循环的运行1中验证

GetGradient()计算在他们的教程中找到的X.T.dot(loss)/m,这就是此方法实现的。但我不知道我错在哪里。梯度在10次迭代后很快就转移到了南地

有史以来第一次张贴问题,所以我感谢您的帮助

def dot(K, L):
   if len(K) != len(L):
      return False
   return sum(i[0] * i[1] for i in zip(K, L))
def GetHypothesis(input,weights):
    hyp = []
    for i in range(len(input)):
        d = dot(input[i],weights)
        hyp.append(d)
    return hyp
def Subtract1D(hyp,act):
    loss = []
    for i in range (len(hyp)):
        loss.append(hyp[i]-act[i])
    return loss
def GetGradient(x,loss):
    col1 = []
    col2 = []
    for ele in x:
        col1.append(ele[0])
        col2.append(ele[1])
    
    w1 = dot(col1,loss)
    w2 = dot(col2,loss)
    w1 = w1/len(x)
    w2 = w2/len(x)
    return [w1, w2]
def GradientDescent(x,y,w,lr=0.1):
    for i in range(10):
        # hypothesis
        h = GetHypothesis(x,w)
        loss = Subtract1D(h,y)

        gradientVector = []

        grad = GetGradient(x,loss)
        
        grad[0] = grad[0]*lr
        grad[1] = grad[1]*lr

        w[0] = (w[0]  - grad[0])
        w[1] = (w[1]  - grad[1])
        print(grad)
    return w
x = list(range(1,50))
y = [i*5+1 for i in x]
for i in range(len(x)):
    x[i] = [x[i],1]
w = [0,0]

GradientDescent(x,y,w)

Tags: in元素forlenreturndefrangedot