多元回归——梯度下降法

多元回归

加载包

import openpyxl
from sympy import *#求导函数用得包
import matplotlib.pyplot as plt

读取数据

wd = openpyxl.load_workbook('E:\机器学习数据\线性回归梯度下降.xlsx')
wd.sheetnames #查看工作表名字
ws = wd['多维']
data = []
for i in ws.values:
    data.append(i)
print(data)

定义格式函数

def x_list(m,j):
    x=[]
    for i in range(m):
        x.append(data[i+1][j])
    return x
m=len(data)-1
X1=x_list(m,0)
X2=x_list(m,1)
X3=x_list(m,2)
Y=x_list(m,3)

定义求和函数


def sumtheta(theta0,theta1,theta2,theta3,DIFF):
    sum_theta=0
    for i in range(m):
        sum_theta=DIFF.subs({t0:theta0,t1:theta1,t2:theta2,t3:theta3,x1:X1[i],x2:X2[i],x3:X3[i],y:Y[i]})
    return sum_theta
t0,t1,t2,t3,x1,x2,x3,y=symbols('t0 t1 t2 t3 x1 x2 x3 y') #这里要用symbols不能用symbol因为是多变量
#设置迭代阈值,当误差小于阈值时停止迭代
o=0.0001

#设置学习率
a=0.001

#初始化参数值
theta0=0
theta1=0
theta2=0
theta3=0
#设置最大迭代次数防止死循环
loop_max=100000
lp=1#定义迭代次数
lp=1
while(lp<loop_max):
    J0=0
    suma=sumtheta(theta0,theta1,theta2,theta3,diff((t0+t1*x1+t2*x2+t3*x3-y)**2,t0))
    sumb=sumtheta(theta0,theta1,theta2,theta3,diff((t0+t1*x1+t2*x2+t3*x3-y)**2,t0))
    sumc=sumtheta(theta0,theta1,theta2,theta3,diff((t0+t1*x1+t2*x2+t3*x3-y)**2,t0))
    sumd=sumtheta(theta0,theta1,theta2,theta3,diff((t0+t1*x1+t2*x2+t3*x3-y)**2,t0))
    sumJ=sumtheta(theta0,theta1,theta2,theta3,(t0+t1*x1+t2*x2+t3*x3-y)**2)
    J1=(1/(2*m))*sumJ
    theta0-=a*(1/m)*suma
    theta1-=a*(1/m)*sumb
    theta2-=a*(1/m)*sumc
    theta3-=a*(1/m)*sumd
    
    print ('迭代次数为%d'%lp)

    print ('参数值为%f,%f,%f,%f'%(theta0,theta1,theta2,theta3))#f%是输出浮点数,用d%只能输出0
    
    if(abs(J1-J0)>o):
        lp+=1
        J0=J1
    else:
        break

画图

y_hat=[]
for i in range(m):
    y_hat.append(theta0+theta1*X1[i]+theta2*X2[i]+theta3*X3[i])
x=[]
for i in range(m):
    x.append(i)
    
plt.plot(x,Y , 'g*')
plt.plot(x,y_hat, 'r')
plt.show()

拟合结果
拟合效果一般

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值