线性回归梯度下降
单变量梯度下降
选择20年标准化后GDP数据和时间进行回归
加载包
import matplotlib.pyplot as plt #画图使用
import openpyxl #读取excel文件
数据读取
wd = openpyxl.load_workbook('E:\机器学习数据\线性回归梯度下降.xlsx')
wd.sheetnames #查看工作表名字
ws = wd['一维']
#查看工作表内容
for i in ws.values:
print(i)
#将其转换为列表的形式
data = []
for i in ws.values:
data.append(i)
print(data)
输出结果:
[(‘x’, ‘sdGDP’), (20, 1.1214348929428848), (19, 1.0936843658695632)…]
#设置迭代阈值,当误差小于阈值时停止迭代
o=0.001
#设置学习率
a=0.001
#初始化参数值
theta0=0
theta1=0
#得到数据长度
m=len(data)-1
#设置最大迭代次数防止死循环
loop_max=100000
lp=1#定义迭代次数
#定义回归形式
def h(x,theta0,theta1):
return theta0+theta1*x
while(lp<=loop_max):
suma=0
sumb=0
J0=0
sumJ=0
for i in range(m-1):
sumJ+=(h(data[i+1][0],theta0,theta1)-data[i+1][1])**2
suma+=(h(data[i+1][0],theta0,theta1)-data[i+1][1])
sumb+=(h(data[i+1][0],theta0,theta1)-data[i+1][1])*data[i+1][0] #即(h(x)-y)*x
J1=(1/(2*m))*sumJ
theta0-=a*(1/m)*suma
theta1-=a*(1/m)*sumb
print ('迭代次数为%d'%lp)
print ('参数值为%f,%f'%(theta0,theta1))#f%是输出浮点数,用d%只能输出0
if(abs(J1-J0)>o):
lp+=1
J0=J1
else:
break
输出结果:
迭代次数为3393
参数值为-0.034491,0.054928
#绘制y_hat和y对比图
x=[]
for i in range(m-1):
x.append(data[i+1][0])
y_hat=[]
for i in range(m-1):
y_hat.append(theta0+x[i]*theta1)
y=[]
for i in range(m-1):
y.append(data[i+1][1])
plt.plot(x,y , 'g*')#绘制点图
plt.plot(x, y_hat, 'r')绘制线图
plt.show()
输出结果