文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

牛顿法、梯度下降法、最小二乘法的原理以及利用它们解决实际问题的python编程

2023-06-01 23:57

关注

  牛顿法、梯度下降法、最小二乘法的原理以及利用它们解决实际问题的python编程

  一、牛顿法原理

  1、产生背景

  

牛顿法、梯度下降法、最小二乘法的原理以及利用它们解决实际问题的python编程

  2、牛顿迭代公式

  二、梯度下降法原理

  根据计算梯度时所用数据量不同,可以分为三种基本方法:批量梯度下降法(Batch Gradient Descent, BGD)、小批量梯度下降法(Mini-batch Gradient Descent, MBGD)以及随机梯度下降法(Stochastic Gradient Descent, SGD)。

  梯度下降法的一般求解框架

  三、最小二乘法原理

  最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。

  详细原理请参考:https://baike.baidu.com/item/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95/2522346#4

  四、运用梯度下降法原理解决实际问题的python编程举例

  1、问题如下

  

牛顿法、梯度下降法、最小二乘法的原理以及利用它们解决实际问题的python编程

  2、导入所需要的包

  import numpy as np

  import matplotlib.pyplot as plt

  import matplotlib as mpl

  import math

  from mpl_toolkits.mplot3d import Axes3D

  import warnings

  3、画出函数图像

  def f2(x1,x2):

  return x1 ** 2 + 2 * x2 ** 2 -4*x1- 2 * x1*x2

  X1 = np.arange(-4,4,0.2)

  X2 = np.arange(-4,4,0.2)

  X1, X2 = np.meshgrid(X1, X2) # 生成xv、yv,将X1、X2变成n*m的矩阵,方便后面绘图

  Y = np.array(list(map(lambda t : f2(t[0],t[1]),zip(X1.flatten(),X2.flatten()))))

  Y.shape = X1.shape # 1600的Y图还原成原来的(40,40)

  %matplotlib inline

  #作图

  fig = plt.figure(facecolor='w')

  ax = Axes3D(fig)

  ax.plot_surface(X1,X2,Y,rstride=1,cstride=1,cmap=plt.cm.jet)

  ax.set_title(u'$ x1 ** 2 + 2 * x2 ** 2 -4*x1- 2 * x1*x2 $')

  plt.show()

  4、求极小点和极值点

  # 解决中文显示问题

  mpl.rcParams['font.sans-serif'] = [u'SimHei']

  mpl.rcParams['axes.unicode_minus'] = False

  %matplotlib inline

  # 二维原始图像

  def f2(x, y):

  return x ** 2 + 2 * y ** 2 -4*x- 2 * x*y

  ## 偏函数

  def hx1(x, y):

  return 2*x-4-2*y

  def hx2(x, y):

  return 4*y-2*x

  x1 = 4

  x2 = 4

  alpha = 0.001

  #保存梯度下降经过的点

  GD_X1 = [x1]

  GD_X2 = [x2]

  GD_Y = [f2(x1,x2)]

  # 定义y的变化量和迭代次数

  y_change = f2(x1,x2)

  iter_num = 0

  while(iter_num < 10000) :

  tmp_x1 = x1 - alpha * hx1(x1,x2)

  tmp_x2 = x2 - alpha * hx2(x1,x2)

  tmp_y = f2(tmp_x1,tmp_x2)

  f_change = np.absolute(tmp_y - f2(x1,x2))

  x1 = tmp_x1

  x2 = tmp_x2

  GD_X1.append(x1)

  GD_X2.append(x2)

  GD_Y.append(tmp_y)

  iter_num += 1

  print(u"最终结果为:(%.5f, %.5f, %.5f)" % (x1, x2, f2(x1,x2)))

  print(u"迭代过程中X的取值,迭代次数:%d" % iter_num)

  print(GD_X1)

  # 作图

  fig = plt.figure(facecolor='w',figsize=(20,18))

  ax = Axes3D(fig)

  ax.plot_surface(X1,X2,Y,rstride=1,cstride=1,cmap=plt.cm.jet)

  ax.plot(GD_X1,GD_X2,GD_Y,'ko-')

  ax.set_xlabel('x')

  ax.set_ylabel('y')

  ax.set_zlabel('z')

  ax.set_title(u'函数;\n学习率:%.3f; 最终解:(%.3f, %.3f, %.3f);迭代次数:%d' % (alpha, x1, x2, f2(x1,x2), iter_num))

  plt.show()

  最终结果为:(4.00043, 2.00027, -8.00000)

  迭代过程中X的取值,迭代次数:10000

  从上面求出的结果可以得到极小点为(4,2),极小值为-8

  5、用Excel求上个函数的极小点和极小值

  实验结果如下图:

  依旧可以清晰地看出该函数的极小点为(4,2),极值点为-8

  五、使用梯度下降法和最小二乘法求解多元函数python编程举例

  1、问题如下

  用梯度下降法和最小二乘法根据以下图片的数据进行多元线性回归并求解相关系数

  将数据写入Excel中

  2、使用梯度下降法求解多元函数

  代码如下:

  import matplotlib.pyplot as plt

  import numpy as np

  from numpy import array

  import pandas as pd

  # 读取数据文件

  df=pd.read_csv("C:/Users/LOL/Desktop/店铺多元回归.csv")

  %matplotlib notebook

  df=df.values

  x_data=df[:,:2]

  y_data=df[:,2]

  #定义学习率、斜率、截据

  #设方程为y=theta1*x1+theta2*x2+theta0

  lr=0.00001

  theta0=0

  theta1=0

  theta2=0

  #定义最大迭代次数

  epochs=10000

  #定义最小二乘法函数-损失函数(代价函数)

  def compute_error(theta0,theta1,theta2,x_data,y_data):

  totalerror=0

  for i in range(0,len(x_data)):#定义一共有多少样本点

  totalerror=totalerror+(y_data[i]-(theta1*x_data[i,0]+theta2*x_data[i,1]+theta0))**2

  return totalerror/float(len(x_data))/2

  #梯度下降算法求解参数

  def gradient_descent_runner(x_data,y_data,theta0,theta1,theta2,lr,epochs):

  m=len(x_data)

  for i in range(epochs):

  theta0_grad=0

  theta1_grad=0

  theta2_grad=0

  for j in range(0,m):

  theta0_grad-=(1/m)*(-(theta1*x_data[j,0]+theta2*x_data[j,1]+theta2)+y_data[j])

  theta1_grad-=(1/m)*x_data[j,0]*(-(theta1*x_data[j,0]+theta2*x_data[j,1]+theta0)+y_data[j])

  theta2_grad-=(1/m)*x_data[j,1]*(-(theta1*x_data[j,0]+theta2*x_data[j,1]+theta0)+y_data[j])

  theta0=theta0-lr*theta0_grad

  theta1=theta1-lr*theta1_grad

  theta2=theta2-lr*theta2_grad

  return theta0,theta1,theta2

  #进行迭代求解郑州妇科医院 http://www.120zzkd.com/

  theta0,theta1,theta2=gradient_descent_runner(x_data,y_data,theta0,theta1,theta2,lr,epochs)

  print('迭代次数:{0} 学习率:{1}之后 a0={2},a1={3},a2={4},代价函数为{5}'.format(epochs,lr,theta0,theta1,theta2,compute_error(theta0,theta1,theta2,x_data,y_data)))

  print("多元线性回归方程为:y=",theta1,"X1+",theta2,"X2+",theta0)

  迭代次数:10000 学习率:1e-05之后 a0=5.3774162274868,a1=45.0533119768975,a2=-0.19626929358281256,代价函数为366.7314528822914

  多元线性回归方程为:y= 45.0533119768975 X1+ -0.19626929358281256 X2+ 5.3774162274868

  3、用最小二乘法求解

  代码如下:

  import numpy as np

  import pandas as pd

  #变量初始化

  X=[]

  Y=[]

  B=[]

  Q_e=0

  Q_E=0

  #从csv文件中读取数据

  def get_data(file_name):

  data=pd.read_csv(file_name,header=0)

  data=np.array(data)

  Y=data[:,data.shape[1]-1]#预测对象位于最后一列

  X=data[:,0:data.shape[1]-1]

  print(X.shape)

  return X,Y

  return X,Y

  X,Y=get_data('C:/Users/LOL/Desktop/店铺多元回归.csv')

  X=np.mat(np.c_[np.ones(X.shape[0]),X])#为系数矩阵增加常数项系数

  Y=np.mat(Y)#数组转化为矩阵

  B=np.linalg.inv(X.T*X)*(X.T)*(Y.T)

  print("第一项为常数项,其他为回归系数",B)#输出系数,第一项为常数项,其他为回归系数

  print("输入店铺面积,距离最近的车站距离,预测营业额:",np.mat([1,10,80])*B ,"万日元")#预测结果

  #相关系数

  Y_mean=np.mean(Y)

  for i in range(Y.size):

  Q_e+=pow(np.array((Y.T)[i]-X[i]*B),2)

  Q_E+=pow(np.array(X[i]*B)-Y_mean,2)

  R2=Q_E/(Q_e+Q_E)

  print("R2的值:",R2)

  (10, 2)

  第一项为常数项,其他为回归系数 [[65.32391639]

  [41.51347826]

  [-0.34088269]]

  输入店铺面积,距离最近的车站距离,预测营业额: [[453.1880841]] 万日元

  R2的值: [[0.94523585]]

  4、使用Excel求解

  由上面三种方法求到的结果对比,可以清晰地看出用最小二乘法和Excel求出的结果一致,而用梯度下降法求解有一定的误差

  六、总结

  最小二乘法:能通过最小化误差的平方和寻找数据的最佳函数匹配,但是使用有一定局限性,在回归过程中,回归的关联式不可能全部通过每个回归数据点。

  梯度下降法:是通过梯度方向和步长,直接求解目标函数的最小值时的参数,越接近最优值时,步长应该不断减小,否则会在最优值附近来回震荡。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯