一元线性回归梯度下降法

线性回归梯度下降

单变量梯度下降

选择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()

输出结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值