简单线性回归(最小二乘法)___一元线性回归

本文通过Python的numpy和matplotlib库实现了一元线性回归的简单线性回归模型,使用最小二乘法进行参数估计。首先导入数据,然后定义损失函数和拟合函数,接着测试得到的回归参数,并绘制散点图及拟合曲线,展示模型效果。
摘要由CSDN通过智能技术生成

数据集:

https://share.weiyun.com/0HqbLhXz

0. 引入依赖

import numpy as np 
import matplotlib.pyplot as plt

1. 导入数据(data.csv)

在这里插入图片描述

points = np.genfromtxt('data.csv', delimiter=',')

#points

#取出第0行,第0列。
# points[0,0]
# print(points[0,0])

# 提取points中的两列数据,分别作为x,y
# :代表所有的
x = points[:, 0]    #x要取所有行的第0列
y = points[:, 1]  # y要取所有行的第1列


# # 用plt画出散点图
plt.scatter(x, y)  # 然后以每个x,y来在坐标对应出一个散点。
plt.show()

在这里插入图片描述

2. 定义损失函数

# 损失函数是系数的函数,另外还要传入数据的x,y
def compute_cost(w, b, points):
    total_cost = 0
    M = len(points)
    
    # 逐点计算平方损失误差,然后求平均数
    for i in range(M):
        x = points[i, 0]
        y = points[i, 1]
        total_cost += ( y - w * x - b ) ** 2
    
    return total_cost/M

3.定义算法拟合函数

# 先定义一个求均值的函数
def average(data):
    sum = 0
    num = len(data)
    for i in range(num):
        sum += data[i]
    return sum/num
        
# 定义核心拟合函数
def fit(points):
    M = len(points)
    x_bar = average(points[:, 0])
    
    sum_yx = 0
    sum_x2 = 0
    sum_delta = 0
    
    for i in range(M):
        x = points[i, 0]
        y = points[i, 1]
        sum_yx += y * ( x - x_bar )
        sum_x2 += x ** 2
    # 根据公式计算w
    w = sum_yx / ( sum_x2 - M * (x_bar**2) )
    
    for i in range(M):
        x = points[i, 0]
        y = points[i, 1]
        sum_delta += ( y - w * x )
    b = sum_delta / M
    
    return w, b

4. 测试

w, b = fit(points)

print("w is: ", w)
print("b is: ", b)

cost = compute_cost(w, b, points)

print("cost is: ", cost)

在这里插入图片描述

5. 画出拟合曲线

plt.scatter(x, y)
# 针对每一个x,计算出预测的y值
pred_y = w * x + b

plt.plot(x, pred_y, c='r')
plt.show()

在这里插入图片描述

一元线性回归的目标是找到一条直线来拟合数据,使得拟合线距离数据点的误差最小化。最小二乘法是一种常见的用来求解线性回归参数的方法。 假设我们有一组数据集合 {(x1, y1), (x2, y2), ..., (xn, yn)},其中 xi 是自变量,yi 是因变量。一元线性回归模型可以表示为 y = β0 + β1*x,其中 β0 和 β1 是待求的参数。 最小二乘法的目标是找到使得误差平方和最小化的参数值。我们定义误差 e = y - (β0 + β1*x),其中 e 是实际值与预测值之间的差异。我们将误差平方和定义为损失函数,即 L = ∑(e^2) = ∑((y - (β0 + β1*x))^2)。我们的目标是最小化损失函数 L。 为了求解最小二乘法的参数,我们需要对损失函数 L 进行优化。我们可以通过对 β0 和 β1 分别求导,令导数为 0,从而得到参数的闭式解。 首先对 β0 求导: ∂L/∂β0 = -2∑(y - (β0 + β1*x)) 令导数为 0,得到: ∑y - n*β0 - β1*∑x = 0 解出 β0,得到: β0 = (∑y - β1*∑x)/n 然后对 β1 求导: ∂L/∂β1 = -2∑x(y - (β0 + β1*x)) 令导数为 0,得到: ∑xy - β0*∑x - β1*∑(x^2) = 0 将 β0 的值代入上式,得到: ∑xy - (∑y - β1*∑x)/n * ∑x - β1*∑(x^2) = 0 整理后可得: ∑xy - (∑x*∑y)/n = β1*(∑(x^2) - (∑x)^2/n) 解出 β1,得到: β1 = (∑xy - (∑x*∑y)/n) / (∑(x^2) - (∑x)^2/n) 至此,我们得到了一元线性回归最小二乘法的参数推导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值