python一元线性回归算法,代码及参数更新动图展示

(一元)线性回归算法

假设函数和代价函数

1.设已知数据集为(X,Y),假设其线性关系为:
y _ p r e d = h θ ( x ) = θ 0 + θ 1 × x y\_pred=h_{\theta}\left( x \right) =\theta _0+\theta _1\times x y_pred=hθ(x)=θ0+θ1×x

2.用均平方误差(MSE)作为代价函数(损失函数),其中m为样本数:
J ( x , y , θ ) ( M S E ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 ^{J(x,y,\theta )(MSE)=\frac{1}{2m}\sum_{i=1}^m{\left( h_{\theta}\left( x^{\left( i \right)} \right) -y^{^{\left( i \right)}} \right) ^2}} J(x,y,θ)(MSE=2m1i=1m(hθ(x(i))y(i))2

梯度下降算法更新公式

根据梯度下降算法,对θ求偏导数,其偏导为:
∂ J ∂ θ j = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \frac{\partial J}{\partial \theta _j}=\frac{1}{m}\sum_{i=1}^m{\left( h_{\theta}\left( x^{\left( i \right)} \right) -y^{\left( i \right)} \right)}{x_j}^{\left( i \right)} θjJ=m1i=1m(hθ(x(i))y(i))xj(i)

所以其参数更新公式为:
θ j = θ j − α ∂ J ∂ θ j = θ j − α m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta _j=\theta _j-\alpha \frac{\partial J}{\partial \theta _j}=\theta _j-\frac{\alpha}{m}\sum_{i=1}^m{\left( h_{\theta}\left( x^{\left( i \right)} \right) -y^{\left( i \right)} \right)}{x_j}^{\left( i \right)} θj=θjαθjJ=θjmαi=1m(hθ(x(i))y(i))xj(i)

假设函数可以写成:
h θ ( x ) = θ 0 × x 0 + θ 1 × x 1 = θ 0 × 1 + θ 1 × x 1 h_{\theta}\left( x \right) =\theta _0\times x_0+\theta _1\times x_1=\theta _0\times 1+\theta _1\times x_1 hθ(x)=θ0×x0+θ1×x1=θ0×1+θ1×x1

所以
θ 0 = θ 0 − α ∂ J ∂ θ 0 = θ 0 − α m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 0 ( i ) = θ 0 − α m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) \theta _0=\theta _0-\alpha \frac{\partial J}{\partial \theta _0}=\theta _0-\frac{\alpha}{m}\sum_{i=1}^m{\left( h_{\theta}\left( x^{\left( i \right)} \right) -y^{\left( i \right)} \right)}{x_0}^{\left( i \right)} \\ =\theta _0-\frac{\alpha}{m}\sum_{i=1}^m{\left( h_{\theta}\left( x^{\left( i \right)} \right) -y^{\left( i \right)} \right)} θ0=θ0αθ0J=θ0mαi=1m(hθ(x(i))y(i))x0(i)=θ0mαi=1m(hθ(x(i))y(i))
至此,参数迭代公式完成。

代码

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_regression  ##产生一元线性回归数据
m=80   ##80份数据
##产生一元线性回归数据
x_train,y_train=make_regression(n_samples=m,n_features=1,noise=30,bias=20,random_state=17)
theat=np.array([0,0]) #初始化参数
lr=0.003 #学习率
def Y_pred(x,a) #假设函数:
    return x*a[0]+a[1]
def partial_theat(x,y,a):##求偏导
    cost_all=[0,0]
    for i in range(m):
        cost_all[0]=cost_all[0]+(Y_pred(x[i],a)-y[i])*x[i]
        cost_all[1]=cost_all[1]+(Y_pred(x[i],a)-y[i])
    return cost_all
def J(x,y,a):#损失或代价函数
    cost=0
    for i in range(m):
        cost=cost+(Y_pred(x[i],a)-y[i])**2
    return (1/2*m)*cost
iterations=0##迭代次数,初始化为0
theat_list=np.array([0,0])
while(iterations<100): ##参数更新100次
    theat[0]=theat[0]-lr*partial_theat(x_train,y_train,theat)[0]
    theat[1]=theat[1]-lr*partial_theat(x_train,y_train,theat)[1]
    theat_list=np.vstack((theat_list,theat))
    iterations=iterations+1
theat_list=np.array(theat_list)##保留参数更新过程

待拟合数据散点图

from matplotlib.animation import FuncAnimation #导入动画图接口
import matplotlib.pyplot as plt 
fig,ax=plt.subplots() #画布申请
##--------初始状态--------------
atext_anti=plt.text(2,2,'',fontsize=15)
btext_anti=plt.text(2,40,'',fontsize=15)
ln,=plt.plot([],[],'red')
#--------------初始状态--------------------
def init():
    ax.set_xlim(np.min(x_train),np.max(x_train))
    ax.set_ylim(np.min(y_train),np.max(y_train))
    return ln,
def upgrad(frame):
    x=x_train
    y=frame[0]*x+frame[1]
    ln.set_data(x,y)
    atext_anti.set_text('a=%.3f'%frame[0])
    btext_anti.set_text('b=%.3f'%frame[1])
    return ln,
  #--------静态图----------------
ax.scatter(x_train,y_train)
#---------静态图-------------
ani=FuncAnimation(fig,upgrad,frames=theat_list,init_func=init)
plt.show()

参数更新可视化

参数更新过程动图展示

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值