机器学习——一元线性回归(算法实现与评估)

一元线性回归是统计学中最基础的回归分析方法,用于建立两个变量之间的线性关系模型。

1. 模型表达式

一元线性回归的数学模型为:


\hat{y}=kx+b

  • \hat{y}:因变量(预测值)
  • x:自变量(输入变量)
  • k:回归系数(斜率),表示xx每增加1单位时\hat{y}的变化量
  • b:截距项,表示当x=0时\hat{y}​的取值

2. 参数估计:最小二乘法

通过最小化预测值与实际值的**残差平方和(RSS)**求解kk和bb:
目标函数


min\sum_{i=1}^{n}\left ( y_{i} -\hat{y}_{i}\right )_{}^{2}=min\sum_{i=1}^{n}\left ( y_{i} -kx_{i}-b\right )_{}^{2}

参数计算公式

  • 斜率k

k=\frac{\sum_{i=1}^{n}\left ( x_{i} -\hat{x}\right )\left ( y_{i} -\hat{y} \right )}{\left ( x_{i} -\hat{x}\right )_{}^{2}}

  • 截距b
  • b=\hat{y}-k\hat{x}

  • 其中,\hat{x}\hat{y}分别表示x和y的样本均值。

3、线性回归模型的评价

(1) MAE(平均绝对误差)

  • 定义:所有样本预测值与真实值之差的绝对值的平均值。
  • 公式

  • MAE=\frac{1}{n}\sum_{i=1}^{n}\left | y_{i} -\hat{y}\right |
  • 特点
    • 单位与因变量一致,便于直观理解(如房价预测中的“万元”)。
    • 对异常值不敏感,适用于需避免大误差惩罚的场景(如稳健预测)。
    • 无法反映误差方向,仅衡量平均偏差大小

(2) MSE(均方误差)

  • 定义:预测值与真实值之差的平方和的均值。
  • 公式
  • MAE=\frac{1}{n}\sum_{i=1}^{n}\left ( y_{i}-\hat{y} \right )_{}^{2}
  • 特点
    • 单位是原变量的平方(如“万元²”),解释性较差,但数学性质优良(连续可导)。
    • 对异常值敏感,大误差会被放大,适用于需强调大误差的场景(如金融风险预测)。

(3) RMSE(均方根误差)

  • 定义:MSE的平方根,将误差单位还原为原变量单位。
  • 公式

RMSE=\sqrt{MSE}

  • 特点
    • 结合了MSE和MAE的优点:单位直观且对大误差敏感56。
    • 常用于实际业务中(如房价预测误差表示为“5万美元”)

(4) R²(决定系数)

  • 定义:模型解释因变量方差的比例,衡量拟合优度。
  • 公式
  • ^{R_{}^{2}}=1-\frac{\left (y_{i} -\hat{y_{i}} \right )_{}^{2}}{\left (y_{i} -\bar{y} \right )_{}^{2}}
     
  • 特点
    • 取值范围[0,1]:越接近1,模型解释力越强;0表示模型不优于均值预测。
    • 无量纲性:不受数据量纲影响,适合跨数据集比较模型性能。
    • 局限性:样本量小时可能高估拟合效果,且不直接反映误差大小。

4、代码实现

(1)、手动实现线性回归

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt###准备数据集#加载boston(波士顿房价)数据集
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]x = data[:,5]
y = targetx = x[y<50]
y = y[y<50]#显示
plt.scatter(x,y)
plt.show()#划分数据集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 0)plt.scatter(x_train, y_train)
plt.show()###一元线性回归
def fit(x, y):a_up = np.sum((x-np.mean(x))*(y - np.mean(y)))a_bottom = np.sum((x-np.mean(x))**2)a = a_up / a_bottomb = np.mean(y) - a * np.mean(x)return a, b
a, b = fit(x_train, y_train)
print(a,b) #结果:(8.056822140369603, -28.49306872447786)#训练回归线
plt.scatter(x_train, y_train)
plt.plot(x_train, a*x_train+ b, c='r')
plt.show()#测试回归线
plt.scatter(x_test, y_test)
plt.plot(x_test, a*x_test+ b, c='r')
plt.show()

(2)、sklearn 实现一元线性回归

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt #准备数据集
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]x=data[:,5]
y=target x=x[y<50]
y=y[y<50]#划分数据集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 0)#实现回归from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()lin_reg.fit(x_train.reshape(-1,1), y_train)y_predict = lin_reg.predict(x_test.reshape(-1,1))plt.scatter(x_test, y_test)
plt.plot(x_test, y_predict, c='r')
plt.show()

(3)、sklearn 实现多元线性回归(注意多元不用归一化)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt #准备数据集
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]x=data
y=target x=x[y<50]
y=y[y<50]#划分数据集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 0)#实现回归from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()lin_reg.fit(x_train, y_train)lin_reg.score(x_test, y_test) #结果:0.7455942658788952

5、模型评价

import numpy as np
import pandas as pd
from sklearn import datasets
import matplotlib.pyplot as plt###数据准备data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep=r"\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]x=data[:, -1].reshape(-1, 1) 
y=target.reshape(-1, 1) from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 0)###实现一元线性回归from sklearn.linear_model import LinearRegression
linearReg = LinearRegression()
#适配数据
model = linearReg.fit(x_train, y_train)
#得到预测函数
y_predict = model.predict(x_test)
#显示
plt.scatter(x_test, y_test, s = 10)
plt.plot(x_test, y_predict, c = 'r')
plt.show()### MSEy_real = y_test
mse = np.sum((y_real - y_predict) ** 2) / len(y_test)
print(mse )#公式计算 39.81715050474416
from sklearn.metrics import mean_squared_error
mean_squared_error(y_real, y_predict)# sklearn计算 39.81715050474416### RMSE
rmse = np.sqrt(mse) 
print(rmse )#公式计算 6.310083240714354
mean_squared_error(y_real, y_predict)# sklearn计算 6.310083240714354### MAE
mae = np.sum(np.abs(y_real - y_predict)) / len(y_test) 
print(mae ) #公式计算 4.4883446998468415
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_real, y_predict) # sklearn计算  4.4883446998468415###R方
r2 = 1 - (np.sum((y_real - y_predict) ** 2)) / (np.sum((y_real - np.mean(y_real)) ** 2))
print(r2)  #公式计算 0.5218049526125568 等效:1 - mse / np.var(y_real)
from sklearn.metrics import r2_score
r2_score(y_real, y_predict)# sklearn计算  0.5218049526125568

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73144.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu下用QEMU模拟运行OpenBMC

1、前言 在调试过程中&#xff0c;安装了很多依赖库&#xff0c;具体没有记录。关于kvm&#xff0c;也没理清具体有什么作用。本文仅记录&#xff0c;用QEMU成功的将OpenBMC跑起来的过程&#xff0c;做备忘&#xff0c;也供大家参考。 2、环境信息 VMware Workstation 15 Pro…

Gradle/Maven 本地仓库默认路径迁移 (减少系统磁盘占用)

Gradle 配置环境变量 GRADLE_USER_HOME&#xff0c;如D:/.gradle同时将 %userprofile%/.gradle 移动到配置路径 Maven 修改settings.xml文件&#xff0c;localRepository同时将 %userprofile%/.m2/repository 移动到配置路径 IDEA默认用的bundle maven, 路径为安装目录下 p…

MinGW与使用VScode写C语言适配

压缩包 通过网盘分享的文件&#xff1a;MinGW.zip 链接: https://pan.baidu.com/s/1QB-Zkuk2lCIZuVSHc-5T6A 提取码: 2c2q 需要下载的插件 1.翻译 找到VScode页面&#xff0c;从上数第4个&#xff0c;点击扩展&#xff08;以下通此&#xff09; 搜索---Chinese--点击---安装--o…

【C++初阶】从零开始模拟实现vector(含迭代器失效详细讲解)

目录 1、基本结构 1.1成员变量 1.2无参构造函数 1.3有参构造函数 preserve()的实现 代码部分&#xff1a; push_back()的实现 代码部分&#xff1a; 代码部分&#xff1a; 1.4拷贝构造函数 代码部分&#xff1a; 1.5支持{}初始化的构造函数 代码部分&#xff1a; …

Java实习生面试题(2025.3.23 be)

一、v-if与v-show的区别 v-show 和 v-if 都是 Vue 中的条件渲染指令&#xff0c;它们的主要区别在于渲染策略&#xff1a;v-if 会根据条件决定是否编译元素&#xff0c;而 v-show 则始终编译元素&#xff0c;只是通过改变 CSS 的 display 属性来控制显示与隐藏。 二、mybatis-…

stm32标准库开发需要的基本文件结构

使用STM32标准库&#xff08;STM32 Standard Peripheral Library&#xff0c;SPL&#xff09;开发时&#xff0c;项目中必须包含一些必要的文件&#xff0c;这些文件确保项目能够正常运行并与MCU硬件交互。以下详细说明&#xff1a; 一、标准库核心文件夹说明 使用标准库开发S…

学生管理系统(需求文档)

需求&#xff1a; 采取控制台的方式去书写学生管理系统 分析&#xff1a; 初始菜单&#xff1a; “----------欢迎来到java学生管理系统----------” “1:添加学生” “2&#xff1a;删除学生” “3&#xff1a;修改学生” “4&#xff1a;查询学生” “5&#xff1a;…

Java算法OJ(13)双指针

目录 1.前言 2.正文 2.1快乐数 2.2盛最多水的容器 2.3有效的三角形的个数 2.4和为s的两个数 2.5三数之和 2.6四数之和 3.小结 1.前言 哈喽大家好吖&#xff0c;今天继续加练算法题目&#xff0c;一共六道双指针&#xff0c;希望能对大家有所帮助&#xff0c;废话不多…

SpringBoot分布式定时任务实战:告别重复执行的烦恼

场景再现&#xff1a;你刚部署完基于SpringBoot的集群服务&#xff0c;凌晨3点突然收到监控告警——优惠券发放量超出预算两倍&#xff01;检查日志发现&#xff0c;两个节点同时执行了定时任务。这种分布式环境下的定时任务难题&#xff0c;该如何彻底解决&#xff1f; 本文将…

MySQL 设置允许远程连接完整指南:安全与效率并重

一、为什么需要远程连接MySQL&#xff1f; 在分布式系统架构中&#xff0c;应用程序与数据库往往部署在不同服务器。例如&#xff1a; Web服务器&#xff08;如NginxPHP&#xff09;需要连接独立的MySQL数据库数据分析师通过BI工具直连生产库多服务器集群间的数据同步 但直接…

系统架构书单推荐(一)领域驱动设计与面向对象

本文主要是个人在学习过程中所涉猎的一些经典书籍&#xff0c;有些已经阅读完&#xff0c;有些还在阅读中。于我而言&#xff0c;希望追求软件系统设计相关的原则、方法、思想、本质的东西&#xff0c;并希望通过不断的学习、实践和积累&#xff0c;提升自身的知识和认知。希望…

动态规划-01背包

兜兜转转了半天&#xff0c;发现还是Carl写的好。 看过动态规划-基础的读者&#xff0c;大概都清楚。 动态规划是将大问题&#xff0c;分解成子问题。并将子问题的解储存下来&#xff0c;避免重复计算。 而背包问题&#xff0c;就是动态规划延申出来的一个大类。 而01背包&…

使用VS2022编译CEF

前提 选择编译的版本 CEF自动编译&#xff0c;在这里可以看到最新的稳定版和Beta版。 从这里得出&#xff0c;最新的稳定版是134.0.6998.118&#xff0c;对应的cef branch是6998。通过这个信息可以在Build requirements查到相关的软件配置信息。 这里主要看Windows下的编译要…

C++20:玩转 string 的 starts_with 和 ends_with

文章目录 一、背景与动机二、string::starts_with 和 string::ends_with&#xff08;一&#xff09;语法与功能&#xff08;二&#xff09;使用示例1\. 判断字符串开头2\. 判断字符串结尾 &#xff08;三&#xff09;优势 三、string_view::starts_with 和 string_view::ends_w…

智能飞鸟监测 守护高压线安全

飞鸟检测新纪元&#xff1a;视觉分析技术的革新应用 在现代化社会中&#xff0c;飞鸟检测成为了多个领域不可忽视的重要环节。无论是高压线下的安全监测、工厂内的生产秩序维护&#xff0c;还是农业区的作物保护&#xff0c;飞鸟检测都扮演着至关重要的角色。传统的人工检测方…

ADC噪声全面分析 -04- 有效噪声带宽简介

为什么要了解ENBW&#xff1f; 了解模数转换器 (ADC) 噪声可能具有挑战性&#xff0c;即使对于最有经验的模拟设计人员也是如此。 Delta-sigma ADC 具有量化和热噪声的组合&#xff0c;这取决于 ADC 的分辨率、参考电压和输出数据速率 (ODR)。 在系统级别&#xff0c;额外的信…

STM32单片机uCOS-Ⅲ系统10 内存管理

目录 一、内存管理的基本概念 二、内存管理的运作机制 三、内存管理的应用场景 四、内存管理函数接口讲解 1、内存池创建函数 OSMemCreate() 2、内存申请函数 OSMemGet() 3、内存释放函数 OSMemPut() 五、实现 一、内存管理的基本概念 在计算系统中&#xff0c;变量、中…

考研课程安排(自用)

文章目录 408数据结构&#xff08;王道&#xff09;计算机组成原理&#xff08;王道&#xff09;操作系统&#xff08;王道&#xff09;计算机网络&#xff08;湖科大版&#xff09; 数学一高等数学&#xff08;微积分&#xff09;线性代数和概率论 408 数据结构&#xff08;王…

ultraiso制作u盘启动

UltraISO制作U盘启动盘的方法 UltraISO是一款功能强大的工具&#xff0c;可以帮助用户将ISO镜像文件写入U盘&#xff0c;从而制作成可启动的系统安装盘。以下是详细的步骤和注意事项&#xff1a; 1. ‌准备工作‌ ‌硬件准备‌&#xff1a;一个容量至少为8GB的U盘&#xff0…

C语言-发布订阅模式详解与实践

文章目录 C语言发布订阅模式详解与实践1. 什么是发布订阅模式&#xff1f;2. 为什么需要发布订阅模式&#xff1f;3. 实际应用场景4. 代码实现4.1 UML 关系图4.2 头文件 (pubsub.h)4.3 实现文件 (pubsub.c)4.4 使用示例 (main.c) 5. 代码分析5.1 关键设计点5.2 实现特点 6. 编译…