導航:首頁 > 編程語言 > python最優化庫

python最優化庫

發布時間:2024-01-10 04:58:38

1. 如何提高python的運行效率

竅門一:關鍵代碼使用外部功能包

Python簡化了許多編程任務,但是對於一些時間敏感的任務,它的表現經常不盡人意。使用C/C++或機器語言的外部功能包處理時間敏感任務,可以有效提高應用的運行效率。這些功能包往往依附於特定的平台,因此你要根據自己所用的平台選擇合適的功能包。簡而言之,這個竅門要你犧牲應用的可移植性以換取只有通過對底層主機的直接編程才能獲得的運行效率。以下是一些你可以選擇用來提升效率的功能包:

Cython
Pylnlne
PyPy
Pyrex

這些功能包的用處各有不同。比如說,使用C語言的數據類型,可以使涉及內存操作的任務更高效或者更直觀。Pyrex就能幫助Python延展出這樣的功能。Pylnline能使你在Python應用中直接使用C代碼。內聯代碼是獨立編譯的,但是它把所有編譯文件都保存在某處,並能充分利用C語言提供的高效率。

竅門二:在排序時使用鍵

Python含有許多古老的排序規則,這些規則在你創建定製的排序方法時會佔用很多時間,而這些排序方法運行時也會拖延程序實際的運行速度。最佳的排序方法其實是盡可能多地使用鍵和內置的sort()方法。譬如,拿下面的代碼來說:

import operator
somelist = [(1, 5,]
在每段例子里,list都是根據你選擇的用作關鍵參數的索引進行排序的。這個方法不僅對數值類型有效,還同樣適用於字元串類型。

竅門三:針對循環的優化

每一種編程語言都強調最優化的循環方案。當使用Python時,你可以藉助豐富的技巧讓循環程序跑得更快。然而,開發者們經常遺忘的一個技巧是:盡量避免在循環中訪問變數的屬性。譬如,拿下面的代碼來說:

lowerlist = ['this', 'is', 'lowercase']
upper = str.upper
upperlist = []
append = upperlist.append
for word in lowerlist:
append(upper(word))
print(upperlist)
#Output = ['THIS', 'IS', 'LOWERCASE']
每次你調用str.upper, Python都會計算這個式子的值。然而,如果你把這個求值賦值給一個變數,那麼求值的結果就能提前知道,Python程序就能運行得更快。因此,關鍵就是盡可能減小Python在循環中的工作量。因為Python解釋執行的特性,在上面的例子中會大大減慢它的速度。

(注意:優化循環的方法還有很多,這只是其中之一。比如,很多程序員會認為,列表推導式是提高循環速度的最佳方法。關鍵在於,優化循環方案是提高應用程序運行速度的上佳選擇。)

竅門四:使用較新的Python版本

如果你在網上搜索Python,你會發現數不盡的信息都是關於如何升級Python版本。通常,每個版本的Python都會包含優化內容,使其運行速度優於之前的版本。但是,限制因素在於,你最喜歡的函數庫有沒有同步更新支持新的Python版本。與其爭論函數庫是否應該更新,關鍵在於新的Python版本是否足夠高效來支持這一更新。

你要保證自己的代碼在新版本里還能運行。你需要使用新的函數庫才能體驗新的Python版本,然後你需要在做出關鍵性的改動時檢查自己的應用。只有當你完成必要的修正之後,你才能體會新版本的不同。

然而,如果你只是確保自己的應用在新版本中可以運行,你很可能會錯過新版本提供的新特性。一旦你決定更新,請分析你的應用在新版本下的表現,並檢查可能出問題的部分,然後優先針對這些部分應用新版本的特性。只有這樣,用戶才能在更新之初就覺察到應用性能的改觀。

竅門五:嘗試多種編碼方法

每次創建應用時都使用同一種編碼方法幾乎無一例外會導致應用的運行效率不盡人意。可以在程序分析時嘗試一些試驗性的辦法。譬如說,在處理字典中的數據項時,你既可以使用安全的方法,先確保數據項已經存在再進行更新,也可以直接對數據項進行更新,把不存在的數據項作為特例分開處理。請看下面第一段代碼:

n = 16
myDict = {}
for i in range(0, n):
char = 'abcd'[i%4]
if char not in myDict:
myDict[char] = 0
myDict[char] += 1
print(myDict)
當一開始myDict為空時,這段代碼會跑得比較快。然而,通常情況下,myDict填滿了數據,至少填有大部分數據,這時換另一種方法會更有效率。

n = 16
myDict = {}
for i in range(0, n):
char = 'abcd'[i%4]
try:
myDict[char] += 1
except KeyError:
myDict[char] = 1
print(myDict)
在兩種方法中輸出結果都是一樣的。區別在於輸出是如何獲得的。跳出常規的思維模式,創建新的編程技巧能使你的應用更有效率。

竅門六:交叉編譯你的應用

開發者有時會忘記計算機其實並不理解用來創建現代應用程序的編程語言。計算機理解的是機器語言。為了運行你的應用,你藉助一個應用將你所編的人類可讀的代碼轉換成機器可讀的代碼。有時,你用一種諸如Python這樣的語言編寫應用,再以C++這樣的語言運行你的應用,這在運行的角度來說,是可行的。關鍵在於,你想你的應用完成什麼事情,而你的主機系統能提供什麼樣的資源。

Nuitka是一款有趣的交叉編譯器,能將你的Python代碼轉化成C++代碼。這樣,你就可以在native模式下執行自己的應用,而無需依賴於解釋器程序。你會發現自己的應用運行效率有了較大的提高,但是這會因平台和任務的差異而有所不同。

(注意:Nuitka現在還處在測試階段,所以在實際應用中請多加註意。實際上,當下最好還是把它用於實驗。此外,關於交叉編譯是否為提高運行效率的最佳方法還存在討論的空間。開發者已經使用交叉編譯多年,用來提高應用的速度。記住,每一種解決辦法都有利有弊,在把它用於生產環境之前請仔細權衡。)

在使用交叉編譯器時,記得確保它支持你所用的Python版本。Nuitka支持Python2.6, 2.7, 3.2和3.3。為了讓解決方案生效,你需要一個Python解釋器和一個C++編譯器。Nuitka支持許多C++編譯器,其中包括Microsoft Visual Studio,MinGW 和 Clang/LLVM。

交叉編譯可能造成一些嚴重問題。比如,在使用Nuitka時,你會發現即便是一個小程序也會消耗巨大的驅動空間。因為Nuitka藉助一系列的動態鏈接庫(DDLs)來執行Python的功能。因此,如果你用的是一個資源很有限的系統,這種方法或許不太可行。

2. 優化Python編程的4個妙招

1. Pandas.apply() – 特徵工程瑰寶



Pandas 庫已經非常優化了,但是大部分人都沒有發揮它的最大作用。想想它一般會用於數據科學項目中的哪些地方。一般首先能想到的就是特徵工程,即用已有特徵創造新特徵。其中最高效的方法之一就是Pandas.apply(),即Pandas中的apply函數。



在Pandas.apply()中,可以傳遞用戶定義功能並將其應用到Pandas Series的所有數據點中。這個函數是Pandas庫最好的擴展功能之一,它能根據所需條件分隔數據。之後便能將其有效應用到數據處理任務中。



2. Pandas.DataFrame.loc – Python數據操作絕妙技巧



所有和數據處理打交道的數據科學家(差不多所有人了!)都應該學會這個方法。



很多時候,數據科學家需要根據一些條件更新數據集中某列的某些值。Pandas.DataFrame.loc就是此類問題最優的解決方法。



3. Python函數向量化



另一種解決緩慢循環的方法就是將函數向量化。這意味著新建函數會應用於輸入列表,並返回結果數組。在Python中使用向量化能至少迭代兩次,從而加速計算。



事實上,這樣不僅能加速代碼運算,還能讓代碼更加簡潔清晰。



4. Python多重處理



多重處理能使系統同時支持一個以上的處理器。



此處將數據處理分成多個任務,讓它們各自獨立運行。處理龐大的數據集時,即使是apply函數也顯得有些遲緩。



關於優化Python編程的4個妙招,青藤小編就和您分享到這里了。如果您對python編程有濃厚的興趣,希望這篇文章可以為您提供幫助。如果您還想了解更多關於python編程的技巧及素材等內容,可以點擊本站的其他文章進行學習。

3. python人臉識別所用的優化演算法有什麼

python三步實現人臉識別

Face Recognition軟體包

這是世界上最簡單的人臉識別庫了。你可以通過Python引用或者命令行的形式使用它,來管理和識別人臉。

該軟體包使用dlib中最先進的人臉識別深度學習演算法,使得識別准確率在《Labled Faces in the world》測試基準下達到了99.38%。

它同時提供了一個叫face_recognition的命令行工具,以便你可以用命令行對一個文件夾中的圖片進行識別操作。

特性

在圖片中識別人臉

找到圖片中所有的人臉

這里是一個例子:

1
  • https://github.com/ageitgey/face_recognition/blob/master/examples/recognize_faces_in_picture
  • 4. 探討最受歡迎的15頂級Python庫

    1 TensorFlow(貢獻者:1757,貢獻:25756,Stars:116765)

    「TensorFlow 是一個使用數據流圖進行數值計算的開源軟體庫。圖形節點表示數學運算,而圖形邊緣表示在它們之間流動的多維數據陣列(張量)。這種靈活的體系結構使用戶可以將計算部署到桌面、伺服器或移動設備中的一個或多個 CPU/GPU,而無需重寫代碼。 」

    GitHub 地址:

    https://github.com/tensorflow/tensorflow

    2 pandas(貢獻者:1360,貢獻:18441,Stars :17388)

    「pandas 是一個 Python 包,、供快速,靈活和富有表現力的數據結構,旨在讓」關系「或」標記「數據使用既簡單又直觀。它的目標是成為用 Python 進行實際,真實數據分析的基礎高級構建塊。」

    GitHub 地址:

    https://github.com/pandas-dev/pandas

    3 scikit-learn(貢獻者:1218,貢獻者:23509,Stars :32326)

    「scikit-learn 是一個基於 NumPy,SciPy 和 matplotlib 的機器學習 Python 模塊。它為數據挖掘和數據分析提供了簡單而有效的工具。SKLearn 所有人都可用,並可在各種環境中重復使用。

    GitHub 地址:

    https://github.com/scikit-learn/scikit-learn

    4 PyTorch(貢獻者:861,貢獻:15362,Stars:22763)

    「PyTorch 是一個 Python 包,提供兩個高級功能:

    具有強大的 GPU 加速度的張量計算(如 NumPy)

    基於磁帶的自動編程系統構建的深度神經網路

    你可以重復使用自己喜歡的 Python 軟體包,如 NumPy,SciPy 和 Cython,以便在需要時擴展 PyTorch。」

    GitHub 地址:

    https://github.com/pytorch/pytorch

    5 Matplotlib(貢獻者:778,貢獻:28094,Stars :8362)

    「Matplotlib 是一個 Python 2D 繪圖庫,可以生成各種可用於出版品質的硬拷貝格式和跨平台互動式環境數據。Matplotlib 可用於 Python 腳本,Python 和 IPython shell(例如 MATLAB 或 Mathematica),Web 應用程序伺服器和各種圖形用戶界面工具包。」

    GitHub 地址:

    https://github.com/matplotlib/matplotlib

    6 Keras(貢獻者:856,貢者:4936,Stars :36450)

    「Keras 是一個高級神經網路 API,用 Python 編寫,能夠在 TensorFlow,CNTK 或 Theano 之上運行。它旨在實現快速實驗,能夠以最小的延遲把想法變成結果,這是進行研究的關鍵。」

    GitHub 地址:

    https://github.com/keras-team/keras

    7 NumPy(貢獻者:714,貢獻:19399,Stars:9010)

    「NumPy 是使用 Python 進行科學計算所需的基礎包。它提供了強大的 N 維數組對象,復雜的(廣播)功能,集成 C / C ++ 和 Fortran 代碼的工具以及有用的線性代數,傅里葉變換和隨機數功能。

    GitHub 地址:

    https://github.com/numpy/numpy

    8 SciPy(貢獻者:676,貢獻:20180,Stars:5188)

    「SciPy(發音為」Sigh Pie「)是數學、科學和工程方向的開源軟體,包含統計、優化、集成、線性代數、傅立葉變換、信號和圖像處理、ODE 求解器等模塊。」

    GitHub 地址:

    https://github.com/scipy/scipy

    9 Apache MXNet(貢獻者:653,貢獻:9060,Stars:15812)

    「Apache MXNet(孵化)是一個深度學習框架,旨在提高效率和靈活性,讓你可以混合符號和命令式編程,以最大限度地提高效率和生產力。 MXNet 的核心是一個動態依賴調度程序,可以動態地自動並行化符號和命令操作。」

    GitHub 地址:

    https://github.com/apache/incubator-mxnet

    10 Theano(貢獻者:333,貢獻:28060,Stars :8614)

    「Theano 是一個 Python 庫,讓你可以有效地定義、優化和評估涉及多維數組的數學表達式。它可以使用 GPU 並實現有效的符號區分。」

    GitHub 地址:

    https://github.com/Theano/Theano

    11 Bokeh(貢獻者:334,貢獻:17395,Stars :8649)

    「Bokeh 是一個用於 Python 的互動式可視化庫,可以在現代 Web 瀏覽器中實現美觀且有意義的數據視覺呈現。使用 Bokeh,你可以快速輕松地創建互動式圖表、儀錶板和數據應用程序。」

    GitHub 地址:

    https://github.com/bokeh/bokeh

    12 XGBoost(貢獻者:335,貢獻:3557,Stars:14389)

    「XGBoost 是一個優化的分布式梯度增強庫,旨在變得高效、強大、靈活和便攜。它在 Gradient Boosting 框架下實現機器學習演算法。XGBoost 提供了梯度提升決策樹(也稱為 GBDT,GBM),可以快速准確地解決許多數據科學問題,可以在主要的分布式環境(Hadoop,SGE,MPI)上運行相同的代碼,並可以解決數十億個示例之外的問題。」

    GitHub 地址:

    https://github.com/dmlc/xgboost

    13 Gensim(貢獻者:301,貢獻:3687,Stars :8295)

    「Gensim 是一個用於主題建模、文檔索引和大型語料庫相似性檢索的 Python 庫,目標受眾是自然語言處理(NLP)和信息檢索(IR)社區。」

    GitHub 地址:

    https://github.com/RaRe-Technologies/gensim

    14 Scrapy(貢獻者:297,貢獻:6808,Stars :30507)

    「Scrapy 是一種快速的高級 Web 爬行和 Web 抓取框架,用於抓取網站並從其頁面中提取結構化數據。它可用於從數據挖掘到監控和自動化測試的各種用途。」

    GitHub 地址:

    https://github.com/scrapy/scrapy

    15 Caffe(貢獻者:270,貢獻:4152,Stars :26531)

    「Caffe 是一個以表達、速度和模塊化為基礎的深度學習框架,由伯克利人工智慧研究(BAIR)/ 伯克利視覺與學習中心(BVLC)和社區貢獻者開發。」

    GitHub 地址:

    https://github.com/BVLC/caffe

    以上就是2018年最受歡迎的15個庫了,不知有沒有你的菜喔!希望本文對所列出的庫對你有所幫助!

    5. 用python處理一個1G左右的數據集,運行速度非常慢,怎樣優化

    給你幾點個人的建議哈:

    考慮拿C或C++重寫.

    考慮並行搞,找個hadoop集群,寫成maprece程序跑 放在hadoop上跑,更多數據都不怕.

    考慮升級機器,多搞點內存,然後東西盡量放在內存里搞.

    考慮程序優化.

    希望可以幫助到你哦,這只是我的一個建議哈!

    6. Python科學計算常用的工具包有哪些

    1、 NumPy


    NumPy幾乎是一個無法迴避的科學計算工具包,最常用的也許是它的N維數組對象,其他還包括一些成熟的函數庫,用於整合C/C++和Fortran代碼的工具包,線性代數、傅里葉變換和隨機數生成函數等。NumPy提供了兩種基本的對象:ndarray(N-dimensional array object)和 ufunc(universal function object)。ndarray是存儲單一數據類型的多維數組,而ufunc則是能夠對數組進行處理的函數。


    2、SciPy:Scientific Computing Tools for Python


    “SciPy是一個開源的Python演算法庫和數學工具包,SciPy包含的模塊有最優化、線性代數、積分、插值、特殊函數、快速傅里葉變換、信號處理和圖像處理、常微分方程求解和其他科學與工程中常用的計算。其功能與軟體MATLAB、Scilab和GNU Octave類似。 Numpy和Scipy常常結合著使用,Python大多數機器學習庫都依賴於這兩個模塊。”—-引用自“Python機器學習庫”


    3、 Matplotlib


    matplotlib 是python最著名的繪圖庫,它提供了一整套和matlab相似的命令API,十分適合互動式地進行制圖。而且也可以方便地將它作為繪圖控制項,嵌入GUI應用程序中。Matplotlib可以配合ipython shell使用,提供不亞於Matlab的繪圖體驗,總之用過了都說好。


    關於Python科學計算常用的工具包有哪些,環球青藤小編就和大家分享到這里了,學習是永無止境的,學習一項技能更是受益終身,所以,只要肯努力學,什麼時候開始都不晚。如果您還想繼續了解關於python編程的學習方法及素材等內容,可以點擊本站其他文章學習。

    7. Python怎麼做最優化

    最優化
    為什麼要做最優化呢?因為在生活中,人們總是希望幸福值或其它達到一個極值,比如做生意時希望成本最小,收入最大,所以在很多商業情境中,都會遇到求極值的情況。
    函數求根
    這里「函數的根」也稱「方程的根」,或「函數的零點」。
    先把我們需要的包載入進來。import numpy as npimport scipy as spimport scipy.optimize as optimport matplotlib.pyplot as plt%matplotlib inline
    函數求根和最優化的關系?什麼時候函數是最小值或最大值?
    兩個問題一起回答:最優化就是求函數的最小值或最大值,同時也是極值,在求一個函數最小值或最大值時,它所在的位置肯定是導數為 0 的位置,所以要求一個函數的極值,必然要先求導,使其為 0,所以函數求根就是為了得到最大值最小值。
    scipy.optimize 有什麼方法可以求根?
    可以用 scipy.optimize 中的 bisect 或 brentq 求根。f = lambda x: np.cos(x) - x # 定義一個匿名函數x = np.linspace(-5, 5, 1000) # 先生成 1000 個 xy = f(x) # 對應生成 1000 個 f(x)plt.plot(x, y); # 看一下這個函數長什麼樣子plt.axhline(0, color='k'); # 畫一根橫線,位置在 y=0

    opt.bisect(f, -5, 5) # 求取函數的根0.7390851332155535plt.plot(x, y)plt.axhline(0, color='k')plt.scatter([_], [0], c='r', s=100); # 這里的 [_] 表示上一個 Cell 中的結果,這里是 x 軸上的位置,0 是 y 上的位置

    求根有兩種方法,除了上面介紹的 bisect,還有 brentq,後者比前者快很多。%timeit opt.bisect(f, -5, 5)%timeit opt.brentq(f, -5, 5)10000 loops, best of 3: 157 s per loopThe slowest run took 11.65 times longer than the fastest. This could mean that an intermediate result is being cached.10000 loops, best of 3: 35.9 s per loop
    函數求最小化
    求最小值就是一個最優化問題。求最大值時只需對函數做一個轉換,比如加一個負號,或者取倒數,就可轉成求最小值問題。所以兩者是同一問題。
    初始值對最優化的影響是什麼?
    舉例來說,先定義個函數。f = lambda x: 1-np.sin(x)/xx = np.linspace(-20., 20., 1000)y = f(x)
    當初始值為 3 值,使用 minimize 函數找到最小值。minimize 函數是在新版的 scipy 里,取代了以前的很多最優化函數,是個通用的介面,背後是很多方法在支撐。x0 = 3xmin = opt.minimize(f, x0).x # x0 是起始點,起始點最好離真正的最小值點不要太遠plt.plot(x, y)plt.scatter(x0, f(x0), marker='o', s=300); # 起始點畫出來,用圓圈表示plt.scatter(xmin, f(xmin), marker='v', s=300); # 最小值點畫出來,用三角表示plt.xlim(-20, 20);

    初始值為 3 時,成功找到最小值。
    現在來看看初始值為 10 時,找到的最小值點。x0 = 10xmin = opt.minimize(f, x0).xplt.plot(x, y)plt.scatter(x0, f(x0), marker='o', s=300)plt.scatter(xmin, f(xmin), marker='v', s=300)plt.xlim(-20, 20);

    由上圖可見,當初始值為 10 時,函數找到的是局部最小值點,可見 minimize 的默認演算法對起始點的依賴性。
    那麼怎麼才能不管初始值在哪個位置,都能找到全局最小值點呢?
    如何找到全局最優點?
    可以使用 basinhopping 函數找到全局最優點,相關背後演算法,可以看幫助文件,有提供論文的索引和出處。
    我們設初始值為 10 看是否能找到全局最小值點。x0 = 10from scipy.optimize import basinhoppingxmin = basinhopping(f,x0,stepsize = 5).xplt.plot(x, y);plt.scatter(x0, f(x0), marker='o', s=300);plt.scatter(xmin, f(xmin), marker='v', s=300);plt.xlim(-20, 20);

    當起始點在比較遠的位置,依然成功找到了全局最小值點。
    如何求多元函數最小值?
    以二元函數為例,使用 minimize 求對應的最小值。def g(X): x,y = X return (x-1)**4 + 5 * (y-1)**2 - 2*x*yX_opt = opt.minimize(g, (8, 3)).x # (8,3) 是起始點print X_opt[ 1.88292611 1.37658521]fig, ax = plt.subplots(figsize=(6, 4)) # 定義畫布和圖形x_ = y_ = np.linspace(-1, 4, 100)X, Y = np.meshgrid(x_, y_)c = ax.contour(X, Y, g((X, Y)), 50) # 等高線圖ax.plot(X_opt[0], X_opt[1], 'r*', markersize=15) # 最小點的位置是個元組ax.set_xlabel(r"$x_1$", fontsize=18)ax.set_ylabel(r"$x_2$", fontsize=18)plt.colorbar(c, ax=ax) # colorbar 表示顏色越深,高度越高fig.tight_layout()

    畫3D 圖。from mpl_toolkits.mplot3d import Axes3Dfrom matplotlib import cmfig = plt.figure()ax = fig.gca(projection='3d')x_ = y_ = np.linspace(-1, 4, 100)X, Y = np.meshgrid(x_, y_)surf = ax.plot_surface(X, Y, g((X,Y)), rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=False)cset = ax.contour(X, Y, g((X,Y)), zdir='z',offset=-5, cmap=cm.coolwarm)fig.colorbar(surf, shrink=0.5, aspect=5);

    曲線擬合
    曲線擬合和最優化有什麼關系?
    曲線擬合的問題是,給定一組數據,它可能是沿著一條線散布的,這時要找到一條最優的曲線來擬合這些數據,也就是要找到最好的線來代表這些點,這里的最優是指這些點和線之間的距離是最小的,這就是為什麼要用最優化問題來解決曲線擬合問題。
    舉例說明,給一些點,找到一條線,來擬合這些點。
    先給定一些點:N = 50 # 點的個數m_true = 2 # 斜率b_true = -1 # 截距dy = 2.0 # 誤差np.random.seed(0)xdata = 10 * np.random.random(N) # 50 個 x,服從均勻分布ydata = np.random.normal(b_true + m_true * xdata, dy) # dy 是標准差plt.errorbar(xdata, ydata, dy, fmt='.k', ecolor='lightgray');

    上面的點整體上呈現一個線性關系,要找到一條斜線來代表這些點,這就是經典的一元線性回歸。目標就是找到最好的線,使點和線的距離最短。要優化的函數是點和線之間的距離,使其最小。點是確定的,而線是可變的,線是由參數值,斜率和截距決定的,這里就是要通過優化距離找到最優的斜率和截距。
    點和線的距離定義如下:def chi2(theta, x, y): return np.sum(((y - theta[0] - theta[1] * x)) ** 2)
    上式就是誤差平方和。
    誤差平方和是什麼?有什麼作用?
    誤差平方和公式為:
    誤差平方和大,表示真實的點和預測的線之間距離太遠,說明擬合得不好,最好的線,應該是使誤差平方和最小,即最優的擬合線,這里是條直線。
    誤差平方和就是要最小化的目標函數。
    找到最優的函數,即斜率和截距。theta_guess = [0, 1] # 初始值theta_best = opt.minimize(chi2, theta_guess, args=(xdata, ydata)).xprint(theta_best)[-1.01442005 1.93854656]
    上面兩個輸出即是預測的直線斜率和截距,我們是根據點來反推直線的斜率和截距,那麼真實的斜率和截距是多少呢?-1 和 2,很接近了,差的一點是因為有噪音的引入。xfit = np.linspace(0, 10)yfit = theta_best[0] + theta_best[1] * xfitplt.errorbar(xdata, ydata, dy, fmt='.k', ecolor='lightgray');plt.plot(xfit, yfit, '-k');

    最小二乘(Least Square)是什麼?
    上面用的是 minimize 方法,這個問題的目標函數是誤差平方和,這就又有一個特定的解法,即最小二乘。
    最小二乘的思想就是要使得觀測點和估計點的距離的平方和達到最小,這里的「二乘」指的是用平方來度量觀測點與估計點的遠近(在古漢語中「平方」稱為「二乘」),「最小」指的是參數的估計值要保證各個觀測點與估計點的距離的平方和達到最小。
    關於最小二乘估計的計算,涉及更多的數學知識,這里不想詳述,其一般的過程是用目標函數對各參數求偏導數,並令其等於 0,得到一個線性方程組。具體推導過程可參考斯坦福機器學習講義 第 7 頁。def deviations(theta, x, y): return (y - theta[0] - theta[1] * x)theta_best, ier = opt.leastsq(deviations, theta_guess, args=(xdata, ydata))print(theta_best)[-1.01442016 1.93854659]
    最小二乘 leastsq 的結果跟 minimize 結果一樣。注意 leastsq 的第一個參數不再是誤差平方和 chi2,而是誤差本身 deviations,即沒有平方,也沒有和。yfit = theta_best[0] + theta_best[1] * xfitplt.errorbar(xdata, ydata, dy, fmt='.k', ecolor='lightgray');plt.plot(xfit, yfit, '-k');

    非線性最小二乘
    上面是給一些點,擬合一條直線,擬合一條曲線也是一樣的。def f(x, beta0, beta1, beta2): # 首先定義一個非線性函數,有 3 個參數 return beta0 + beta1 * np.exp(-beta2 * x**2)beta = (0.25, 0.75, 0.5) # 先猜 3 個 betaxdata = np.linspace(0, 5, 50)y = f(xdata, *beta)ydata = y + 0.05 * np.random.randn(len(xdata)) # 給 y 加噪音def g(beta): return ydata - f(xdata, *beta) # 真實 y 和 預測值的差,求最優曲線時要用到beta_start = (1, 1, 1)beta_opt, beta_cov = opt.leastsq(g, beta_start)print beta_opt # 求到的 3 個最優的 beta 值[ 0.25525709 0.74270226 0.54966466]
    拿估計的 beta_opt 值跟真實的 beta = (0.25, 0.75, 0.5) 值比較,差不多。fig, ax = plt.subplots()ax.scatter(xdata, ydata) # 畫點ax.plot(xdata, y, 'r', lw=2) # 真實值的線ax.plot(xdata, f(xdata, *beta_opt), 'b', lw=2) # 擬合的線ax.set_xlim(0, 5)ax.set_xlabel(r"$x$", fontsize=18)ax.set_ylabel(r"$f(x, \beta)$", fontsize=18)fig.tight_layout()

    除了使用最小二乘,還可以使用曲線擬合的方法,得到的結果是一樣的。beta_opt, beta_cov = opt.curve_fit(f, xdata, ydata)print beta_opt[ 0.25525709 0.74270226 0.54966466]
    有約束的最小化
    有約束的最小化是指,要求函數最小化之外,還要滿足約束條件,舉例說明。
    邊界約束def f(X): x, y = X return (x-1)**2 + (y-1)**2 # 這是一個碗狀的函數x_opt = opt.minimize(f, (0, 0), method='BFGS').x # 無約束最優化
    假設有約束條件,x 和 y 要在一定的范圍內,如 x 在 2 到 3 之間,y 在 0 和 2 之間。bnd_x1, bnd_x2 = (2, 3), (0, 2) # 對自變數的約束x_cons_opt = opt.minimize(f, np.array([0, 0]), method='L-BFGS-B', bounds=[bnd_x1, bnd_x2]).x # bounds 矩形約束fig, ax = plt.subplots(figsize=(6, 4))x_ = y_ = np.linspace(-1, 3, 100)X, Y = np.meshgrid(x_, y_)c = ax.contour(X, Y, f((X,Y)), 50)ax.plot(x_opt[0], x_opt[1], 'b*', markersize=15) # 沒有約束下的最小值,藍色五角星ax.plot(x_cons_opt[0], x_cons_opt[1], 'r*', markersize=15) # 有約束下的最小值,紅色星星bound_rect = plt.Rectangle((bnd_x1[0], bnd_x2[0]), bnd_x1[1] - bnd_x1[0], bnd_x2[1] - bnd_x2[0], facecolor="grey")ax.add_patch(bound_rect)ax.set_xlabel(r"$x_1$", fontsize=18)ax.set_ylabel(r"$x_2$", fontsize=18)plt.colorbar(c, ax=ax)fig.tight_layout()

    不等式約束
    介紹下相關理論,先來看下存在等式約束的極值問題求法,比如下面的優化問題。
    目標函數是 f(w),下面是等式約束,通常解法是引入拉格朗日運算元,這里使用 ββ 來表示運算元,得到拉格朗日公式為
    l 是等式約束的個數。
    然後分別對 w 和ββ 求偏導,使得偏導數等於 0,然後解出 w 和βiβi,至於為什麼引入拉格朗日運算元可以求出極值,原因是 f(w) 的 dw 變化方向受其他不等式的約束,dw的變化方向與f(w)的梯度垂直時才能獲得極值,而且在極值處,f(w) 的梯度與其他等式梯度的線性組合平行,因此他們之間存在線性關系。(參考《最優化與KKT條件》)
    對於不等式約束的極值問題
    常常利用拉格朗日對偶性將原始問題轉換為對偶問題,通過解對偶問題而得到原始問題的解。該方法應用在許多統計學習方法中。有興趣的可以參閱相關資料,這里不再贅述。def f(X): return (X[0] - 1)**2 + (X[1] - 1)**2def g(X): return X[1] - 1.75 - (X[0] - 0.75)**4x_opt = opt.minimize(f, (0, 0), method='BFGS').xconstraints = [dict(type='ineq', fun=g)] # 約束採用字典定義,約束方式為不等式約束,邊界用 g 表示x_cons_opt = opt.minimize(f, (0, 0), method='SLSQP', constraints=constraints).xfig, ax = plt.subplots(figsize=(6, 4))x_ = y_ = np.linspace(-1, 3, 100)X, Y = np.meshgrid(x_, y_)c = ax.contour(X, Y, f((X, Y)), 50)ax.plot(x_opt[0], x_opt[1], 'b*', markersize=15) # 藍色星星,沒有約束下的最小值ax.plot(x_, 1.75 + (x_-0.75)**4, '', markersize=15)ax.fill_between(x_, 1.75 + (x_-0.75)**4, 3, color="grey")ax.plot(x_cons_opt[0], x_cons_opt[1], 'r*', markersize=15) # 在區域約束下的最小值ax.set_ylim(-1, 3)ax.set_xlabel(r"$x_0$", fontsize=18)ax.set_ylabel(r"$x_1$", fontsize=18)plt.colorbar(c, ax=ax)fig.tight_layout()

    scipy.optimize.minimize 中包括了多種最優化演算法,每種演算法使用范圍不同,詳細參考官方文檔。

    閱讀全文

    與python最優化庫相關的資料

    熱點內容
    為什麼開機畫面有安卓標志呢 瀏覽:315
    java數據結構和演算法分析 瀏覽:398
    怎麼理解虛擬伺服器 瀏覽:402
    黑馬程序員ai培訓課資源 瀏覽:648
    abplc加密軟體下載 瀏覽:421
    交叉編譯內核後 瀏覽:275
    php小程序100行左右 瀏覽:103
    要進行壓縮解壓的命令是 瀏覽:736
    mscod編程平台 瀏覽:520
    pdf文字轉換word文檔 瀏覽:992
    php連接mssql2005 瀏覽:894
    庫進行編譯可以嗎 瀏覽:773
    雲南石油app推薦碼哪裡看 瀏覽:457
    ipone有文件加密嗎 瀏覽:72
    蝴蝶文件夾怎麼使用 瀏覽:699
    wps文件夾安裝包在哪裡 瀏覽:439
    android2x 瀏覽:135
    知音購物app哪裡下載 瀏覽:527
    stc單片機看門狗 瀏覽:790
    單片機與計算機串口通信 瀏覽:309