3分钟带你掌握一元线性回归

  • 一元线性回归模型:

y = h θ ( x ) = θ 0 + θ 1 x y=h_\theta(x)=\theta _0 +\theta _1 x y=hθ(x)=θ0+θ1x

输入只包含一个单独的特征。

  • 对于样本 ( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) (x(i),y(i)),模型预测值为: y ^ ( i ) = θ 0 + θ 1 x ( i ) {\hat y}^{(i)}=\theta _0 +\theta _1 x^{(i)} y^(i)=θ0+θ1x(i)

  • 误差/残差:样本真实值与预测值之差

e ( i ) = y ( i ) − y ^ ( i ) = y ( i ) − θ 0 − θ 1 x ( i ) e^{(i)}=y^{(i)}-{\hat{y}}^{(i)}=y^{(i)}-\theta _0 -\theta _1 x^{(i)} e(i)=y(i)y^(i)=y(i)θ0θ1x(i)

  • 给定训练集 D = { ( x i , y i ) } D=\{(x_i,y_i)\} D={(xi,yi)},找到一条直线(模型)
    y = h θ ( x ) = θ 0 + θ 1 x y=h_{\theta}(x)=\theta _0 +\theta _1 x y=hθ(x)=θ0+θ1x
    使得所有样本尽可能落在它的附近。

  • 损失函数(Loss function):最小化均方误差,从而寻找最优的参数。
    m i n θ 1 , θ 0 L ( θ 1 , θ 0 ) = m i n θ 1 , θ 0 ∑ i = 1 m ( y ( i ) − θ 0 − θ 1 x ( i ) ) 2 min_{\theta_1,\theta_0}L(\theta_1,\theta_0)=min_{\theta_1,\theta_0}{\sum_{i=1}^{m}{(y^{(i)}-\theta _0 -\theta _1 x^{(i)}})^2} minθ1,θ0L(θ1,θ0)=minθ1,θ0i=1m(y(i)θ0θ1x(i))2

  • 闭式解

    将目标函数 L ( θ 1 , θ 0 ) L(\theta_1,\theta_0) L(θ1,θ0)求偏导:
    ∂ L ∂ θ 0 = ∑ i = 1 m 2 ( y ( i ) − θ 0 − θ 1 x ( i ) ) ( − 1 ) = 0 ∂ L ∂ θ 1 = ∑ i = 1 m 2 ( y ( i ) − θ 0 − θ 1 x ( i ) ) ( − x i ) = 0 \frac{\partial L}{\partial \theta_0 }=\sum_{i=1}^{m}{2(y^{(i)}-\theta _0 -\theta _1 x^{(i)})(-1)}=0\\ \frac{\partial L}{\partial \theta_1 }=\sum_{i=1}^{m}{2(y^{(i)}-\theta _0 -\theta _1 x^{(i)})(-x_i)}=0 θ0L=i=1m2(y(i)θ0θ1x(i))(1)=0θ1L=i=1m2(y(i)θ0θ1x(i))(xi)=0
    可以解得:

    θ 1 ^ = ∑ i = 1 m x ( i ) y ( i ) − m x ‾ y ‾ ∑ i = 1 m ( x ( i ) ) 2 − m x ‾ 2 \hat{\theta_1}=\frac{\sum_{i=1}^m{x^{(i)}y^{(i)}-m\overline x \overline y }}{\sum_{i=1}^m{(x^{(i)})^2-m{\overline x}^2}} θ1^=i=1m(x(i))2mx2i=1mx(i)y(i)mxy

    θ 0 ^ = y ‾ − θ 1 x ‾ \hat{\theta_0}=\overline{y}-\theta_1 \overline x θ0^=yθ1x

  • 代码

import numpy as np
import matplotlib.pyplot as plt
# 以下两行代码解决jupyter notebook显示图片模糊问题
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
##  测试数据
X = np.arange(0,10,0.1)
Y = 3*X+np.random.random([X.size])*5

def f(x,a):
    X = np.ones((len(x),2))
    X[:,1]=x
    return X.dot((a.T))
a = np.zeros((2))
a[1] = ((X*Y).sum()- X.sum()*Y.sum()/len(X))/((X*X).sum()-X.sum()*X.sum()/len(X))
a[0] = Y.sum()/len(Y)- a[1]*X.sum()/len(X)

Y_Test = f(X,a)
plt.scatter(X,Y,label="原始数据",c='b',alpha=0.5)
plt.plot(X,Y_Test,label="回归线",c='r')
plt.title('一元线性回归')
plt.xlabel("X")
plt.ylabel("Y")
plt.legend()
plt.show()

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一朝英雄拔剑起

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值