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

2023-12-01 04:15

本文主要是介绍大数据HCIE成神之路之数学(4)——最优化实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最优化实验

    • 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] 

这篇关于大数据HCIE成神之路之数学(4)——最优化实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/439763

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

uva 11044 Searching for Nessy(小学数学)

题意是给出一个n*m的格子,求出里面有多少个不重合的九宫格。 (rows / 3) * (columns / 3) K.o 代码: #include <stdio.h>int main(){int ncase;scanf("%d", &ncase);while (ncase--){int rows, columns;scanf("%d%d", &rows, &col