我是一个初学者,代码纯粹是实验性的,可能使用起来不太方便,对此表示歉意(例如:我在for循环中使用了一个大数字来实现连续循环)
假设的形式为:ax^2+bx+c,其中参数是a、b和c。
测试数据和输出
x=[10,20,30,40,50]y=[-50,-90,-130,-170,-210]
假设函数
def h(m): return a*(x[m]**2)+b*x[m]+c
改变参数
for i in range(1,300000000): for j in range (0,4): c1=c1+(h(j)-y[j]) b1=b1+(h(j)-y[j])*(x[j]) a1=a1+(h(j)-y[j])*(x[j])**2a=a-0.00000046*0.20*a1b=b-0.00000046*0.20*b1c=c-0.00000046*0.20*c1
成本函数
for k in range(0, 4): s = s + (h(k) - y[k])**2cost=1/5*s
答案应该是a=0,b=-4,c=-10,但我的结果是a=0.02(每次循环后都会增加),b=-5.4946,c=11,当成本大约为2时(我实际上没有结束代码执行,对此带来的不便表示歉意)
我哪里出错了?
回答:
你几乎做对了一切,只有两个问题。请看内联评论:
# 依赖全局/上层作用域变量是一个坏习惯def h(a, b, c, value): return a*(value**2)+b*value+c# 不要重复自己 - 最好在一个地方定义而不是三个lr = 0.00000046*0.20 # 学习率for i in range(1,300000000): # 第一个问题:a1, b1 和 c1 需要重置 a1 = b1 = c1 = 0 # 硬编码魔法常数(包括数据形状)是一个坏习惯 for x_, y_ in range zip(x, y): diff = h(a, b, c, x_)-y_ c1 += diff b1 += diff * x[j] a1 += diff * x[j]**2 # 第二个问题:这需要在每个“批次”中执行 a -= lr * a1 b -= lr * b1 c -= lr * c1
如果使用向量形式会更加高效,但我希望你能理解这个思路