机器学习算法之回归算法

news2024/11/6 13:28:10

一、回归算法思维导图

在这里插入图片描述

二、算法概念、原理、应用场景和实例代码

1、线性回归

1.1、概念

  ‌‌线性回归算法是一种统计分析方法,用于确定两种或两种以上变量之间的定量关系。‌ 线性回归算法通过建立线性方程来预测因变量(y)和一个或多个自变量(x)之间的关系。其基本形式为 y = wx + e,其中 w 是权重,x 是自变量,e 是误差项。

1.2、算法原理

   线性回归算法的核心在于找到最佳的拟合直线,使得预测值与实际值之间的误差最小。这通常通过最小二乘法来实现,即最小化预测值与实际值之差的平方和。线性回归可以分为一元线性回归和多元线性回归:
(1)一元线性回归‌:只有一个自变量 x 和一个因变量 y。 ‌(2)多元线性回归‌:有多个自变量 x1, x2, …, xn 和一个因变量 y。

1.3、应用场景

   线性回归算法广泛应用于各个领域,包括但不限于: (1)‌经济学‌:预测股票价格、经济增长等。 ‌
(2)医学‌:预测疾病发病率、药物效果等。
(3)环境科学‌:预测气候变化、污染水平等。 ‌
(4)市场营销‌:预测销售量、市场份额等。

1.4、公式推导

  线性回归方程的推导过程包括以下几个步骤: ‌
(1)计算平均值‌:分别计算 x 和 y 的平均值。
(2)计算分子和分母‌:使用最小二乘法计算回归系数 b 和 a。 ‌
(3)建立方程‌:最终得到线性回归方程 y = bx + a,其中 b 是斜率,a 是截距。

1.5、实例分析

  假设有一组数据点 (x1, y1), (x2, y2), …, (xn, yn),线性回归的目标是找到一条直线 y = bx + a,使得所有数据点到这条直线的垂直距离的平方和最小。通过最小二乘法,可以求解出最佳的 b 和 a 值,从而得到具体的线性回归方程。

1.6、具体代码
鸢尾花数据集介绍

    该数据集包含了三个品种的鸢尾花(Setosa、Versicolor、Virginica)每个品种各有50个样本,共计150个样本。对于每个样本,测量了4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度),以及其所属的品种标签。

    数据集包括4个属性,分别为花萼的长、花萼的宽、花瓣的长和花瓣的宽。对花瓣我们可能比较熟悉,花萼是什么呢?花萼是花冠外面的绿色被叶,在花尚未开放时,保护着花蕾。四个属性的单位都是cm,属于数值变量,四个属性均不存在缺失值的情况,字段如下表所示:

在这里插入图片描述

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
import matplotlib

# 设置字体为SimHei,确保该字体在你的系统中存在
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题

# 加载鸢尾花数据集
def LoadIrisDataset():
  # 1.加载鸢尾花数据集
  iris = datasets.load_iris()
  X = iris.data  # 特征数据,包含所有样本的4个特征
  y = iris.target  # 目标变量,目前我们只使用第一个目标(0-1-2类)
  # 2.我们选择使用一个特征来进行线性回归,例如花瓣长度
  X = X[:, [2]]  # 选择第三个特征:花瓣长度
  # 3.将数据集分为训练集和测试集
  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  # 4.创建线性回归模型
  model = LinearRegression()
  # 5.训练模型
  model.fit(X_train, y_train)
  # 6.预测测试集的结果
  y_pred = model.predict(X_test)
  # 7.评估模型性能
  mse = mean_squared_error(y_test, y_pred)
  r2 = r2_score(y_test, y_pred)
  # 8.模型评估
  print(f"系数(斜率): {model.coef_[0]}")
  print(f"截距: {model.intercept_}")
  print(f"均方误差 (MSE): {mse}")
  print(f"决定系数 (R²): {r2}")
  return X_test, y_test, y_pred


# 二、绘制回归结果
def PlotResults(X_test, y_test, y_pred):
  plt.scatter(X_test, y_test, color="black", label="Data")
  plt.plot(X_test, y_pred, color="blue", linewidth=3, label="Linear Regression")
  plt.xlabel("花瓣长度 (cm)")
  plt.ylabel("目标值")
  plt.title("线性回归模型预测鸢尾花数据集")
  plt.legend()
  plt.show()

if __name__ == "__main__":
  X_test, y_test, y_pred = LoadIrisDataset()
  PlotResults(X_test, y_test, y_pred)

控制台输出结果为:
在这里插入图片描述

在这里插入图片描述

2、岭回归

2.1、概念

岭回归(英文名:ridge regression, Tikhonov regularization)是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。

2.2、算法原理

在这里插入图片描述

2.3、应用场景

(1)经济学:用于经济数据建模,以预测经济变量之间的关系。
(2)生物统计学:用于基因表达分析和生物信息学领域,以处理高维数据。
(3)工程学:用于工程建模和控制系统设计,以改善模型的鲁棒性。
(4)金融学:用于资产定价和风险管理,以降低投资组合的风险。

2.4、实例分析

这段代码实现了以下功能:
(1). 创建了一个具有10个特征的示例数据集,其中包含100个样本。
(2).将数据集划分为训练集和测试集,其中80%的数据用于训练,20%用于测试。
(3).使用scikit-learn库中的Ridge类定义了岭回归模型,并指定了岭参数(alpha)为1.0。
(4).在训练集上训练了岭回归模型。
(5).在测试集上进行了预测,并计算了预测结果与真实值之间的均方误差(MSE)。
(6).最后,绘制了预测值与真实值的对比图,以直观地展示模型的性能。

# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error


def TrainRidgeModel():
  # 1.创建示例数据集
  np.random.seed(0)
  X = np.random.rand(100, 10)  # 100个样本,10个特征
  y = 2 * X[:, 0] + 3 * X[:, 1] + np.random.randn(100)  # 构造线性关系,并添加噪声
  # 2.将数据集划分为训练集和测试集
  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  # 3.定义岭回归模型
  ridge = Ridge(alpha=1.0)  # alpha为岭参数,默认为1.0
  # 4.在训练集上训练模型
  ridge.fit(X_train, y_train)
  # 5.在测试集上进行预测
  y_pred = ridge.predict(X_test)
  # 6.计算均方误差(MSE)作为性能评估指标
  mse = mean_squared_error(y_test, y_pred)
  print("岭回归模型的均方误差为:", mse)
  return y_test, y_pred


def PlotPredictions(y_test, y_pred):
  # 1.绘制预测值与真实值的对比图
  plt.figure(figsize=(8, 6))
  plt.scatter(y_test, y_pred, color='blue')
  plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], linestyle='--', color='red')
  plt.xlabel('True Values')
  plt.ylabel('Predictions')
  plt.title('True vs. Predicted Values (Ridge Regression)')
  plt.show()
  

if __name__ == '__main__':
  y_test, y_pred = TrainRidgeModel()
  PlotPredictions(y_test, y_pred)

控制台输出结果为:
在这里插入图片描述

在这里插入图片描述

3、Lasso回归

3.1、概念

岭回归是一种正则化技术,用于处理多重共线性问题。在标准线性回归中,模型试图找到最小化残差平方和的参数。然而,在存在高度相关特征的情况下,最小二乘估计可能会变得不稳定。为了克服这个问题,岭回归通过向损失函数添加一个惩罚项(即L2正则化项),使得模型系数变得更小,从而降低了过拟合的风险。

岭回归的目标函数是:
在这里插入图片描述
其中,λ 是正则化参数,控制着惩罚的强度。

特点:
(1).正则化类型: 使用L2正则化,也称为权重衰减。
(2).系数收缩: 岭回归通过添加平方项来收缩系数,但不会将它们缩减至零。
(3).多共线性处理: 对于具有多重共线性的数据集非常有效,因为它可以稳定系数估计。
(4).参数调整:正则化参数(λ)的选取对于模型性能至关重要。

3.2、应用场景

当数据集中存在高度相关的特征时。
当特征数量较大,但样本数量相对较少时。
当我们关心模型的解释性,而不是特征选择时。

3.3、实例分析
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Lasso
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
import matplotlib

# 设置字体为SimHei,确保该字体在你的系统中存在
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题

def LoadIrisAndPredict():
  # 1.加载鸢尾花数据集
  iris = datasets.load_iris()
  X = iris.data  # 特征数据,包含所有样本的4个特征
  y = iris.target  # 目标变量,目前我们只使用第一个目标(0-1-2类)
  # 2.我们选择使用一个特征来进行Lasso回归,例如花瓣长度
  X = X[:, [2]]  # 选择第三个特征:花瓣长度
  # 3.将数据集分为训练集和测试集
  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  # 4.创建Lasso回归模型
  lasso_model = Lasso(alpha=1.0)  # alpha是正则化强度
  # 5.训练模型
  lasso_model.fit(X_train, y_train)
  # 6.预测测试集的结果
  y_pred = lasso_model.predict(X_test)
  # 7.评估模型性能
  mse = mean_squared_error(y_test, y_pred)
  r2 = r2_score(y_test, y_pred)
  print(f"系数(斜率): {lasso_model.coef_[0]}")
  print(f"截距: {lasso_model.intercept_}")
  print(f"均方误差 (MSE): {mse}")
  print(f"决定系数 (R²): {r2}")
  return X_test, y_test, y_pred


# 可视化结果
def VisualizeResults(X_test, y_test, y_pred):
  plt.scatter(X_test, y_test, color="black", label="Data")
  plt.plot(X_test, y_pred, color="blue", linewidth=3, label="Lasso Regression")
  plt.xlabel("花瓣长度 (cm)")
  plt.ylabel("目标值")
  plt.title("Lasso回归模型预测鸢尾花数据集")
  plt.legend()
  plt.show()


if __name__ == "__main__":
  X_test, y_test, y_pred = LoadIrisAndPredict()
  VisualizeResults(X_test, y_test, y_pred)

运行结果为:
在这里插入图片描述

在这里插入图片描述

4、弹性网回归

4.1、概念

弹性网络回归(Elastic Net Regression)是‌岭回归(Ridge Regression)和‌Lasso回归(Lasso Regression)的结合。它通过引入两个正则化参数来实现特征选择和模型稳定性。弹性网络回归的损失函数结合了L1正则化和L2正则化,解决了Lasso在处理高相关特征时的缺陷,并且在处理高维数据时表现优异。

4.2、算法原理

在这里插入图片描述

4.3、应用场景和优势

弹性网络回归在处理多重共线性和特征选择方面特别有用。它结合了岭回归和Lasso回归的优点,适用于高维数据集,能够自动选择最重要的特征,同时保持模型的稳定性。弹性网络回归在‌生物信息学、‌金融数据分析等领域有广泛应用。

4.4、实例分析
在这里插入代码片

在这里插入图片描述
在这里插入图片描述

5、ARIMA

5.1、概念

ARIMA(AutoRegressive Integrated Moving Average)是一种用于时间序列预测的统计方法。它结合了自回归(Autoregressive, AR)、差分(Integrated,I)和移动平均(Moving Average, MA)三个部分,以建模和预测时间序列数据。

5.2、算法原理

(1)检查平稳性:首先需要确保时间序列数据是平稳的。如果数据不是平稳的,则需要通过差分使其变得平稳。
(2)确定参数 p、d 和 q:
1)选择合适的自回归阶数 ( p )。
2)确定使数据平稳所需的差分阶数 ( d )。
3)选择合适的移动平均阶数 ( q )。
(3)模型拟合:使用确定的参数进行模型拟合,以最小化预测误差。
(4)模型验证和评估:通过残差分析、AIC/BIC准则等方法来评估模型的性能,并进行必要的调整。

5.3、应用场景

(1)金融市场 股票价格预测:利用历史股价数据预测未来的股价走势。 汇率变动预测:通过观察历史汇率数据来预测未来汇率的变化。
(2)宏观经济分析 通货膨胀率预测:根据过去的通胀数据,预测未来的通货膨胀趋势。
GDP增长率预测:利用历史的经济数据来预测国家或地区的经济增长情况。
(3) 供应链管理
库存预测:通过历史销售数据来预测未来的需求量,从而更好地进行库存管理和优化。 生产计划制定:根据历史生产和销售数据来调整未来的生产计划。
(4)气象和环境科学 温度变化预测:利用过去的气温数据来预测未来几天或几周的天气情况。
空气质量预测:通过分析历史空气质量数据,预测未来的空气污染程度。
(5)销售预测
产品销量预测:根据过去的产品销售数据来预测未来的销售额,从而更好地进行库存管理和营销策略制定。

5.4、算法实例

假设我们有一个时间序列数据集,并且经过检验发现该数据是不平稳的。我们可以先应用一阶差分使其变得平稳(即 ( d = 1 )),然后选择合适的( p ) 和 ( q ) 值。假设通过试错法确定了 ( (p, d, q) = (2, 1, 2) ),那么模型可以表示为 ARIMA(2, 1, 2)。

使用Python实现ARIMA 在Python中,你可以使用statsmodels库来实现ARIMA模型。以下是一个简单的示例:

import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
import matplotlib.pyplot as plt
import matplotlib

# 设置字体为SimHei,确保该字体在你的系统中存在
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题


def LoadIrisData():
  # 1.假设我们有一个时间序列数据集
  data = pd.read_csv('time_series_data.csv', parse_dates=['date'], index_col='date')
  data.index.freq = 'D'  # 设置频率为每天
  # 2.检查数据平稳性并进行差分
  diff_data = data.diff().dropna()
  # 3.确定参数 p, d, q
  model = ARIMA(data, order=(2, 1, 2))
  results = model.fit()
  print(results.summary())
  # 4.预测未来值
  forecast_steps = 10
  forecast = results.get_forecast(steps=forecast_steps)
  mean_forecast = forecast.predicted_mean
  conf_int = forecast.conf_int()
  return data, mean_forecast, conf_int


# 绘制预测结果
def PlotForecast(data, mean_forecast, conf_int):
  plt.figure(figsize=(14, 7))
  plt.plot(data, label='Original Data')
  plt.plot(mean_forecast.index, mean_forecast.values, color='red', label='Forecast')
  plt.fill_between(conf_int.index, conf_int.iloc[:, 0], conf_int.iloc[:, 1], color='pink', alpha=0.3)
  plt.legend()
  plt.show()


if __name__ == '__main__':
  data, mean_forecast, conf_int = LoadIrisData()
  PlotForecast(data, mean_forecast, conf_int)

运行结果如下:
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

SpringBoot项目如何设置定时任务总开关

目录 方法一:使用Spring Profiles 1.1 步骤1 1.2 步骤2 1.3 步骤3 1.4 步骤4 方法二:使用ConditionalOnProperty 2.1 步骤1 2.2 步骤2 2.3 步骤3 方法三: 主启动类禁用EnableScheduling 定时任务原理剖析(选看&#xf…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21目录1. The Fair Language Model Paradox摘要研究背景问题与挑战如何解决创新点算法模型实验效果重要数据与结论推荐阅读指数&…

Python——实时域名通信状态监控

在互联网时代,网站和在线服务的可用性对于个人和企业都至关重要。域名的通信状态直接关系到服务的可达性,因此,实时监控域名的通信状态成为了一项基本需求。本文将详细介绍一个使用Python编写的简单域名通信状态监控工具,该工具能…

vue vxeui 上传组件 vxe-upload 全局配置上传方法,显示上传进度,最完美的配置方案

Vxe UI 上传组件 vxe-upload 全局配置上传方法,显示上传进度,最完美的配置方案 正常使用上传组件 vxe-upload,都是在用的时候传自定义上传方法,然后进行处理。几个页面是没什么问题,当系统页面非常多的时候&#xff0…

springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38819)

刚解决Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38816)没几天,又来一个新的,真是哭笑不得啊。 springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38816)https://blog.csdn.ne…

SSH登录介绍

说明:一般登录服务器,我们可以用远程连接工具,如XShell、Windterm等,或者通过公司搭建的JumpServer(跳板机、堡垒机)来连接。前者是点对点登录,输入主机、端口,通过SSH协议登录&…

Unity计算二维向量夹角余弦值和正弦值的优化方法参考

如果不考虑优化问题,计算两个向量的余弦值或者正弦值可以直接使用类似的方法: [SerializeField] Vector2 v1, v2;void Start() {float valCos Mathf.Acos(Vector2.SignedAngle(v1, v2));float valSin Mathf.Asin(Vector2.SignedAngle(v1, v2)); } 但是…

理解 CSS 中的绝对定位与 Flex 布局混用

理解 CSS 中的绝对定位与 Flex 布局混用 在现代网页设计中,CSS 布局技术如 flex 和绝对定位被广泛使用。然而,这两者结合使用时,可能会导致一些意想不到的布局问题。本文将探讨如何正确使用绝对定位元素,避免它们受到 flex 布局的…

JAVA力扣每日一题:P3216. 交换后字典序最小的字符串

本题来自&#xff1a;力扣-每日一题 力扣 (LeetCode) 全球极客挚爱的技术成长平台https://leetcode.cn/ 题解&#xff1a; class Solution {public String getSmallestString(String s) {int len s.length();int[] arr new int[len];for (int i 0; i < len; i) {arr[i…

Vue3 学习笔记(十二)侦听器详解

在 Vue 3 中&#xff0c;侦听器是一种响应式特性&#xff0c;允许你观察和响应 Vue 实例上的数据变动。Vue 提供了 watch 和 watchEffect 两个函数来创建侦听器。 1、watch 侦听器 watch 是一个用于侦听特定数据源变化的函数。它允许你指定一个或多个数据源&#xff0c;并在这些…

#渗透测试#SRC漏洞挖掘# 信息收集-常见端口及谷歌语法

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

SAP ABAP开发学习——第一代增强(包含增强演示)

​​​​​​SAP ABAP开发学习——第二代增强&#xff08;包含增强演示&#xff09;-CSDN博客 SAP ABAP开发学习——第三代增强&#xff08;BADI)-CSDN博客 概念 第一代增强(增强嵌入标准程序中) 第一代出口-User exit 以SD用户出口为例 SD及MM较多的程序都是基于源码控制来…

安宝特分享 | AR技术引领:跨国工业远程协作创新模式

在当今高度互联的工业环境中&#xff0c;跨国合作与沟通变得日益重要。然而&#xff0c;语言障碍常常成为高效协作的绊脚石。安宝特AR眼镜凭借其强大的多语言自动翻译和播报功能&#xff0c;正在改变这一局面&#xff0c;让远程协作变得更加顺畅。 01 多语言翻译优势 安宝特A…

动态规划 01背包(算法)

现有四个物品&#xff0c;小偷的背包容量为8&#xff0c;怎么可以偷得价值较多的物品 如: 物品编号&#xff1a; 1 2 3 4 物品容量&#xff1a; 2 3 4 5 物品价值&#xff1a; 3 4 5 8 记f(k,w) ,当背包容量为w,可以偷k件物品…

AWD挨打记录

前言 昨天参加了星盟的AWD集训&#xff0c;本来寻思能猛猛乱杀&#xff0c;结果加固时间只有20分钟&#xff0c;WAF还没push上去就被三家上了不死马QAQ cms是站帮主&#xff0c;之前没打过&#xff0c;D盾啥也没扫出来&#xff0c;还寻思是个贼安全的系统&#xff0c;结果洞满…

InstructIR: High-Quality Image Restoration Following Human Instructions 论文阅读笔记

这是Radu大佬所在的Wrzburg大学的computer vision lab实验室发表在ECCV2024上的一篇论文&#xff0c;代码开源。文章提出了一种文本引导的All-in-One的restoration模型&#xff0c;如下图所示&#xff1a; 这个工作其实跟"InstructPix2Pix: Learning to Follow Image Edit…

libavdevice.so.58: cannot open shared object file: No such file ordirectory踩坑

博主是将大图切分成小图时遇到 问题一、linux编译后&#xff0c;找不到ffmpeg中的一个文件 产生原因&#xff0c;各种包集成&#xff0c;然后安装以后乱七八糟&#xff0c;甚至官方的教程也不规范导致没有添加路径到系统文件导致系统执行的时候找不到 1.下载 博主进行的离线…

【SQL实验】表的更新和简单查询

完整代码在文章末尾 在上次实验创建的educ数据库基础上&#xff0c;用SQL语句为student表、course表和sc表中添加以下记录 【SQL实验】数据库、表、模式的SQL语句操作_创建一个名为educ数据库,要求如下: (下面三个表中属性的数据类型需要自己设计合适-CSDN博客在这篇博文中已经…

UHF机械高频头的知识和待学习的疑问

电路图如上所示&#xff1a; 实物开盖清晰图如下&#xff1a; 待学习和弄懂的知识&#xff1a; 这是一个四腔的短路线谐振。分别是输入调谐&#xff0c;放大调谐&#xff0c;变频调谐和本振 第一个原理图输入为75欧&#xff08;应该是面向有同轴线的天线了&#xff09;如下图…

学习路之TP6--workman安装

一、安装 首先通过 composer 安装 composer require topthink/think-worker 报错&#xff1a; 分析&#xff1a;最新版本需要TP8&#xff0c;或装低版本的 composer require topthink/think-worker:^3.*安装后&#xff0c; 增加目录 vendor\workerman vendor\topthink\think-w…