[数值计算-17]:最小二乘法的求解2 - 二元二次线性方程组求解
作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119977443
目录
第1章 什么是函数逼近?
1.1 抛出问题1:函数插值
1.2 抛出问题2:函数拟合
1.3 什么是回归
第2章 函数拟合
2.1 插值有时候插值并不是最好的选择
2.2 什么函数拟合
2.2 函数拟合的基本步骤
第3章 最小二乘法的线性方程组解法
3.1 什么是最小二乘法
3.2 线性拟合函数的最小二乘法的几何意义
3.3 最小二乘算法实现
3.4 最小二乘法求解1:“法向量”方程组法
3.5 最小二乘法求解1:二元线性方程组示例
第4章 最小二乘法求解2:多元线性方程组解法
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章 最小二乘法的线性方程组解法
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:“法向量”方程组法
3.5 最小二乘法求解1:二元线性方程组示例
第4章 最小二乘法求解2:多元线性方程组解法
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 = 50x_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:构建拟合函数:二元一次拟合函数
def f_line_wb(x, w, b):return (w*x + b)
4.3 步骤3:构建最小二乘的残差函数,并计算最佳参数(最关键步骤)
#步骤3-1:利用python库提供的最小二乘算法来计算拟合函数的参数
print("使用无噪声数据:")
popt, pcov = optimize.curve_fit(f_line_wb, x_data, y_data_pure)
print(popt)
print(pcov)
w_scipy = popt[0]
b_scipy = popt[1]
print("参数w=", w_scipy)
print("参数b=", b_scipy)print("\n使用有噪声数据:")
popt, pcov = optimize.curve_fit(f_line_wb, x_data, y_data_noise)
print(popt)
print(pcov)
w_scipy = popt[0]
b_scipy = popt[1]
print("参数w=", w_scipy)
print("参数b=", b_scipy)
使用无噪声数据: [2. 1.] [[ 0. -0.][-0. 0.]] 参数w= 2.0 参数b= 1.0使用有噪声数据: [1.91826746 1.08186076] [[ 0.0310567 -0.01552835][-0.01552835 0.01045787]] 参数w= 1.9182674578022025 参数b= 1.0818607577986927
备注说明:
这里利用python库提供的最小二乘算法来计算拟合函数的参数。
因此没有展现用数值的方法求最小二乘最佳参数的过程。
如下函数就展现通过求解多元线性方程组的方法,获得拟合函数的参数a和b。
#步骤3-2: 自定义最小二乘求解拟合函数参数:偏导+线性方程组(求偏导后一次函数)
def usr_curve_fit(input_f, input_x_data, input_y_data_noise):#获取采样数据的个数n = len(input_x_data)#计算线性方程组矩阵的数据sum_xi = np.sum(input_x_data)sum_yi = np.sum(input_y_data_noise)sum_xiyi = np.sum(input_x_data * input_y_data_noise)sum_xixi = np.sum(input_x_data**2)#构建线性方程组矩阵A=[[0,0],[0,0]]b=[0,0]A[0][0] = nA[0][1] = sum_xiA[1][0] = sum_xiA[1][1] = sum_xixib[0] = sum_yib[1] = sum_xiyi#解方程组rst = np.linalg.solve(A,b)#返回拟合函数参数return ([rst[1],rst[0]])print("使用无噪声数据:")
popt = usr_curve_fit(f_line_wb, x_data, y_data_pure)
print(popt)
print(pcov)
w_usr = popt[0]
b_usr = popt[1]
print("参数w=", popt[0])
print("参数b=", popt[1])print("\n使用有噪声数据:")
popt = usr_curve_fit(f_line_wb, x_data, y_data_noise)
w_usr = popt[0]
b_usr = popt[1]
print("参数w=", w_usr)
print("参数b=", b_usr)
使用无噪声数据: [2.0, 0.9999999999999997] [[ 0.0310567 -0.01552835][-0.01552835 0.01045787]] 参数w= 2.0 参数b= 0.9999999999999997使用有噪声数据: 参数w= 1.9182674564112352 参数b= 1.081860759861322
可以看出,通过自定义的线性方程组求解获取的拟合参数的参数与通过scipy获得的参数值是一致的。
scipy库:参数a= 1.9182674578022025 参数b= 1.0409944876382622
自定义 :参数a= 1.9182674564112352 参数b= 1.0818607577986927
4.4 步骤4:利用拟合函数进行数据预测
# 步骤4:利用获得的拟合函数进行数据预测
print("scipy:", w_scipy,b_scipy)
print("user :", w_usr, b_usr)# scipy算法的拟合数据
y_data_scipy = f_line_wb(x_data, w_scipy, b_scipy)# 线性方程组求解的拟合数据
y_data_usr = f_line_wb(x_data, w_usr, b_usr)
scipy: 1.9182674578022025 1.0818607577986927 user : 1.9182674564112352 1.081860759861322
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="predict", color="green", linewidth = 2)#(3-3) 显示预测数据曲线 - 自定义梯度下降法
#plt.plot(x_data, y_data_grad, label="predict", 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/119977443
[数值计算-17]:最小二乘法的求解2 - 二元二次线性方程组求解相关推荐
- 二元二次方程例题_2015中考数学精选例题解析二元二次方程组
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090@qq.com,我 ...
- matlab使用solve求解二元二次方程组
网上有些代码存在问题,这里只做了原理上的更正.也希望能各位码农能完全.准确地提供代码. 求解二元二次方程组代码: clc clear close all syms x y; f_1 = sym(x^2 ...
- 二元一次在线计算机,(二元一次)方程组求解在线计算器_三贝计算网_23bei.com
如果一个方程含有两个未知数,并且所含未知项的次数都为1次,那么这个整式方程就叫做二元一次方程,有无数个解,若加条件限定有有限个解.二元一次方程的一般形式:ax+by+c=0其中a.b不为零,这就是二元 ...
- C++解決二元二次方程组
要配置一个库Eigen库 链接:https://pan.baidu.com/s/1AofB13zldSq1fT_lKMGf6g 提取码:wqcc #include <iostream> # ...
- [数值计算-5]:一元二次非线性方程求解 - 解析法直接求解
作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing 本文网址:https://blog.csdn.net/HiWangWenBing/article ...
- 数值计算之 最小二乘法(3)最小二乘的矩阵解法
数值计算之 最小二乘法(3)最小二乘的矩阵解法 前言 回顾最小二乘的线性解 列满秩矩阵的最小二乘解法 Cholesky分解求线性最小二乘解 QR分解求线性最小二乘解 亏秩矩阵的最小二乘解法 SVD分解 ...
- 一阶矩+二阶矩估计求解一个参数
一阶矩+二阶矩估计求解一个参数 @(概率论) 一般来说,一个参数对应一个方程.所以在矩估计法中,用一阶矩就可以求解一元.但是有些情况下,只写一阶矩,原理上是可以求得解的,但是,初等代数中很难剥离出来, ...
- 佩尔方程及其在一类二元二次丢番图方程的推广
文章目录 前言 标准型佩尔方程 性质 求最小解 暴力写法 连分数写法 例题 非标准型佩尔方程 额外证明 求解没有xy项的二元二次丢番图方程 例题 后记 前言 这是一篇欠了半年多的博客,期间笔者遇到了诸 ...
- 数值计算之 最小二乘法(1)最小二乘计算与线性方程
数值计算之 最小二乘法(1)最小二乘计算与矩阵 前言 最小二乘法与线性方程组 最小二乘解与矩阵计算 总结 前言 本篇开启一个非常重要的内容,最小二乘法.它在方程组求解.多视图几何计算.线性优化等方面具 ...
最新文章
- 上海python好找工作吗_上海找个月薪一万的工作难吗
- delphi存取图片
- 一个java处理JSON格式数据的通用类(四)
- 学习微服务服务消费者——Feign
- Oracle中限定日期,Oracle 日期的一些简单使用
- 两个链表求交集_实现两个排序链表的并集和交集
- #20175201张驰 实验三 敏捷开发与XP实践
- 寻宝处理器的引人入胜之旅——《大话处理器》新书出炉
- r语言调用python_python3调用R语言干货
- 冯诺依曼结构和哈佛结构02
- web前端常用开发工具有哪些?
- 基于战舰V3的NRF24L01模块的原理剖析及应用
- NB5.5源代码分析之服务端生成
- HDMI调试基本原理
- linux之kubuntu挂载硬盘
- 北通手柄连接电脑没反应_北通手柄连接电脑教程
- [蓝桥杯解题报告]第九届蓝桥杯大赛省赛2018(软件类)真题C++A组 Apare_xzc
- 通过微信公众号远程控制设备STM32+NB模组方案
- 请输入公众号相关链接,并以http://或https://开头
- (汇总篇)语义SLAM相关开源方案| 全球优秀作者与实验室 | SLAM学习资料整理
热门文章
- Microsoft Edge 浏览器cpu占用率莫名升高
- 【解题报告】2014ACM/ICPC亚洲区广州站
- 【Web】ES6学习笔记
- 即有分期 提前还款手续费就是不在办理的时候告诉你
- tas5424_TAS5424 Datasheet(数据表) 10 Page - Texas Instruments
- ArcGIS Pro发布WebScene
- 批处理文件 执行java_利用批处理文件运行java程序
- QC —什么是量子计算机?
- 人工神经网络模型定义,人工神经网络基本框架
- Scala可变长度参数和:_*使用