下面我实现了找到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)
目前没有回答
相关问题 更多 >
编程相关推荐