最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python共軛梯度法與最速下降法之間的對(duì)比

 更新時(shí)間:2020年04月02日 16:54:13   作者:像在吹  
這篇文章主要介紹了基于Python共軛梯度法與最速下降法之間的對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

在一般問(wèn)題的優(yōu)化中,最速下降法和共軛梯度法都是非常有用的經(jīng)典方法,但最速下降法往往以”之”字形下降,速度較慢,不能很快的達(dá)到最優(yōu)值,共軛梯度法則優(yōu)于最速下降法,在前面的某個(gè)文章中,我們給出了牛頓法和最速下降法的比較,牛頓法需要初值點(diǎn)在最優(yōu)點(diǎn)附近,條件較為苛刻。

算法來(lái)源:《數(shù)值最優(yōu)化方法》高立,P111

我們選用了64維的二次函數(shù)來(lái)作為驗(yàn)證函數(shù),具體參見(jiàn)上書111頁(yè)。

采用的三種方法為:

共軛梯度方法(FR格式)、共軛梯度法(PRP格式)、最速下降法

# -*- coding: utf-8 -*-
"""
Created on Sat Oct 01 15:01:54 2016
@author: zhangweiguo
"""
import sympy,numpy
import math
import matplotlib.pyplot as pl
from mpl_toolkits.mplot3d import Axes3D as ax3
import SD#這個(gè)文件里有最速下降法SD的方法,參見(jiàn)前面的博客
#共軛梯度法FR、PRP兩種格式
def CG_FR(x0,N,E,f,f_d):
  X=x0;Y=[];Y_d=[];
  n = 1
  ee = f_d(x0)
  e=(ee[0]**2+ee[1]**2)**0.5
  d=-f_d(x0)
  Y.append(f(x0)[0,0]);Y_d.append(e)
  a=sympy.Symbol('a',real=True)
  print '第%2s次迭代:e=%f' % (n, e)
  while n<N and e>E:
    n=n+1
    g1=f_d(x0)
    f1=f(x0+a*f_d(x0))
    a0=sympy.solve(sympy.diff(f1[0,0],a,1))
    x0=x0-d*a0
    X=numpy.c_[X,x0];Y.append(f(x0)[0,0])
    ee = f_d(x0)
    e = math.pow(math.pow(ee[0,0],2)+math.pow(ee[1,0],2),0.5)
    Y_d.append(e)
    g2=f_d(x0)
    beta=(numpy.dot(g2.T,g2))/numpy.dot(g1.T,g1)
    d=-f_d(x0)+beta*d
    print '第%2s次迭代:e=%f'%(n,e)
  return X,Y,Y_d
def CG_PRP(x0,N,E,f,f_d):
  X=x0;Y=[];Y_d=[];
  n = 1
  ee = f_d(x0)
  e=(ee[0]**2+ee[1]**2)**0.5
  d=-f_d(x0)
  Y.append(f(x0)[0,0]);Y_d.append(e)
  a=sympy.Symbol('a',real=True)
  print '第%2s次迭代:e=%f' % (n, e)
  while n<N and e>E:
    n=n+1
    g1=f_d(x0)
    f1=f(x0+a*f_d(x0))
    a0=sympy.solve(sympy.diff(f1[0,0],a,1))
    x0=x0-d*a0
    X=numpy.c_[X,x0];Y.append(f(x0)[0,0])
    ee = f_d(x0)
    e = math.pow(math.pow(ee[0,0],2)+math.pow(ee[1,0],2),0.5)
    Y_d.append(e)
    g2=f_d(x0)
    beta=(numpy.dot(g2.T,g2-g1))/numpy.dot(g1.T,g1)
    d=-f_d(x0)+beta*d
    print '第%2s次迭代:e=%f'%(n,e)
  return X,Y,Y_d
if __name__=='__main__':
  '''
  G=numpy.array([[21.0,4.0],[4.0,15.0]])
  #G=numpy.array([[21.0,4.0],[4.0,1.0]])
  b=numpy.array([[2.0],[3.0]])
  c=10.0
  x0=numpy.array([[-10.0],[100.0]])
  '''
  
  m=4
  T=6*numpy.eye(m)
  T[0,1]=-1;T[m-1,m-2]=-1
  for i in xrange(1,m-1):
    T[i,i+1]=-1
    T[i,i-1]=-1
  W=numpy.zeros((m**2,m**2))
  W[0:m,0:m]=T
  W[m**2-m:m**2,m**2-m:m**2]=T
  W[0:m,m:2*m]=-numpy.eye(m)
  W[m**2-m:m**2,m**2-2*m:m**2-m]=-numpy.eye(m)
  for i in xrange(1,m-1):
    W[i*m:(i+1)*m,i*m:(i+1)*m]=T
    W[i*m:(i+1)*m,i*m+m:(i+1)*m+m]=-numpy.eye(m)
    W[i*m:(i+1)*m,i*m-m:(i+1)*m-m]=-numpy.eye(m)
  mm=m**2
  mmm=m**3
  G=numpy.zeros((mmm,mmm))
  G[0:mm,0:mm]=W;G[mmm-mm:mmm,mmm-mm:mmm]=W;
  G[0:mm,mm:2*mm]=-numpy.eye(mm)
  G[mmm-mm:mmm,mmm-2*mm:mmm-mm]=-numpy.eye(mm)
  for i in xrange(1,m-1):
    G[i*mm:(i+1)*mm,i*mm:(i+1)*mm]=W
    G[i*mm:(i+1)*mm,i*mm-mm:(i+1)*mm-mm]=-numpy.eye(mm)
    G[i*mm:(i+1)*mm,i*mm+mm:(i+1)*mm+mm]=-numpy.eye(mm)
  x_goal=numpy.ones((mmm,1))
  b=-numpy.dot(G,x_goal)
  c=0
  f = lambda x: 0.5 * (numpy.dot(numpy.dot(x.T, G), x)) + numpy.dot(b.T, x) + c
  f_d = lambda x: numpy.dot(G, x) + b
  x0=x_goal+numpy.random.rand(mmm,1)*100
  N=100
  E=10**(-6)
  print '共軛梯度PR'
  X1, Y1, Y_d1=CG_FR(x0,N,E,f,f_d)
  print '共軛梯度PBR'
  X2, Y2, Y_d2=CG_PRP(x0,N,E,f,f_d)
  figure1=pl.figure('trend')
  n1=len(Y1)
  n2=len(Y2)
  x1=numpy.arange(1,n1+1)
  x2=numpy.arange(1,n2+1)
  
  X3, Y3, Y_d3=SD.SD(x0,N,E,f,f_d)
  n3=len(Y3)
  x3=range(1,n3+1)
  pl.semilogy(x3,Y3,'g*',markersize=10,label='SD:'+str(n3))
  pl.semilogy(x1,Y1,'r*',markersize=10,label='CG-FR:'+str(n1))
  pl.semilogy(x2,Y2,'b*',markersize=10,label='CG-PRP:'+str(n2))
  pl.legend()
  #圖像顯示了三種不同的方法各自迭代的次數(shù)與最優(yōu)值變化情況,共軛梯度方法是明顯優(yōu)于最速下降法的
  pl.xlabel('n')
  pl.ylabel('f(x)')
  pl.show()

最優(yōu)值變化趨勢(shì):

從圖中可以看出,最速下降法SD的迭代次數(shù)是最多的,在與共軛梯度(FR與PRP兩種方法)的比較中,明顯較差。

補(bǔ)充知識(shí):python實(shí)現(xiàn)牛頓迭代法和二分法求平方根,精確到小數(shù)點(diǎn)后無(wú)限多位-4

首先來(lái)看一下牛頓迭代法求平方根的過(guò)程:計(jì)算3的平方根

如圖,是求根號(hào)3的牛頓迭代法過(guò)程。這里使用的初始迭代值(也就是猜測(cè)值)為1,其實(shí)可以為任何值最終都能得到結(jié)果。每次開始,先檢測(cè)猜測(cè)值是否合理,不合理時(shí),用上面的平均值來(lái)?yè)Q掉猜測(cè)值,依次繼續(xù)迭代,直到猜測(cè)值合理。

原理:現(xiàn)在取一個(gè)猜測(cè)值 a, 如果猜測(cè)值合理的話,那么就有a^2=x,即x/a=a ,x為被開方數(shù)。不合理的話呢,就用表中的猜測(cè)值和商的平均值來(lái)?yè)Q掉猜測(cè)值。當(dāng)不合理時(shí),比如 a>真實(shí)值,那么x/a<真實(shí)值,這時(shí)候取a 與 x/a 的平均值來(lái)代替a的話,那么新的a就會(huì)比原來(lái)的a要更接近真實(shí)值。同理有 a<真實(shí)值 的情況。于是,這樣不斷迭代下去最終是一個(gè)a不斷收斂到真實(shí)值的一個(gè)過(guò)程。于是不斷迭代就能得到真實(shí)值,證明了迭代法是正確的。

附上我的python代碼:

利用python整數(shù)運(yùn)算,python整數(shù)可以無(wú)限大,可以實(shí)現(xiàn)小數(shù)點(diǎn)后無(wú)限多位

#二分法求x的平方根小數(shù)點(diǎn)下任意K位數(shù)的精準(zhǔn)值,利用整數(shù)運(yùn)算 #思想:利用二分法,每次乘以10,取中間值,比較大小,從而定位精確值的范圍,將根擴(kuò)大10倍,則被開方數(shù)擴(kuò)大100倍。 #quotient(商)牛頓迭代法:先猜測(cè)一個(gè)值,再求商,然后用猜測(cè)值和商的中間值代替猜測(cè)值,擴(kuò)大倍數(shù),繼續(xù)進(jìn)行。

 
 
import math
from math import sqrt
 
def check_precision(l,h,p,len1):#檢查是否達(dá)到了精確位
  l=str(l);h=str(h)
  if len(l)<=len1+p or len(h)<=len1+p:
    return False
  for i in range(len1,p+len1):#檢查小數(shù)點(diǎn)后面的p個(gè)數(shù)是否相等
    if l[i]!=h[i]:     #當(dāng)l和h某一位不相等時(shí),說(shuō)明沒(méi)有達(dá)到精確位
      return False
  return True
 
def print_result(x,len1,p):
  x=str(x)
  if len(x)-len1<p:#沒(méi)有達(dá)到要求的精度就已經(jīng)找出根
    s=x[:len1]+"."+x[len1:]+'0'*(p-len(x)+len1)
  else:s=x[:len1]+"."+x[len1:len1+p]
  print(s)
 
def binary_sqrt(x,p):
  x0=int(sqrt(x))
  if x0*x0==x: #完全平方數(shù)直接開方,不用繼續(xù)進(jìn)行
    print_result(x0,len(str(x0)),p)
    return 
  len1=len(str(x0))#找出整數(shù)部分的長(zhǎng)度
  l=0;h=x
  while(not check_precision(l,h,p,len1)):#沒(méi)有達(dá)到精確位,繼續(xù)循環(huán)
    if not l==0:#第一次l=0,h=x時(shí)不用乘以10,直接取中間值
      h=h*10 #l,h每次擴(kuò)大10倍
      l=l*10
      x=x*100 #x每次要擴(kuò)大100倍,因?yàn)槠椒?
    m=(l+h)//2
    if m*m==x:
      return print_result(m,len1,p)
    elif m*m>x:
      h=m
    else:
      l=m
  return print_result(l,len1,p)#當(dāng)達(dá)到了要求的精度,直接返回l
 
#牛頓迭代法求平方根
def newton_sqrt(x,p):
  x0=int(sqrt(x))
  if x0*x0==x: #完全平方數(shù)直接開方,不用繼續(xù)進(jìn)行
    print_result(x0,len(str(x0)),p)
    return
  len1=len(str(x0))#找出整數(shù)部分的長(zhǎng)度
  g=1;q=x//g;g=(g+q)//2
  while(not check_precision(g,q,p,len1)):
    x=x*100
    g=g*10
    q=x//g   #求商
    g=(g+q)//2 #更新猜測(cè)值為猜測(cè)值和商的中間值
  return print_result(g,len1,p)
 
while True:  
  x=int(input("請(qǐng)輸入待開方數(shù):"))
  p=int(input("請(qǐng)輸入精度:"))
  print("binary_sqrt:",end="")
  binary_sqrt(x,p)
  print("newton_sqrt:",end="")
  newton_sqrt(x,p)

以上這篇基于Python共軛梯度法與最速下降法之間的對(duì)比就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Python Flask框架的安裝及應(yīng)用

    詳解Python Flask框架的安裝及應(yīng)用

    Flask誕生于愚人節(jié)開的一個(gè)玩笑,后來(lái)逐漸發(fā)展成為一個(gè)成熟的 Python Web框架,越來(lái)越受到開發(fā)者的喜愛(ài)。本文將以一個(gè)博客后臺(tái)為例,詳解Flask框架的安裝及應(yīng)用,需要的可以參考一下
    2022-05-05
  • 如何利用opencv訓(xùn)練自己的模型實(shí)現(xiàn)特定物體的識(shí)別

    如何利用opencv訓(xùn)練自己的模型實(shí)現(xiàn)特定物體的識(shí)別

    在Python中通過(guò)OpenCV自己訓(xùn)練分類器進(jìn)行特定物體實(shí)時(shí)識(shí)別,下面這篇文章主要給大家介紹了關(guān)于如何利用opencv訓(xùn)練自己的模型實(shí)現(xiàn)特定物體的識(shí)別,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • 修改 CentOS 6.x 上默認(rèn)Python的方法

    修改 CentOS 6.x 上默認(rèn)Python的方法

    這篇文章主要介紹了修改 CentOS 6.x 上默認(rèn)Python的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 淺談Django自定義模板標(biāo)簽template_tags的用處

    淺談Django自定義模板標(biāo)簽template_tags的用處

    這篇文章主要介紹了淺談Django自定義模板標(biāo)簽template_tags的用處,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • python實(shí)現(xiàn)簡(jiǎn)易版計(jì)算器

    python實(shí)現(xiàn)簡(jiǎn)易版計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)易版計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Tkinter使用Progressbar創(chuàng)建和管理進(jìn)度條的操作代碼

    Tkinter使用Progressbar創(chuàng)建和管理進(jìn)度條的操作代碼

    Progressbar是Tkinter庫(kù)中的一個(gè)小部件,用于創(chuàng)建和管理進(jìn)度條,這篇文章主要介紹了Tkinter使用Progressbar創(chuàng)建和管理進(jìn)度條,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Python中POST調(diào)用Restful接口示例

    Python中POST調(diào)用Restful接口示例

    這篇文章主要介紹了Python之POST調(diào)用Restful接口示例,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • Python+turtle繪制七夕表白玫瑰花

    Python+turtle繪制七夕表白玫瑰花

    七夕節(jié),又稱“七巧節(jié)”“女兒節(jié)”“乞巧節(jié)”等,是中國(guó)民間的傳統(tǒng)節(jié)日。一年一度的七夕又快到了,用Python畫一朵玫瑰花送給你的那個(gè)TA吧
    2022-08-08
  • Python搭建HTTP服務(wù)器和FTP服務(wù)器

    Python搭建HTTP服務(wù)器和FTP服務(wù)器

    這篇文章主要為大家詳細(xì)介紹了Python搭建HTTP服務(wù)器和FTP服務(wù)器的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Python 圖片文字識(shí)別的實(shí)現(xiàn)之PaddleOCR

    Python 圖片文字識(shí)別的實(shí)現(xiàn)之PaddleOCR

    OCR方向的工程師,之前一定聽(tīng)說(shuō)過(guò)PaddleOCR這個(gè)項(xiàng)目,其主要推薦的PP-OCR算法更是被國(guó)內(nèi)外企業(yè)開發(fā)者廣泛應(yīng)用,短短半年時(shí)間,累計(jì)Star數(shù)量已超過(guò)15k,頻頻登上Github Trending和Paperswithcode 日榜月榜第一
    2021-11-11

最新評(píng)論

凉山| SHOW| 兰考县| 肇源县| 平山县| 龙州县| 平罗县| 平江县| 静安区| 禹州市| 武山县| 石泉县| 申扎县| 景洪市| 四川省| 湄潭县| 南川市| 会东县| 诸城市| 乐山市| 浮梁县| 临漳县| 蒲江县| 南和县| 九龙城区| 华坪县| 建水县| 固阳县| 无极县| 凤凰县| 潞城市| 扶绥县| 柏乡县| 华坪县| 龙江县| 平武县| 大理市| 依安县| 绥滨县| 霍州市| 武城县|