今天用梯度下降的方法求解一个y=ax+b类型的问题
#导入包
import numpy as np
import matplotlib.pyplot as plt
生成数据
X=np.linspace(-1,6,101)
np.random.seed(1)
Y=2*X+1+np.random.random(size=X.shape)*2
plt.scatter(X,Y)
生成数据之后,需要定义损失函数:
def J(a,b,x,y):
s=np.sum((y-a*x-b)**2)
return s/(2*len(x))
然后分别对a,b求偏导:
a_fir=0
b_fir=0
a_sec=0.5
b_sec=1.0
rate=0.12
n_iter=500
i=0
while i<n_iter:
plt.plot(b_sec,J(a_sec,b_sec,X,Y),color='r',marker='+')
gda=(J(a_sec,b_fir,X,Y)-J(a_fir,b_fir,X,Y))/(a_sec-a_fir)
gdb=(J(a_fir,b_sec,X,Y)-J(a_fir,b_fir,X,Y))/(b_sec-b_fir)
a_fir=a_sec
b_fir=b_sec
a_sec-=rate*gda
b_sec-=rate*gdb
print(a_sec,b_sec)
if abs(gda)<1e-6 and abs(gdb)<1e-6:
break
i+=1
print(a_sec,b_sec)
plt.show()
这里我的学习率是0.12,循环次数为500,最后结果为2,2
完整代码与运行结果如下
X=np.linspace(-1,6,101)
np.random.seed(1)
Y=2*X+1+np.random.random(size=X.shape)*2
plt.scatter(X,Y)
def J(a,b,x,y):
s=np.sum((y-a*x-b)**2)
return s/(2*len(x))
a_fir=0
b_fir=0
a_sec=0.5
b_sec=1.0
rate=0.12
n_iter=500
i=0
while i<n_iter:
plt.plot(b_sec,J(a_sec,b_sec,X,Y),color='r',marker='+')
gda=(J(a_sec,b_fir,X,Y)-J(a_fir,b_fir,X,Y))/(a_sec-a_fir)
gdb=(J(a_fir,b_sec,X,Y)-J(a_fir,b_fir,X,Y))/(b_sec-b_fir)
a_fir=a_sec
b_fir=b_sec
a_sec-=rate*gda
b_sec-=rate*gdb
print(a_sec,b_sec)
if abs(gda)<1e-6 and abs(gdb)<1e-6:
break
i+=1
print(a_sec,b_sec)
plt.show()