Python解线性回归方程中的系数向量

目的:解线性回归中的系数向量w
在这里插入图片描述
定义:

Full batch gradient descent

定义
cost function
在这里插入图片描述

#w0为纵的向量
def batch_gradient(x,y,w0,a):
    d=0
    desc=[[0],[0],[0]]
    for i in range(len(y)):
        d = y[i]-x[i][0]*w0[1,0]-x[i][1]*w0[2,0]-w0[0,0]
        x_mat=np.mat([1,x[i][0],x[i][1]])
        desc = desc + (x_mat.T)*d
    w1=w0+a*desc
    return w1
def iteration(w1,k):
    w_all=[]
    print ("第1次迭代后的点为:",w1)
    for i in range (k):
        if (i+1)< k:
            w1=batch_gradient(x,y,w1,a)
            print ("第",i+2,"次迭代后的点为:",w1)
            w_all.append(w1)
    return w_all
        
x=[[4,8],[3.6,7.6],[4.4,8.4],[3.2,7.2],[4.8,8.8],[2.8,6.8]]
y=[14,13,15,12,16,11]
w0=np.mat([[0],[2],[5]])
a=0.05#学习率
w1=batch_gradient(x,y,w0,a)  
iteration(w1,3)

在这里插入图片描述

报错1:w1=(w + ad for w in w0)运行后生成generator对象,查看w1提示cannot pickle ‘generator’ object,修改为w1=[w + ad for w in w0]就是一个列表了。
插叙:如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器generator
报错2:desc += (x_mat.T)*d其中desc为desc=[[0],[0],[0]],矩阵加法出错,提示‘Cannot cast ufunc ‘add’ output from dtype(‘float64’) to dtype(‘int32’) with casting rule ‘same_kind’’。修改为desc = desc + (x_mat.T)*d。

Normal equation method

解方程代公式就完事了
在这里插入图片描述

#normal equations method
import numpy as np
x=[[4,8],[3.6,7.6],[4.4,8.4],[3.2,7.2],[4.8,8.8],[2.8,6.8]]
y=[14,13,15,12,16,11]
w0=np.mat([[0],[2],[5]])
a=0.05
x_mat=np.mat([x[0][0],x[0][1],1])
y_mat=np.mat(y[0])
for i in range(len(y)):
    if i+2 <= len(y):
       x_mat=np.r_[x_mat,np.mat([x[i+1][0],x[i+1][1],1])]
       y_mat=np.r_[y_mat,np.mat(y[i+1])]
xtx=np.dot(x_mat.T,x_mat)  
xtxit=np.dot(np.linalg.inv(xtx),x_mat.T)
w=np.dot(xtxit,y_mat)

在这里插入图片描述
不知道为啥结果和题目中的结果不一样,公式也没错啊。。
难点1:怎么依次往矩阵里添加行。https://blog.csdn.net/tintinetmilou/article/details/78119320
报错1:x_mat=np.r_(x_mat,([x[i+1][0],x[i+1][1],1])),提示’RClass’ object is not callable。解决:np.r_函数得用方括号[]。并且前后得统一数据格式,不能直接将列表插入进矩阵。
修改为:np.r_[x_mat,np.mat([x[1][0],x[1][1],1])]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值