一元线性回归

本文介绍了线性回归的基本概念,当预测变量是连续的,我们使用线性回归来拟合数据。通过最小化损失函数J(w,b),即均方误差,来寻找最佳的直线拟合。文中详细展示了如何手工使用最小二乘法求解线性回归的参数w和b,并给出了Python代码实现。最后,绘制了线性回归模型与原始数据的对比图。
摘要由CSDN通过智能技术生成

监督学习中,如果预测的变量是离散的,我们称其为分类(如决策树,支持向量机等),如果预测的变量是连续的,我们称其为回归。回归分析是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。在回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。
在这里插入图片描述

简单来讲就是给一些离散的点,求出一条预测直线 h ( x ) = w x + b h(x)=wx+b h(x)=wx+b,这条直线的要求是基本满足这些点的变化趋势,那么我们用什么来衡量这条直线选取的好坏呢?可以通过损失函数来衡量。 J ( w , b ) = 1 m ∗ ∑ i = 1 m ( h ( x i ) − y i ) 2 = 1 m ∗ ∑ i = 1 m ( w x i + b − y i ) 2 J(w,b)=\frac{1}{m}*\sum_{i=1}^m(h(x^i)-y^i)^2=\frac{1}{m}*\sum_{i=1}^m(wx^i+b-y^i)^2 J(w,b)=m1i=1m(h(xi)yi)2=m1i=1m(wxi+byi)2
线性回归算法的目的是使 J ( w , b ) J(w,b) J(w,b)最小,也就是我们所得到的预测直线越准确。具体方法可以用梯度下降法和最小二乘法,梯度下降上一篇博客已经给出,这里我们用最小二乘法来求预测直线。(1)
J ( w , b ) = 1 m ∗ ∑ i = 1 m ( w x i + b − y i ) 2 J(w,b)=\frac{1}{m}*\sum_{i=1}^m(wx^i+b-y^i)^2 J(w,b)=m1i=1m(wxi+byi)2(2) x ˉ = ∑ i = 1 m x i m \bar{x}=\frac{\sum_{i=1}^mx^i}{m} xˉ=mi=1mxi y ˉ = ∑ i = 1 m y i m \bar{y}=\frac{\sum_{i=1}^my^i}{m} yˉ=mi=1myi(3) ∂ J ( w , b ) ∂ b = 2 ( w x ˉ + b − y ˉ ) \frac{\partial J(w,b)}{\partial b}=2(w\bar{x}+b-\bar{y}) bJ(w,b)=2(wxˉ+byˉ) ∂ J ( w , b ) ∂ w = 2 m ( w ∑ i = 1 m ( x i 2 − x ˉ 2 ) + m x ˉ y ˉ − ∑ i = 1 m x i y i ) \frac{\partial J(w,b)}{\partial w}=\frac{2}{m}(w\sum_{i=1}^m(x_i^2-\bar{x}^2)+m\bar{x}\bar{y}-\sum_{i=1}^mx^iy^i) wJ(w,b)=m2(wi=1m(xi2xˉ2)+mxˉyˉi=1mxiyi)(4)令 ∂ J ( w , b ) ∂ b = 0 , ∂ J ( w , b ) ∂ w = 0 \frac{\partial J(w,b)}{\partial b}=0,\frac{\partial J(w,b)}{\partial w}=0 bJ(w,b)=0,wJ(w,b)=0可得: b = y ˉ − w x ˉ b=\bar{y}-w\bar{x} b=yˉwxˉ w = ∑ i = 1 m ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 m ( x i − x ˉ ) 2 w=\frac{\sum_{i=1}^m(x^i-\bar{x})(y^i-\bar{y})}{\sum_{i=1}^m(x^i-\bar{x})^2} w=i=1m(xixˉ)2i=1m(xixˉ)(yiyˉ)手工详细推导如下:
在这里插入图片描述
在这里插入图片描述

代码实现:

#利用最小二乘法求线性回归i
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签  
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
x = np.array([150,200,250,300,350,400,600])
y = np.array([6450,7450,8450,9450,11450,15450,18450])
plt.scatter(x,y)#打印原始数据
plt.title("原始数据集")
plt.xlabel("X(面积)")
plt.ylabel("Y(价格)")
plt.show()
x_mean=np.mean(x)
y_mean=np.mean(y)
m=len(x)
x_a=0#(xi-x_mean)*(yi-y_mean)
x_b=0#(xi-x_mean)**2
for i in range(m):
    x_a+=(x[i]-x_mean)*(y[i]-y_mean)
    x_b+=(x[i]-x_mean)**2
w=x_a/x_b
b=y_mean-w*x_mean
print("单变量线性回归函数为y={} x + {}".format(w,b))
#画线性函数
plt.scatter(x,y)
lx=np.linspace(0,600)
ly=w*lx+bplt.plot(lx,ly)
plt.title("原始数据集")
plt.xlabel("X(面积)")
plt.ylabel("Y(价格)")
plt.show()

在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

chp的博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值