python人工智能数据算法(下)

news2024/11/27 18:47:34

文章目录

  • 差分法逼近微分
      • 背景引入
      • 差分法简介
      • 差分的不同形式及其代码实现
  • 蒙特卡罗方法
      • 背景引入
      • 蒙特卡罗方法原理
      • 蒙特卡罗方法应用
          • 计算圆周率
          • 计算定积分
  • 梯度下降算法
      • 算法简介
      • 方向导数与梯度
      • 梯度下降
      • 基于梯度下降算法的线性回归
      • 算法总结


差分法逼近微分

背景引入

几乎所有的机器学习算法在训练或者预测式都是求解最优化问题。因此需要依赖微积分求解函数的极值。而差分法(Difference Method)则是一种常见的求解微分方程(Difference Equation)数值解的数学方法。

差分法简介

差分法主要通过有限差分来近似表示导数(Derivative),从而寻找微分方程的近似解。换而言之,差分法是用有限差分来代替微分,用有限差商(Finite Difference Quotient)来替代导数,从而把基本方程和边界条件(一般均为微分方程)近似地转化为差分方程(代数方程)来表示,把求解微分方程的问题转化为求解代数方程的问题。有限差分导数的逼近(Approximation)在微分方程数值解的有限差分方法中,特别是边界值问题中,骑着关键的作用。
有限差分则是形式为f(x+b)-f(x+a)的数学表达式,若有限差分除以(b-a),则得到差商,亦即倒数的近似值。设所有x的解析函数y=f(x),函数y对x的导数为:
dy/dx=lim(Δy/Δx)=lim((f(x+Δx)-f(x))/Δx) Δx->0
其中,dy,dx分别为函数及自变量的微分,dy/dx是函数对自变量的导数,又称为微商(Differential Quotient)Δy,Δx则分别称为函数及自变量的差分,而Δy/Δx则为函数对自变量的差商。由导数(微商)和差商的定义可知,当自变量的差分(增量)趋近于0时,就可由差商得到导数。因此,在数值计算中,常以差商替代导数。

差分的不同形式及其代码实现

差分有3种形式:向前差分,向后差分以及中心差分。
我们以一阶差分为例:
向前差分:Δpy=f(x+Δpx)-f(x)
向后差分:Δy=f(x)-f(x-Δx)
中心差分:Δy=f(x+Δx)-f(x-Δx)
与其对应的一阶差商如下。
向前差商:
Δy/Δx=(f(x+Δx)-f(x))/Δx
向后差商:
Δy/Δx=(f(x)-f(x-Δx))/Δx
中心差商:
Δy/Δx=(f(x+Δx)-f(x-Δx))/Δx
以下示例代码展示了函数f(x)几种不同的差商形式:


#差分法逼近微分
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签

#定义函数
f=lambda x:5*x**3+2*x**2+7

#返回向前差商
def forward_diff(x,h):
    plt.plot([x,x+h],[f(x),f(x+h)],'b-d',label='向前差商')
    return (f(x+h)-f(x))/h
#返回向后差商
def backward_diff(x,h):
    plt.plot([x-h,x],[f(x-h),f(x)],'r*-',label='向后差商')
    return (f(x)-f(x-h))/h

#返回中心差商
def central_diff(x,h):
    a=(f(x-h)+f(x+h))/2
    plt.plot([x-h,x+h],[f(x-h)+f(x)-a,f(x+h)+f(x)-a],'g--',label='中心差商')
    return (f(x+h)-f(x-h))/(2*h)
xx=np.linspace(-1.0,1.5,20)  #产生等差数列作为坐标轴标记
yy=f(xx)
plt.plot(xx,yy,'k-',label='原函数')
print('向前差商',forward_diff(1,0.5))
print('向后差商',backward_diff(1,0.5))
print('中心差商',central_diff(1,0.5))
plt.legend()
plt.show()

结果展示:
向前差商 28.75
向后差商 11.75
中心差商 20.25

在这里插入图片描述

蒙特卡罗方法

背景引入

著名的人工智能“AlphaGo”因其在与多位世界级围棋大师对战中的出色表现而声明鹊起。除了卷积神经网络(Convolutional Neural Networks,CNN)技术的应用外,基于蒙特卡罗数的搜索方法等技术手段也在其中起了关键性的作用。蒙特卡罗方法(Monte Carlo Method)称为统计模拟方法,是一种以概率统计理论为指导的一类非常重要的数值计算方法。它诞生于20世纪40年代美国著名的曼哈顿计划(Manhattan Project),由该计划中的成员————计算机之父约翰·冯·洛依曼(John von Neumann)与数学家S.M.乌拉姆(Stanislaw Marcin Ulam )首先提出并以世界著名的赌城摩纳哥的蒙特卡罗来命名。

蒙特卡罗方法原理

蒙特卡罗法 是一种用来模拟随机现象的数学方法,这种方法在作战模拟中能直接反映作战过程中的随机性。在作战模拟中能用解析法解决的问题虽然越来越多,但有些情况下却只能采用蒙特卡罗法 。使用蒙特卡罗法 的基本步骤如下:
(1)根据作战过程的特点构造模拟模型;
(2)确定所需要的各项基础数据;
(3)使用可提高模拟精度和收敛速度的方法;
(4)估计模拟次数;
(5)编制程序并在计算机上运行;
(6)统计处理数据,给出问题的模拟结果及其精度估计。
在蒙特卡罗法 中,对同一个问题或现象可采用多种不同的模拟方法,它们有好有差,精度有高有低,计算量有大有小,收敛速度有快有慢,在方法的选择上有一定的技巧。
例如,在求不规则的图形的面积的时候,使用蒙特卡罗方法近似求解可以很方便的求解面积。假设图中的正方形边长为1,S1和S2分别表示不同图形的面积与正方形的面积,N1,N2分别表示落在不规则图形的随机点数以及所有随机点数。
S1/N1=S2/N2
在这里插入图片描述

蒙特卡罗方法应用

蒙特卡罗方法可应用于多种场合,但求出的解为近似解,在摸样样本数越大的情况下,结果越接近真实值,不过,样本数的剧增也会导致计算量的大幅上升。下面我们通过几个实例来说明蒙特卡罗方法的一些简单应用。

计算圆周率

假设有一个边长未为2的正方形,则其面积S1=2x2=4,其内接圆的半径为r=1,类结缘的面积为S2=Π*r²=Π。那么S1/S2=Π/4.
基于蒙特卡罗方法计算圆周率的示例代码:

import numpy as np
r=1  #定义内接圆半径
rand_num=[100,1000,10000,100000,1000000,10000000]
for N in rand_num:
    #在边长为2的正方形区域生成随即点坐标(x,y)
    x=2*np.random.random_sample(N)-1
    y=2*np.random.random_sample(N)-1
    in_circle_point_num=0
    #计算落在内接圆区域里的随机点数
    for point_count in range(len(x)):
        #判断随机点时否落在类结缘区域之内
        if(x[point_count]*x[point_count]+y[point_count]*y[point_count]<r*r):
            in_circle_point_num+=1
    print('N=',str(N),'pi=',str(4.0*in_circle_point_num/N))

结果展示:
N= 100 pi= 2.68 N= 1000 pi= 3.176 N= 10000 pi= 3.1316 N= 100000 pi= 3.13248 N= 1000000 pi= 3.13982 N= 10000000 pi= 3.141796

计算定积分

在这里插入图片描述
例如像上例图像,用随即点模拟的方式来近似计算定积分的值。采用蒙特卡罗方法,在该矩形区域内产生大量的随机点(例如N),计算落在阴影区域内的随机点数(counts)。那么其积分的近似值则为(counts/N)24.
以下即为上述基于蒙特卡罗方法计算定积分的示例代码:

import random
import numpy as np
import scipy.integrate as integrate

def MonteCarlo_Integral(f,a,b,n):
    '''
    基于蒙特卡罗方法计算定积分
    F:定积分曲线方程
    a,b:区间[a,b]
    n:产生随机点数
    '''
    #定义定积分区间
    x_min,x_max=a,b
    y_min,y_max=f(a),f(b)

    count=0
    for i in range(0,n):
        x=random.uniform(x_min,x_max)
        y=random.uniform(y_min,y_max)
        #判断条件y<f(x)表示该随即点位于曲线下方
        if(y<f(x)):
            count+=1
    integral_value=(count/float(n))*f(a)*f(b)
    print(integral_value)
if __name__=='__main__':
    #产生8个随机点数
    N=10000
    #定积分曲线
    f=lambda x:x**2
    #利用蒙特卡罗方法计算定积分
    MonteCarlo_Integral(f,0,2,N)
    #利用scipy内置模块直接计算定积分
    print(integrate.quad(f,0,2))

计算结果:
0.0 (2.666666666666667, 2.960594732333751e-14)
该结果存在一定误差,样本数越大,则误差越小。

梯度下降算法

算法简介

梯度下降(Gradient Descent)是一种求局部最优解的优化算法。在求解机器学习算法的模型参数即无约束优化问题,梯度下降是常用方法之一,主要用来递归性地逼近最小误差模型。

方向导数与梯度

在学习梯度下降算法之前,我们需要先了解梯度(Gradient)的概念。在此之前,我们先来回顾一下什么方向导数及其几何意义。
在这里插入图片描述
图形解释:
在这里插入图片描述
对于导数以及偏导数的定义,均为沿坐标轴正方向函数的变化率。当我们讨论函数沿任意方向的变化率,就引出了方向导数的定义,即某一点在某一方向上的导数值。

梯度下降

梯度下降,又名最速下降(Steepest Descent),是求解无约束最优化问题最常用的方法。它是一种迭代方法,每一步主要的操作是求解目标函数的梯度向量。既然在向量空间的某一点处,函数沿梯度正方向具有最大的变化率,那么在优化目标函数的时候,自然是沿着梯度负方向去减少函数值,以此达到我们的优化目标。因为在梯度负方向上目标函数下降最快,这也是最速下降名称的由来。梯度下降法特点为越接近目标值步长越小,下降速度越慢。如图,每一个圈代表一个函数梯度,其中心位置表示函数极值点。每次迭代根据当前位置求得的梯度(用于确定搜索方向以及与步长共同决定前进速度)和步长找到一个新位置,这样不断迭代最终到达目标函数局部最优点(如果目标函数是凸函数,则到达全局最优点)。
在这里插入图片描述
上述梯度下降过程可描述为一个函数自变量的迭代过程,用一个数学公式描述如下:
β=β-α·▽J(o)
其中,J为关于o的函数,β为当前所处位置,从该位置沿着下降最快的方向,即为梯度负方向-▽j(o),移动前进至β(i+1),α为每次的移动步长。重复该步骤直至抵达函数J的极值点。梯度下降中的α在机器学习中也被称为学习率(Learning Rate)或步长,通过α来控制每一步的距离,既要保证不让步长大大错过最低点,也要保证让步长太小而导致学习速度过慢而影响整体效率。
在这里插入图片描述

基于梯度下降算法的线性回归

在统计学中,线性回归(Linear Regression)是利用线性回归方程对一个或多个自变量与因变量之间的关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。在回归分析中,只包含一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析包含两个或两个以上的自变量,且因变量和自变量之间存在线性关系,则称为多元线性回归分析。
一元线性回归分析,简而言之,就是通过给定的一系列数据点,求出符合这些点的最佳直线方程。假设有如图的一组数据点,我们要找到一条合适的直线来拟合这些数据。为此,我们将使用标准的y=mx+b直线方程,其中m为直线的斜率(Slope),b为直线的y轴截距(Intercept)。想要找到最佳的数据拟合直线,只需找到m与b最佳的值即可。
在这里插入图片描述
解决这类问题的标准方法是,首先定义一个误差函数,亦可称为代价函数或成本函数(Cost Function),用于评估函数与数据点之间的拟合程度。误差函数的值越小,代表模型拟合程度越好。该函数以(m,b)为输入,并根据模拟数据点与直线的匹配程度返回一个误差值。为了计算给定直线的误差,我们将遍历给定模拟数据集中的每个数据点(x,y),并求出每个点的y值与候选直线y值之间的平方距离(Square Distance)之和。误差函数可定义如下:
示例代码:

def error_function(b,m,points):
    totalError=0
    for i in range(0,len(points)):
        x=points[i][0]
        y=points[i][1]
        totalError+=(y-(m*x+b))**2
    return totalError/float(len(points))

在这里插入图片描述
现在我们就可以进行接下来执行梯度算法,梯度下降算法实现的示例代码如下:


def step_gradient(m_current,b_current,points,learningRate):
    '''
    梯度下降算法核心方法
    参数说明
    m_current:当前斜率值m
    b_current:当前截距值b
    points:模拟数据点集合
    learningRate:学习率,也是每次移动的步长
    '''
    b_gradient=0 #erro函数关于b的偏导数
    m_gradient=0 #erro函数关于m的偏导数
    N=float(len(points)) #数据集长度
    #通过梯度下降计算更新后的m与b值
    for i in range(0,len(points)):
        x=points[i,0]
        y=points[i,1]
        #erro函数对b求偏导数
        b_gradient+=-(2/N)*x*(y-((m_current*x)+b_current))

学习率变量控制在每次迭代中“走下坡路”的幅度.为确保梯度下降正常工作的最好方式是确保每次迭代的误差持续递减。
基于上述定义的误差函数和梯度计算方法,就可以通过多次梯度下降算法来获取最佳拟合直线的斜率m和截距b。示例代码如下:


from numpy import *
def gradient_descent_runner(points,starting_b,starting_m,learning_rate,num_iterations):
    '''
    定义梯度下降运行方法
    points:模拟数据点集合
    starting_b:初始化b值
    starting_m:初始化m值
    learningRate:学习率,也是每次移动的步长
    num_iterations:迭代次数
    '''
    b=starting_b #初始化b值
    m=starting_m
    b_m_sets=[] #用于存放所有拟合直线的m,b值
    #梯度下降算法迭代
    for i in range(num_iterations):
        b,m=step_gradient(b,m,array())
        b_m_sets.append([b,m])
    #返回所有拟合直线的m,b值
    return b_m_sets
def run():
    '''
    定义主程序
    读取本地文件,设置本地曲线
    通过多次梯度下降算法迭代来获取最佳拟合直线的斜率m与截距b
    '''
    points=genfromtxt('data.csv',delimiter=',')
    learning_rate=0.0001
    initial_b=0 #初始化b值
    initial_m=0 #初始化m值
    num_iterations=100 #迭代次数
    print("Starting gradient descent at b={0},m={1},error={2}".format(initial_b,initial_m,error_function(initial_b,initial_m,points)))
    #通过梯度下降算法获取拟合直线的m,b值
    parameters=gradient_descent_runner(points,initial_b,initial_m,learning_rate,num_iterations)
    [b,m]=parameters[-1]
    print('After {0} iterations b={1},m={2},error={3}'.format(num_iterations,b,m,error_function(b,m,points)))
    # 可视化输出数据点,最佳拟合直线以及误差梯度下降曲线
    gd_visualization(points,parameters,num_iterations)
    def gd_visualization(points,parameters,iter_num):
        xx=[]
        yy=[]
        for i in range(len(points)):
            xx.append(points[i][0])
            yy.append(points[i][1])
        plt.plot(xx,yy,'bo',label='模拟数据点')
        plt.title('一元线性回归分析示例')
        plt.xlabel('x')
        plt.ylabel('y')
        plt.grid(False)
        [b,m]=parameters[-1]
        x=np.linspace(0,100,100)
        y=m*x+b
        plt.plot(x,y,'r-',label='最佳拟合直线')
        plt.legend()
        plt.show()
        erro=[]
        for j in range(len(parameters)):
            [b,m]=parameters[j]
            erro.append(error_function(b,m,points))
        iteration=range(iter_num)
        plt.plot(iteration,erro,'b--',label='误差函数梯度下降函数')
        plt.xlabel('迭代次数')
        plt.ylabel('误差')
        plt.legend()
        plt.show()
if __name__=='__main__':
    run()

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

算法总结

在线性回归问题中,一般只有一个极小值。我们定义的误差函数为凸曲线。因此无论从哪里开始,最终都会到达绝对最小值。一般来说,并非所有情况皆如此,有些函数可能存在局部极小值,普通的梯度下降搜索则有可能会陷入其中,而通过随机梯度下降(Stochastic Gradient Descent,SGD)算法,在某种程度上可缓解这种情况。除了设定明确的循环次数之外,我们也可通过其他方式(例如设定收敛条件等)来终止循环。当梯度小于某个设定值时,表明迭代已经接近函数极值,则退出迭代循环。

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

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

相关文章

我收集的PDF电子书

刚出来&#xff0c;要整理一下自己的资源了&#xff0c;好多都没有了&#xff0c;需要下载的自行联系niunanniunan.net 目录 软件工程 构建之法&#xff08;第1版&#xff09; 实现领域驱动设计 领域驱动设计&#xff1a;软件核心复杂性应对之道 人月神话 算法 算法基础…

C语言文件操作(一)

我们之前写程序&#xff0c;得到运行结果&#xff0c;退出运行&#xff0c;运行结果就不见了&#xff0c;因为运行的结果放到了内存中&#xff0c;退出程序的时候数据就会消失&#xff0c;等下一次运行又要重新输入数据&#xff0c;这样就显得很麻烦。那么我们如何保存之前的运…

Opengl ES之RGB转NV21

前言 在上一篇理论文章中我们介绍了YUV到RGB之间转换的几种公式与一些优化算法&#xff0c;今天我们再来介绍一下RGB到YUV的转换&#xff0c;顺便使用Opengl ES做个实践&#xff0c;将一张RGB的图片通过Shader 的方式转换YUV格式图&#xff0c;然后保存到本地。 可能有的童鞋…

SSL协议未开启是什么意思?

SSL协议未开启是指服务器中的服务没有开启或者没有SSL模块。在互联网中&#xff0c;数据交互传输基于http明文协议&#xff0c;随着互联网的不断发展&#xff0c;http协议展现出它的缺陷&#xff0c;通过http协议传输的数据容易被攻击者窃取、篡改或仿冒。为适应新形势下的网络…

【C语言进阶】文件操作详解

文章目录一.文件指针1.什么是文件指针2.如何使用文件指针二.文件操作函数1.流与文件2.顺序读写函数三.文本文件和二进制文件四.文件缓冲区一.文件指针 1.什么是文件指针 文件指针其实是文件类型指针的简称&#xff0c;我们常常会使用文件保存数据&#xff0c;而每个被使用的文…

SMILEtrack:基于相似度学习的多目标跟踪

文章目录摘要1、简介2、相关工作2.1、Tracking-by-Detection2.1.1、检测方法2.1.2、数据关联方法2.2、Tracking-by-Attention3、方法3.1、体系结构概述3.2.1、图像切片注意(ISA)块3.2.3、Q-K-V注意力块3.3、基于相似匹配级联(SMC)的目标跟踪算法4、实验结果4.1、数据集4.2、MOT…

XMind导入Markdown(利用Typora导出opml)

安装Xmind XMind 是一款非常实用的商业思维导图软件 首先&#xff0c;安装Xmind并打开。通过"帮助"——>“关于Xmind”&#xff0c;可以获取到当前的版本号为 XMind 8 Update 9 在"文件"——>“导入”&#xff0c;可以看到Xmind支持的导入格式仅有…

get请求和post请求

get请求 1.get请求的特点 通过一个URL来访问一个地址&#xff0c;就比如说127.0.0.1:7001,这种请求方式就是get请求&#xff0c;get请求可以直接在URL中添加参数&#xff0c;通过URL来传递参数。 优点&#xff1a;使用简单&#xff0c;清晰有条理&#xff0c;比较适合网站和…

十五天学会Autodesk Inventor,看完这一系列就够了(三),拉伸命令

众所周知&#xff0c;Autocad是一款用于二维绘图、详细绘制、设计文档和基本三维设计&#xff0c;现已经成为国际上广为流行的绘图工具。Autodesk Inventor软件也是美国AutoDesk公司推出的三维可视化实体模拟软件。因为很多人都熟悉Autocad&#xff0c;所以再学习Inventor&…

盘点2022年度A站UE神作top

A站大家都应该很熟悉了&#xff0c;在全球的CG行业都是属于专业化十分高的网站&#xff0c;平台内展示的内容包括影视、动画、娱乐等等板块&#xff0c;更是收录了众多大神艺术家的作品&#xff0c;多看看可以最直接的了解整个行业的审美趋势与技术动向。正好最近2022年A站人气…

数据结构:线性表的链式表示和实现

顺序表仅适用于不常进行插人和删除的线性表。因为在顺序存储表示的线性表中插入或删除一个数据元素,平均约需移动表中一半元素,这个缺陷是由于顺序存储要求线性表的元素依次“紧挨”存放造成的。因此对于经常需要进行插人和删除操作的线性表,就需要选择其他的存储表示方法。现在…

C进阶:文件的基础操作

本文主要讲解文件基础操作的知识。 目录 一.文件指针 二.文件的打开和关闭 1.文件的打开 打开文件我们需要使用到 fopen 函数&#xff1b; 注意&#xff08;文件扩展名&#xff09;&#xff1a; 2.文件的关闭 三.文件的读写 1.读与写&#xff0c;输出与输入的概念 ​编…

VueUse(中文)——简介

一、VueUse——简介 VueUse是由Anthony Fu等大佬写的基于Vue的自定义钩子集合。类似于基于React的 ahooks功能丰富&#xff1a;200功能无缝迁移&#xff1a;适用于Vue 3和Vue2.7版本之后支持tree shaking&#xff1a;只引入自己需要的那部分&#xff0c;打包会更小还有其他的亮…

Chrome V3版开发教程使用Vue 3.x+Ant构建项目

简介 ​ Google在2023年将会遗弃V2版本&#xff0c;而目前在CSDN平台上的大部分Chrome插件的开发教程都是基于V2版本的&#xff0c;V3版本和V2的版本上还是有很大的区别&#xff0c;就比如manifest.json中的写法差距就很大&#xff0c;所以对于即将要开发Chrome插件的小伙伴来…

机器学习的相关概念与建模流程

文章目录一、机器学习简介1. 机器学习的相关定义2. 一次简单的机器学习任务&#xff1a;鸢尾花分类二、数据与数据集相关概念1. 数据与数据集2. 特征与标签3. 连续变量和离散变量4. 模型类型三、机器学习建模一般流程1. 提出基本模型2. 确定损失函数3. 根据损失函数性质&#x…

Servlet —— Smart Tomcat,以及一些访问出错可能的原因

JavaEE传送门JavaEE HTTPS —— HTTPS的加密方式 Servlet —— Tomcat, 初学 Servlet 程序 目录Smart TomcatSmart Tomcat 的下载配置 Smart Tomcat 插件访问出错404405500无法访问此网站Smart Tomcat 在上一篇文章中, 我们手动拷贝 war 包到 Tomcat 中的过程比较麻烦, 我们…

解析 json,整理分散数据入库

【问题】在 json 文件中有以下内容&#xff1a;现在需要将 json 中分散的数据整理入库。“LIST”中包含多个子孙记录&#xff0c;主要目标是”GROUPNAME”、”SERVICES”。“GROUPNAME”值、”SERVICES”中的键编号对应了数据库表 _groups 的 Groupname 和 ID。“SERVICES”每个…

PicGo+Gitee+Typora实现markdown图床

PicGoGitee实现markdown图床 情景概要 写博客的时候&#xff0c;总是需要插入图片的&#xff0c;图片存在本地的话上传到博客网站去就没法显示了 就算一个图一个图的复制粘贴上去&#xff0c;想移植到其他的博客网站&#xff0c;图就会失效&#xff0c;我们就需要图床 图床 …

系分 - 案例分析 - 项目管理

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录系分 - 案例分析 - 项目管理时间管理进度管理典型例题题目描述参考答案系分 - 案例分析 - 项目管理 时间管理 进度管理 ① 项目进度管理包括为管理项目按时完成所需的7个过程&#xff0c;具体为&#xf…

MyBatis-Plus数据安全保护(字段脱敏)

项目创建POM依赖 <dependency><!--MyBatis-Plus 企业级模块--><groupId>com.baomidou</groupId><artifactId>mybatis-mate-starter</artifactId><version>1.2.8</version> </dependency> YML配置 spring:datasource:# 配…