大数据HCIE成神之路之数学(4)——最优化实验

news2024/12/23 9:29:57

最优化实验

    • 1.1 最小二乘法实现
      • 1.1.1 算法介绍
      • 1.1.2 代码实现
    • 1.2 梯度下降法实现
      • 1.2.1 算法介绍
      • 1.2.2 代码实现
    • 1.3 拉格朗日乘子法
      • 1.3.1 实验
      • 1.3.2 实验操作步骤

1.1 最小二乘法实现

1.1.1 算法介绍

最小二乘法(Least Square Method),做为分类回归算法的基础,有着悠久的历史。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的参数,并使得预测的数据与实际数据之间误差的平方和为最小。

通俗地解释:最小二乘法是一种数学方法,它可以帮助我们找到一条直线,使得这条直线与一些散点数据的距离之和最小。这就像是在一堆点中找到一条最合适的线,使得这条线与所有点的距离之和最小。

1.1.2 代码实现

代码输入:

import numpy as np  
import scipy as sp  
import pylab as pl  
from scipy.optimize import leastsq  # 引入最小二乘函数  

n = 9  # 多项式次数  

# 定义目标函数:  
def real_func(x):  
	 #目标函数:sin(2*pi*x)
    return np.sin(2 * np.pi * x)  

# 定义多项式函数,用多项式去拟合数据:  
def fit_func(p, x):  
    f = np.poly1d(p)  # 构造一个多项式
    return f(x)  

# 定义残差函数,残差函数值为多项式拟合结果与真实值的差值:  
def residuals_func(p, y, x):  
    ret = fit_func(p, x) - y  # 计算残差
    return ret  

x = np.linspace(0, 1, 9)  # 随机选择9个点作为x  
x_points = np.linspace(0, 1, 1000)  # 画图时需要的连续点  
y0 = real_func(x)  # 目标函数  
y1 = [np.random.normal(0, 0.1) + y for y in y0]  # 在目标函数上添加符合正态分布噪声后的函数  
p_init = np.random.randn(n)  # 随机初始化多项式参数  

# 调用scipy.optimize中的leastsq函数,通过最小化误差的平方和来寻找最佳的匹配函数
#func是一个残差函数,x0是计算的初始参数值,把残差函数中除了初始化以外的参数打包到args中
plsq = leastsq(func=residuals_func, x0=p_init, args=(y1, x))  

print('Fitting Parameters: ', plsq[0])  # 输出拟合参数  

# 绘制图像
pl.plot(x_points, real_func(x_points), label='real')  # 绘制真实函数
pl.plot(x_points, fit_func(plsq[0], x_points), label='fitted curve')  # 绘制拟合函数
pl.plot(x, y1, 'bo', label='with noise')  # 绘制带有噪声的数据点
pl.legend()  # 显示图例
pl.show()  # 显示图像

结果输出:

Fitting Parameters:   [-4.43705803e+03  1.82907420e+04 -3.09056669e+04  2.74461105e+04
 -1.36135812e+04  3.70056478e+03 -5.14095149e+02  3.29570051e+01
 -5.85714263e-02]

可视化图像:
在这里插入图片描述
解释1:

# 定义多项式函数,用多项式去拟合数据:  
def fit_func(p, x):  
    f = np.poly1d(p)  # 构造一个多项式
    return f(x)  

这个函数 fit_func 的作用是计算多项式的值。在这个函数中,np.poly1d(p) 用于构造一个多项式。p 是一个一维数组,代表多项式的系数,从高次项到低次项。例如,如果 p=[1,2,3],那么 np.poly1d(p) 就会构造一个多项式 f(x) = 1*x^2 + 2*x + 3。然后,f(x) 会计算这个多项式在 x 处的值。

举个例子,如果我们有一个二次多项式 f(x) = 2*x^2 + 3*x + 4,我们可以用 p=[2,3,4] 来表示。如果我们想要计算 x=5 时这个多项式的值,我们可以调用 fit_func([2,3,4], 5),这将返回 2*5^2 + 3*5 + 4 = 69。所以,fit_func([2,3,4], 5) 的返回值就是 69,这就是这个函数的作用。

解释2:

plsq = leastsq(func=residuals_func, x0=p_init, args=(y1, x)) 

leastsq 是 SciPy 库中的一个函数,用于执行最小二乘拟合。最小二乘拟合是一种数学优化技术,它通过最小化预测值和实际值之间的平方差来找到数据的最佳函数匹配。

在这段代码中,leastsq 函数有三个参数:

  • func 是计算误差的函数,这里使用的是 residuals_func,它计算的是拟合函数和实际数据之间的差值。
  • x0 是待优化的参数的初始猜测值,这里使用的是 p_init,它是一个随机初始化的多项式参数。代码上面有 p_init = np.random.randn(n) ,n=9,所以p_init将会有9个数的数组。 p_init 其实就是 np.poly1d(p) 函数的参数 p
  • args 是传递给 func 的额外参数,在这里是 (y1, x),其中 y1 是带有噪声的目标函数值,x 是自变量的值。

leastsq 函数会返回两个值,但在这里我们只关心第一个值,即最优参数值,所以我们用 plsq 来接收这个值。

举个例子,假设我们有一组数据 x=[1,2,3,4,5]y=[2.2, 2.8, 3.6, 4.5, 5.1],我们想要找到一个最佳的线性函数 y=ax+b 来拟合这组数据。我们可以先随机初始化 ab 的值,然后调用 leastsq 函数来找到最佳的 ab 值。这就是这段代码的作用,其实上面的args里的y1相当于这个例子里的y,args里的x相当于这个例子的x。

1.2 梯度下降法实现

1.2.1 算法介绍

梯度下降法(gradient descent),又名最速下降法,是求解无约束最优化问题最常用的方法,它是一种迭代方法,每一步主要的操作是求解目标函数的梯度向量,将当前位置的负梯度方向作为搜索方向(因为在该方向上目标函数下降最快,这也是最速下降法名称的由来)。

梯度下降法特点:越接近目标值,步长越小,下降速度越慢。

1.2.2 代码实现

代码输入:

训练集 (x,y) 共5个样本,每个样本点有3个分量 (x0,x1,x2)

# 定义数据集
x = [(1, 0., 3), (1, 1., 3), (1, 2., 3), (1, 3., 2), (1, 4., 4)]  
# 输入数据
y = [95.364, 97.217205, 75.195834, 60.105519, 49.342380]  # 对应的真实值  
epsilon = 0.0001  # 迭代阀值,当两次迭代损失函数之差小于该阀值时停止迭代  
alpha = 0.01  # 学习率
diff = [0, 0]  # 初始化残差
max_itor = 1000  # 最大迭代次数
error1 = 0  # 初始化误差,表示后一次误差,需减去前一次误差看是否在迭代阈值之内,之内则停止迭代
error0 = 0  # 初始化误差,表示前一次误差
cnt = 0  # 初始化迭代计数
m = len(x)  # 数据集大小,m=5

# 初始化参数  
theta0 = 0  
theta1 = 0  
theta2 = 0  

# 开始迭代
while True:  
    cnt += 1  # 迭代计数加1

    # 参数迭代计算(m=5)
    for i in range(m):  
        # 拟合函数为 y = theta0 * x[0] + theta1 * x[1] +theta2 * x[2]  
        # 计算残差,即拟合函数值-真实值  
        diff[0] = (theta0 * x[i][0] 

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

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

相关文章

智能配电箱监控系统

智能配电箱监控系统是一种用于实时监控配电箱运行状态和电能质量的系统。它通过集成应用物联网技术,实现对配电箱的数据采集、整合和处理,从而让工作人员能够远程了解和掌握配电箱的情况。通过电力设备的数字化,依托电易云-智慧电力物联网&am…

JVM 字节码

JVM概述 问题引出 你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM!想解决线上JVM GC问题,但却无从下手。新项目上线,对各种JVM参数设置一脸茫然,直接默认吧&…

Redis安装和部署详细流程

文章目录 一、Windows环境下安装 Redis1.1 下载Redis1.2 启动redis服务器1.3 启动redis客户端1.4 配置环境变量 参考资料 一、Windows环境下安装 Redis windows系统环境下,redis安装方式主要有: zip压缩包方式 https://redis.io/download 或者 https:/…

智慧机场视频监控系统方案:AI智能助力机场智慧运营

一、方案背景 随着人们生活物质水平的上升,人们对机场的需求也日益增多,在民航新建、迁建、扩建机场项目猛增的同时,也需同步配备相应的安防监控系统,以满足民航机场安全管理要求和机场运营业务的高速发展。 二、方案概述 智慧机…

主机的容器化技术介绍

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、什么是容器 容器是一个标准化的单元,是一种轻量级、可移植的软件打包技术,容器将软件代码及其相关依赖打包,使应用程序可以在任何计算介质运行。例如开发人员在自己的…

Sui受邀参加Builder DAO举办的LeadUp The Night活动,畅谈Sui与Move语言

LeadUp the Night是一个定期举办的MeetUp活动,由Builder DAO邀请区块链各方项目开发者、VC担任本活动的讲师。这个活动旨在促进区块链技术的发展和应用,让参与者有机会开发创新的区块链应用,探索区块链技术的潜力。 ​​11月30日受BuilderDA…

全球市场:12个冷门海外媒体推广平台值得尝试

随着互联网的迅猛发展和全球市场的日益融通,跨国企业的海外推广变得越来越重要。大多数企业只关注知名的社交媒体平台和搜索引擎,忽略了一些冷门但价值巨大的海外媒体推广平台。本文将介绍12个冷门的海外媒体推广平台,帮助您进一步扩大全球市…

openGauss学习笔记-135 openGauss 数据库运维-例行维护-检查openGauss健康状态

文章目录 openGauss学习笔记-135 openGauss 数据库运维-例行维护-检查openGauss健康状态135.1 检查办法135.2 操作步骤135.3 异常处理 openGauss学习笔记-135 openGauss 数据库运维-例行维护-检查openGauss健康状态 135.1 检查办法 通过openGauss提供的gs_check工具可以开展o…

《开箱元宇宙》:Madballs 解锁炫酷新境界,人物化身系列大卖

你是否曾想过,元宇宙是如何融入世界上最具代表性的品牌和名人的战略中的?在本期的《开箱元宇宙》 系列中,我们与 Madballs 的战略顾问 Derek Roberto 一起聊聊 Madballs 如何在 90 分钟内售罄 2,000 个人物化身系列,以及是什么原…

一文看懂:库存分析如何做?

在之前的文章中,老李给大家简单介绍了制造业数据分析用到的指标体系和典型分析场景。如果你读过那篇文章,你就会知道制造业主要有两个典型的分析场景,一是库存管理,二是生产管理。虽然老李在之前的文章中提到了这两个场景&#xf…

羊大师提问,为什么吃得越咸越容易出现健康问题?

羊大师提问,为什么吃得越咸越容易出现健康问题? 在现代社会中,有一种追求咸味食物的趋势,许多人都钟爱于吃咸味食物。吃咸味食物往往容易导致健康问题,引发各种疾病。那么为什么吃的越咸越容易生病呢? 今…

对话汪源:数智时代为企业构建新的竞争力,和网易数帆的“为与不为”

CodeWave在内的诸多“主演”正在重新演绎网易数帆,在网易数帆的新故事里,做专业、底层、核心的工具,是其成长至今最核心的底色。 作者|斗斗 编辑|皮爷 出品|产业家 “我希望在中间层能构建一个好的生态。”网易汪源的这句话,让…

连接mysql 出现can‘t connect to server on ‘localhost‘ (10061) 报错

首先确保你自己已经安装了mysql。 如果安装了mysql 还是有问题。我们可以在 任务管理器 》服务 中找Mysql服务。 如果有Mysql 服务,启动服务即可。 如果没有这个服务,需要我们下载服务。具体操作如下 管理员启动终端,找到安装的mysql &…

Flash学习

FLASH介绍 FLASH是常用的,用于存储数据的半导体器件,它具有容量大,可重复擦写,按“扇区/块”擦除、掉电后数据可继续保存的特性。 常见的FLASH有NOR FLASH和NAND FLASH。 NOR和NAND是两种数字门电路,可以简单地认为F…

Android中添加C或C++代码

1、创建cpp目录,用于存放C和C代码。 2、创建CMake构建脚本CMakeLists.txt文件,将其放在cpp目录中。 # Sets the minimum version of CMake required to build the native library. cmake_minimum_required(VERSION 3.22.1)# Declares and names the pro…

Reactor网络线程模型

目录 传统下网络服务模型 事件监听模型 NIO核心概念 单线程Reactor模式 多线程Reactor模式 Kafka 的网络设计 主要概念 类比思维理解 参考文章 传统下网络服务模型 线程太多无法处理大规模请求 事件监听模型 NIO核心概念 nio是实现reactor模式的底层API代码 单…

从登录测试谈测试用例

谈谈登录测试: 可能你会说,“用户登录”这个测试对象也有点太简单了吧,我只要找一个用户,让他在界面上输入用户名和密码,然后点击“确 认”按钮,验证一下是否登录成功就可以了。的确,这构成了一…

联软 IT 安全运维管理软件反序列化漏洞复现

0x01 产品简介 联软科技持续十多年研发的联软IT安全运维管理软件,集网络准入控制、终端安全管理、BYOD设备管理、杀毒管理、服务器安全管理、数据防泄密、反APT攻击等系统于一体,通过一个平台,统一框架,数据集中,实现更…

PHP程序员必备技能:OSS云存储实现教程!

近些年来,云存储的应用越来越广泛,阿里云的OSS云存储服务也在国内市场中占据了一席之地。在此基础上,本文将分享如何使用PHP实现OSS云存储。 首先,我们需要在阿里云官网上注册一个账号并创建一个OSS存储空间。创建步骤在官方文档…

基于SSM的影视创作论坛设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…