在數據科學與機器學習中,我們常常需要在Python中尋找最小值,無論是尋找統計分佈的中心,還是在機器學習中的優化問題,都需要使用這種技術。
一、古典的最小化算法
Python中可以使用的最小化算法有很多,其中最古典的方法是使用梯度下降法。梯度下降算法是一個迭代算法,可以將目標函數的參數向著梯度下降的方向移動,從而找到最合適的最小值。
>>> def gradient_descent(f, df, x0, learning_rate, threshold):
... x = x0
... while True:
... gradient = df(x)
... x_new = x - learning_rate * gradient
... if abs(f(x_new) - f(x)) < threshold:
... return x_new
... x = x_new
上面是一個用Python實現的梯度下降函數。它需要我們手動輸入函數f、df、初始值x0、學習率learning_rate、收斂閾值threshold。其中f和df分別是我們需要最小化的函數和它的導數,x0是優化算法開始時的起始點,learning_rate表示我們希望調整的步長,threshold用於確定我們的算法何時停止。
二、全局最小值算法
有些時候,我們可能需要找到函數的全局最小值,這時候單純的梯度下降可能會有局部最優的問題。這時候我們可以使用全局優化算法,其中一種常用的方法是模擬退火算法。
以下是一個Python實現的模擬退火函數:
>>> import numpy as np
>>> from scipy.optimize import basinhopping
>>> x0 = np.array([1.0, 1.0, 1.0])
>>> f = lambda x: np.sin(x[0]) * np.sin(x[1]) * np.sin(x[2])
>>> minimizer_kwargs = {"method": "BFGS"}
>>> x = basinhopping(f, x0, minimizer_kwargs=minimizer_kwargs)
上面的函數可以在全局最小的情況下找到函數的最小值,其中basinhopping函數是Python SciPy庫中的一個優化器,可以找到函數的全局最小值,x0是起點初始值,f是我們需要最小化的函數,用lambda表示,minimizer_kwargs是輔助函數,BFGS是一個無約束最小化算法。
三、超參數調節
在函數優化中,超參數是指那些在算法執行過程中不能學習,需要手動輸入的參數。在梯度下降法和全局最小化法中,學習率就是一個很重要的超參數。而超參數的調節也是經驗豐富的數據科學家必備的技能。
以下是一個使用學習率調節策略的Python函數:
>>> def gradient_descent(f, df, x0, learning_rate, threshold):
... x = x0
... while True:
... gradient = df(x)
... x_new = x - learning_rate * gradient
... if abs(f(x_new) - f(x)) < threshold:
... return x_new
... x = x_new
... if abs(f(x_new) - f(x)) > 1.0:
... learning_rate /= 2
... if abs(f(x_new) - f(x)) < 0.1:
... learning_rate *= 1.1
在上面的代碼中,我們添加了一些條件判斷來動態地調整學習率。當變化較大時我們將學習率減半,而變化較小時我們將學習率增加10%。
四、總結
Python尋找最小值的方法在數據科學與機器學習中非常常見,並且有各種各樣的算法和技巧可以使用。我們可以使用梯度下降算法和全局最小化算法來尋找函數的最小值,也可以使用超參數調節技巧來調整算法的性能。
總的來說,根據我們具體的情況選擇最適合的最小化算法和技巧,可以有效地提高我們的函數計算效率,加速我們的數據探索和機器學習應用。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/305217.html