[数值计算-16]:最小二乘法的求解1 - 一元二次方程解析法求解

2023-11-04

作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119978799


目录

第1章 什么是函数逼近?

1.1 抛出问题1:函数插值

1.2  抛出问题2:函数拟合

1.3  什么是回归

第2章 函数拟合

2.1 插值有时候插值并不是最好的选择

2.2 什么函数拟合

 2.2 函数拟合的基本步骤

第3章 最小二乘法的一元2次方程解析法求解

3.1 什么是最小二乘法

3.2 线性拟合函数的最小二乘法的几何意义

3.3 最小二乘算法实现

3.4 最小二乘法求解1:一元参数的解析法求解

第4章 最小二乘法求解1:解析法求解的代码示例

4.0 前置条件:

4.1 步骤1:构建样本数据集

4.2 步骤2:构建拟合函数

4.3 步骤3:构建最小二乘的残差函数,并计算最佳参数(最关键步骤)

4.4 步骤4:利用拟合函数进行数据预测

4.5 步骤5:图形展示




第1章 什么是函数逼近?

1.1 抛出问题1:函数插值

利用有限的样本数据,发现其内在的规律,并用这个规律预测未来新的数据。

(1)单个数据点

  • 0次函数通过样本点:唯一确定一个点 y = f(x) = a0
  • 1次直线函数通过样本点:可以有无数 y = f(x) = a1x + a0
  • 2次抛物线函数通过样本点:可以有无数 y = f(x) = a1x^2 + a1x + a0

(2)2个数据点

  • 0次函数通过样本点:无
  • 1次直线函数通过样本点:唯一直线 y = f(x) = a1x + a0
  • 2次抛物线函数通过样本点:可以有无数 y = f(x) = a1x^2 + a1x + a0

(3)3个数据点

  • 0次函数通过样本点:无
  • 1次直线函数通过样本点:无
  • 2次抛物线函数通过样本点:唯一抛物线y = f(x) = a1x^2 + a1x + a0

问题:

如果有(xn+1,yn+1), (xn,yn)........(x1,y1), (x0,y0)样本点,那么如何选择一个最低次的多项式函数,可以穿过上述样本点?

推测:

对应n+1个点,可以唯一的确定一个一元n次的多项式函数,该多项式函数可以穿越所有n+1个点。

1.2  抛出问题2:函数拟合

如果有n个点,不要求选出的函数穿越所有的点,而是根据这些点构建的轮廓,选择一个更低维度(次数)的函数尽可能的靠近这些样本点呢?

 当函数的次数远远小于样本点的次数是,该如何选择低次的函数?

1.3  什么是回归

回归与拟合是基本相同的概念。线性拟合通常称为线性回归。

第2章 函数拟合

2.1 插值有时候插值并不是最好的选择

(1)简单直线拟合好于多项式拟合

在上图图有,有几十个样本点,如果用多项式插值来进行函数逼近,虽然插值函数在样本点的误差为0,但很显然,需要高次多项式来进行逼近。

如果样本点有几百个,那么多项式的次数高达几百次。

从图中可以大致看出,要逼近上述样本点,只需要一个简单的线性函数即可:y=ax+b,这种函数逼近称为拟合。

(2)抛物线逼近

同理,对上述样本点的逼近,也不需要几十次的多项式进行插值,值需要一个简单的抛物线就可以进行逼近:y =ax^2 + bx + c,,这种函数逼近称为拟合。

(3)三角函数拟合

2.2 什么函数拟合

 

 2.2 函数拟合的基本步骤

步骤1:构建样本

(1)读取已有样本数据,并图形展示样本数据。或者

(2)构建自行测试样本数据

(3)图形化展示样布数据(散点图)

步骤2:选择函数模型

根据散点图,选择函数类,函数类可以从初等函数中进行选取,如线性函数、二次或多次多项式函数、三角函数等。

步骤3: 构建最小二乘的残差函数,并计算最佳参数(最关键步骤)

(1)选择最佳拟合的范数(这里选择最小二乘法)

选取了函数类型后,每个函数都有自己的待定参数,不同的参数,其拟合效果是不同的,如何选择函数的参数,使得拟合效果最好呢?常有的有最小二乘法。

最小二乘法是函数拟合最重要的环节之一。

(2)计算最佳参数(这是最关键、最核心的步骤)

最小二乘法得到的loss残差函数是一个多元二次多项式函数:

  • 残差函数的“元”的个数,就是拟合函数的参数
  • 残差函数的“元”的次数:2次
  • 拟合最好的依据:多元函数的最小值点处的各个变量值,就是拟合函数最好的参数。

求解多元二次多项式函数的方法有多种:

  • 法向量解线性方程组法
  • 梯度下降法

无论哪种方法,都是通过求残差函数的最小值,基于指定样本数据,获得了最佳参数的拟合函数。

步骤4:利用拟合函数进行数据预测

生成一组输入数据,利用第4步获得的拟合函数的参数以及对应的拟合函数,对数据进行函数运算(预测),得到新的输出数据。

步骤5:图形展示

把预测数据与采样数据、理论曲线一起进行图形展示。

第3章 最小二乘法的一元2次方程解析法求解

3.1 什么是最小二乘法

 

3.2 线性拟合函数的最小二乘法的几何意义

注意: 

最小二乘选择一个适当的直线参数,使得所有样本点处的yi - f(xi) = yi -(axi+b)的平方和的平均值最小,而不是所有样本点到拟合直线的距离的和的平均值最小。

这样选择,主要处于如下原因:

(1)计算简单:求点到拟合曲线的距离要比直接计算样本点处的Y值的差复杂很多。

(2)符合拟合函数原本的物理意义:拟合函数要在所有的样本点xi处,其f(xi)也尽可能的相等,或者说误差尽可能的小。

3.3 最小二乘算法实现

(1)最小二乘法求解1:一元参数的解析法求解

(2)最小二乘法求解2:“法向量”线性方程组求解法

(3)最小二乘法求解3:梯度下降法

3.4 最小二乘法求解1:一元参数的解析法求解

如果拟合函数只有一个参数,如y=wx + 1 或 y = wx^2 + 2X + 1,都只有一个参数,引起其残差函数就是一个只包含w参数的一元二次函数,一元二次方程的极小值是可以通过解析法获得的。

当x = -b/2a时,残差函数有最小值。x = -b/2a就是拟合参数的参数w。

第4章 最小二乘法求解1:解析法求解的代码示例

4.0 前置条件:

#导入库
from math import *
import time
import numpy as np
import matplotlib.pyplot as plt #画图工具
from pylab import mpl           #中文字体
from scipy import optimize      #最小二乘算法的算法库

4.1 步骤1:构建样本数据集

#步骤1:构建样本

#(1) 采用np, 直接手工生成样本的输入:一组等距离的分布在[-1,1]之间的100个点
sample_numbers = 50

x_data = np.linspace(0, 1, sample_numbers)

#(2) 为这些数据手工打上理论输出值(标签值):y = 2x + 1
y_data_pure =  2 * x_data + 1.0

#(3)为了模拟现实情况,通过随机数来模拟数据噪声
noise_range = 0.4
np.random.seed(10) #设置随机种子, 确保不同时候,执行结果是相同的
#randn(n)生成的0为均值,1为标准差的正态分布的n个随机数。
y_noise = np.random.randn(*x_data.shape) * noise_range  # *x_data.shape:输入样本的维度或个数

#(4)人工生成样本的输出:理论值 + 噪声
y_data_noise = y_data_pure + y_noise

#(5) 显示样本数据
# 样本的散点图
plt.scatter(x_data, y_data_noise, label="sample", color="black")

# 内在的、理论的曲线图
plt.plot(x_data, y_data_pure, label="f_pure(x)", color="blue", linewidth = 4)

#设置属性
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
plt.title("线性拟合")
plt.legend(loc="upper left")
plt.show()

4.2 步骤2:构建拟合函数

#步骤2:构建拟合函数:二元一次拟合函数, x变量,w是常量
def f_line_w(x, w):
    return (w*x + 1)

4.3 步骤3:构建最小二乘的残差函数,并计算最佳参数(最关键步骤)

#步骤3: 计算拟合参数
print("利用python库提供的最小二乘算法来计算拟合函数的参数")
print("无噪声数据:")
popt, pcov = optimize.curve_fit(f_line_w, x_data, y_data_pure)
print(popt)
print(pcov)
print("参数w=", popt[0])

print("\n有噪声数据:")
popt, pcov = optimize.curve_fit(f_line_w, x_data, y_data_noise)
print(popt)
print(pcov)
print("参数w=", popt[0])

w_scipy =  popt[0]
利用python库提供的最小二乘算法来计算拟合函数的参数
无噪声数据:
[2.]
[[0.]]
参数w= 2.0

有噪声数据:
[2.03981828]
[[0.00794081]]
参数w= 2.03981827977079

备注说明:

上述利用python库提供的最小二乘算法来计算拟合函数的参数。

因此没有展现用数值的方法求最小二乘最佳参数的过程。

如下的函数讲展现通过解析法法求解残差函数的最佳参数,使得残差函数输出误差最小。

print("自定义最小二乘求解拟合函数参数:解析法求一个参数")

def usr_curve_fit(input_f, input_x_data, input_y_data_noise):
    b = input_f(0, 0)
    n = len(x_data)
    sum_sqrt_Xi_a  = np.sum(np.power(input_x_data,2))
    sum_2XiYi_b    = np.sum(2* input_x_data * (1 - input_y_data_noise))
    sum_sqrt_BYi_c = np.sum(np.power(1- input_y_data_noise,2))
    return (-1*sum_2XiYi_b/(2*sum_sqrt_Xi_a), b)

print("使用无噪声数据:")
popt = usr_curve_fit(f_line_w, x_data, y_data_pure)
print(popt)
print("参数w=", popt[0])

print("\n使用有噪声数据:")
popt = usr_curve_fit(f_line_w, x_data, y_data_noise)
print(popt)
print("参数w=", popt[0])

w_usr = popt[0]
自定义最小二乘求解拟合函数参数:解析法求一个参数
使用无噪声数据:
(2.0, 1)
参数w= 2.0

使用有噪声数据:
(2.0398182816598647, 1)
参数w= 2.0398182816598647

很显然,该方法获得的参数与scipy库提供的算法获得的参数是一致的。

参数a= 2.03981827977079

参数a= 2.0398182816598647

4.4 步骤4:利用拟合函数进行数据预测

# 步骤4:利用获得的拟合函数进行数据预测

# scipy 算法的拟合数据
y_data_scipy = f_line_w(x_data, w_scipy)

# 解析法的拟合数据
y_data_usr  = f_line_w(x_data, w_usr)

4.5 步骤5:图形展示

#步骤5: 图形化展示
#(1) 显示样本数据曲线
plt.scatter(x_data, y_data_noise, label="sample", color="black")

#(2) 显示理论数据曲线
plt.plot(x_data, y_data_pure, label="intrinsic", color="blue", linewidth = 2)

#(3-1) 显示预测数据曲线 - scipy库实现
plt.plot(x_data, y_data_scipy,  label="predict",  color="red",  linewidth = 2)

#(3-2) 显示预测数据曲线 - 自定义实现
#plt.plot(x_data, y_data_usr, label="usr", color="green", linewidth = 2)

#设置属性
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
plt.title("线性拟合")
plt.legend(loc="upper left")
plt.show()

  从上图可以看出:解析法获得拟合函数与scipy库获得的拟合函数,基本重合。


作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119978799

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[数值计算-16]:最小二乘法的求解1 - 一元二次方程解析法求解 的相关文章

  • C语言课程设计之设计菜单程序

    C语言课程设计之设计菜单程序 设计要求 1 菜单内容 程序运行后 给出三个菜单选项的内容和输入提示 1 FindNum 2 Dimand 3 Goodbye Input 1 3 2 设计要求 使用1 3数字来选择菜单项 其他输入则不起作用
  • 【剑指offer】数据结构——字符串

    目录 数据结构 字符串 直接解 剑指offer 05 替换空格 剑指offer 17 打印从1到最大的n位数 剑指offer 20 表示数值的字符串 剑指offer 37 序列化二叉树 剑指offer 50 第一个只出现一次的字符 剑指of

随机推荐

  • CUDA笔记

    1 cudaDeviceSynchronize 用于CPU和GPU同步 即cpu和GPU均运行至cudaDeviceSynchronize 后再继续 CPU多线程时 会阻止所有线程 2 syncthreads 用于核函数内线程块线程同步 即
  • Cygwin配置优化(乱码、颜色等问题)

    前面介绍了如何将Cygwin集成到Windows资源管理器的右键菜单中 点击在当前路径下打开窗口 本文介绍一些乱码问题与美化问题 1 乱码问题 在Cygwin中执行Windows原生程序 如ping ipconfig 时会出现中文乱码 显示
  • 遗传算法与TSP问题

    一 遗传算法 遗传算法 Genetic Algorithm 是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型 是一种通过模拟自然进化过程搜索最优解的方法 遗传算法是从代表问题可能潜在的解集的一个种群 population
  • 一致性Hash算法

    原文 https www cnblogs com lpfuture p 5796398 html 一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的 设计目标是为了解决因特网中的
  • matlab中dropoutLayer,[转]对 CNN 中 dropout layer 的理解

    原文网址 http blog csdn net u012702874 article details 45030991 dropout layer的目的是为了防止CNN 过拟合 那么为什么可以有效的防止过拟合呢 首先 想象我们现在只训练一个
  • 例说数据结构&STL(七)——priority_queue

    1 白话优先队列 priority queue 前面我们已经相继介绍了双向队列和FIFO特性的队列 这里我们还要接触另一个包含 队列 称呼的数据结构 优先队列 其实这三个数据结构名称看似很像 实则天差万别 通过下面的介绍你就会有很深的体会了
  • DDR一些引脚说明

    信号名 方向 功能描述 CK t CK c Input 差分时钟输入 所有的地址 控制信号都是通过CK t的上升沿与CK c的下降沿进行采样的 CKE Input 时钟使能 CKE为高电平时 启动内部时钟信号 设备输入缓冲以及输出驱动单元
  • 牛客在线编程-华为机试-中等

    牛客在线编程题目 华为机试 中等 题号 题目 知识点 难度 通过率 HJ16 购物单 动态规划 中等 21 21 HJ17 坐标移动 字符串 中等 24 79 HJ20 密码验证合格程序 数组 字符串 模拟 中等 28 91 HJ24 合唱
  • pycharm中使用GPU跑程序

    查看机器上GPU情况 命令 nvidia smi 功能 显示机器上gpu的情况 命令 nvidia smi l 功能 定时更新显示机器上gpu的情况 命令 watch n 3 nvidia smi 功能 设定刷新时间 秒 显示GPU使用情况
  • 面试回答 CopyOnWrite 的三重境界,1%的人能答到最后

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 1 读多写少的场景下引发的问题 2 引入 CopyOnWrite 思想解决问题 3 CopyOnWrite思想在Kafka源码中的运用 今天聊一个非常硬核的技术
  • [动态系统的建模与分析]8_频率响应_详细数学推导 G(jw)_滤波器

    运放滤波器 3 反相同相比例放大电路 Multisim电路仿真 运放滤波器 2 运放反馈原理 运放滤波器 1 理想运放 虚短虚断 现代控制理论 11 现代控制理论串讲 完结 pdf获取 信号与系统在工程中 里面的一些工具应该是奠基石 电路
  • 浅析hadoop写入数据api

    对于一般文件 都有满足随机读写的api 而hadoop中的读api很简单用FSDataInputStream类就可以满足一般要求 而hadoop中的写操作却是和普通java操作不一样 hadoop对于写操作提供了一个类 FSDataOutp
  • 惠普打印机136w硒鼓芯片怎么清零_惠普136w打印机怎么清零

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 惠普136w打印机清零的方法如下 1 关闭打印机电源 并把电源线从电源插座拨开 2 按紧打印机的电源键同时插上电源线 3 不松开电源键 按4下进纸键 电源灯显示 黄 橙 4
  • 学习记录-VS踩坑记录

    一 安装VS2015后 CMAKE执行错误 CMAKE C COMPILER NOTFOUND was not found CMAKE CXX COMPILER NOTFOUND was not found 环境 1 公司内网 无法上外网
  • 算法笔记-第四章-第六章

    4 1排序 1 选择排序 思路 总共需要进行N趟操作 每次从i n中选出最小的元素并与第I个元素交换 算法的时间复杂度为O n2 假设有数组A i 0 lt i lt n 1 如下 void selectSort for int i 0 i
  • 【设计模式】软件设计遵循——六大原则

    软件设计遵循 六大原则 1 开闭原则 定义 一个软件实体如类 模块和函数应该对扩展开放 对修改关闭 原则 用抽象构建框架 用实现扩展细节 优点 提高软件系统的可复用性和可维护性 2 里氏替换原则 定义 所有引用基类的地方必须能透明化地使用其
  • matlab函数零点求法,Matlab之函数零点

    Matlab之函数零点 Matlab中求函数零点的函数是fzero 一元函数 fsolve 二元函数 roots 一元多项式 等 fzero fzero可以求任何一元函数的零点 求函数 的零点 x 3 0 1 4 y x 2 sin x x
  • JS判断一个数组中是否有重复值

    首先 该笔记内容是将网上查阅的资料做了一个整合 便于自己快速查阅并解决问题 方法一 先利用ES6语法将数组去重 之后再与原数组比较长度 若长度小于原数组 则说明数组有重复值 Array from new Set arr length lt
  • jsp树形结构

    Dtree生成树形结构 很方便 很适用 下载dtree zip包请到下面地址去下载 http jinchun1223 javaeye com admin blogs 421817
  • [数值计算-16]:最小二乘法的求解1 - 一元二次方程解析法求解

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119978799 目录 第1章