国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

有限差法(Finite Difference)求梯度和Hessian Matrix(海森矩陣)的python實現(xiàn)

這篇具有很好參考價值的文章主要介紹了有限差法(Finite Difference)求梯度和Hessian Matrix(海森矩陣)的python實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

數(shù)學(xué)參考

有限差方法求導(dǎo),Finite Difference Approximations of Derivatives,是數(shù)值計算中常用的求導(dǎo)方法。數(shù)學(xué)上也比較簡單易用。本文主要針對的是向量值函數(shù),也就是 f ( x ) : R n → R f(x):\mathbb{R^n}\rightarrow \mathbb{R} f(x):RnR當(dāng)然,普通的標(biāo)量值函數(shù)是向量值函數(shù)的一種特例。

本文采用的數(shù)學(xué)參考是:有限差方法
參考的主要是Central Difference Approximations小節(jié)中的Second-order derivatives based on gradient calls的那個公式。

代碼

用法

將下面代碼中的Hessian矩陣一節(jié)中的Hessian函數(shù)直接復(fù)制到你的代碼中,然后就可以按照用法示例使用。

特別要注意,eps的選擇比較關(guān)鍵,直接決定了有限差方法的精度。建議大家根據(jù)函數(shù)參數(shù)的數(shù)量級動態(tài)的設(shè)置,例如某參數(shù)變化范圍1-10,就可以設(shè)置為0.001;而某參數(shù)變化范圍為0-0.0001,則可設(shè)置為0.000001,之類的。

用法示例

def func(x):
    x_0 = x[0]
    x_1 = x[1]
    return x_0**2 + x_1**2
hessian(func, [0,0], esp = [0.01, 0.01])

得到結(jié)果:

array([[2., 0.],
       [0., 2.]], dtype=float32)

函數(shù)主體

準(zhǔn)備

本文的方法只需要numpy包,幾乎可以說不需要任何包,而且不受到什么限制,只要滿足輸入格式就能求取,比所謂autogradnumdifftools好用的多。

梯度函數(shù)

為了求Hessian矩陣,本文采用的方法需要首先求取梯度。首先需要有一個函數(shù)func,示例的func如下:

def func(x, **args):
    x_0 = x[0]
    x_1 = x[1]
    return x_0**2 + x_1**2

該函數(shù)是一個 R 2 → R \mathbb{R^2}\rightarrow \mathbb{R} R2R的函數(shù)。將該函數(shù)輸入進下面的函數(shù)grad_func_generator中之后,就可以返回梯度函數(shù),支持在任何一點求取梯度。這里輸入x應(yīng)該是一個列表,是各個維度的輸入。例如x = [0,0].

def grad_func_generator(func, eps = 0.00001):
    def gradient_func(point):
        n_var = len(point)
        gradient = np.zeros(n_var, np.float32)
        # nth gradient
        for i in range(n_var):
            # 初始化左點和右點,同時不改變原來的展開點
            left_point = point.copy()
            right_point = point.copy()
            left_point[i] = point[i] - eps
            right_point[i] = point[i] + eps
            gradient[i] = (func(right_point) - func(left_point))/(2*eps)
        return gradient
    return gradient_func

求取梯度:

grad_f = grad_func_generator(func) # 生成梯度函數(shù)
grad_f([1,1])

可以得到結(jié)果:

array([2., 2.], dtype=float32)

Hessian矩陣

利用已經(jīng)實現(xiàn)的梯度函數(shù),可以實現(xiàn)Hessian矩陣。

# -*- coding: utf-8 -*-
# @author: Dasheng Fan
# @email: fandasheng1999@163.com

def hessian(func, point = [0, 0], eps = [0.001, 0.001]):
    """
    Hessian matrix of func at expendung point.
    """
    n_var = len(point)
    def grad_func_generator(func):
        def gradient_func(point):
            gradient = np.zeros(n_var, np.float32)
            # nth gradient
            for i in range(n_var):
                # 初始化左點和右點,同時不改變原來的展開點
                left_point = point.copy()
                right_point = point.copy()
                left_point[i] = point[i] - eps[i]
                right_point[i] = point[i] + eps[i]
                gradient[i] = (func(right_point) - func(left_point))/(2*eps[i])
            return gradient
        return gradient_func

    grad_func = grad_func_generator(func)
    hessian_matrix = np.zeros((n_var, n_var), np.float32)
    for i in range(n_var):
        for j in range(n_var):
            # 第一項
            left_point_j = point.copy()
            right_point_j = point.copy()
            right_point_j[j] = point[j] + eps[j]
            left_point_j[j] = point[j] - eps[j]
            diff_i = (grad_func(right_point_j)[i] - grad_func(left_point_j)[i])/(4*eps[j])
            # 第二項
            left_point_i = point.copy()
            right_point_i = point.copy()
            right_point_i[i] = point[i] + eps[i]
            left_point_i[i] = point[i] - eps[i]
            diff_j = (grad_func(right_point_i)[j] - grad_func(left_point_i)[j])/(4*eps[i])

            hessian_matrix[i, j] = diff_i + diff_j

    return hessian_matrix

可以通過輸入函數(shù)func和求取二階導(dǎo)數(shù)的點x,就可以輸出該點處的Hessian矩陣。

hessian(func, [0,0])

得到結(jié)果

array([[2., 0.],
       [0., 2.]], dtype=float32)

如果和numdifftools的結(jié)果對照,可以發(fā)現(xiàn)一樣。但是numdifftools非常難用,總是報錯,而且速度奇慢,如果需要循環(huán)中算,更是龜速。我們的程序只需要numpy包就能實現(xiàn),非常方便好用,速度非???。文章來源地址http://www.zghlxwxcb.cn/news/detail-778492.html

到了這里,關(guān)于有限差法(Finite Difference)求梯度和Hessian Matrix(海森矩陣)的python實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Leetcode 3115. Maximum Prime Difference

    Leetcode 3115. Maximum Prime Difference 1. 解題思路 2. 代碼實現(xiàn) 題目鏈接:3115. Maximum Prime Difference 這一題思路上非常的直接,就是找到數(shù)組當(dāng)中所有的質(zhì)數(shù)的位置,然后去首尾兩個計算位置的距離即可。 因此,問題也就變成了一個判斷任意一個數(shù)是不是素數(shù)的問題,這個就老生常談

    2024年04月16日
    瀏覽(16)
  • Python實現(xiàn)視頻運動目標(biāo)檢測——幀差法

    Python實現(xiàn)視頻運動目標(biāo)檢測——幀差法 在許多場景中,我們需要對視頻中的運動目標(biāo)進行檢測。而在這個過程中,幀差法是一種常用的方法。本文將詳細闡述Python如何利用幀差法實現(xiàn)視頻運動目標(biāo)檢測。 首先,我們需要導(dǎo)入OpenCV庫,它是一個強大的計算機視覺庫,可以用于

    2024年02月15日
    瀏覽(17)
  • (表征學(xué)習(xí)論文閱讀)FINITE SCALAR QUANTIZATION: VQ-VAE MADE SIMPLE

    (表征學(xué)習(xí)論文閱讀)FINITE SCALAR QUANTIZATION: VQ-VAE MADE SIMPLE

    向量量化(Vector Quantization)或稱為矢量量化最早在1984年由Gray提出,主要應(yīng)用于數(shù)據(jù)壓縮、檢索領(lǐng)域,具體的闡述可以參考我寫的另一篇關(guān)于VQ算法的文章。隨著基于神經(jīng)網(wǎng)絡(luò)的離散表征學(xué)習(xí)模型的興起,VQ技術(shù)也開始重新被重視。它在圖像、音頻等表征學(xué)習(xí)中體現(xiàn)出了優(yōu)秀的

    2024年04月26日
    瀏覽(14)
  • 【OpenCV】“幀差法”實現(xiàn)移動物體的檢測(車輛識別)

    【OpenCV】“幀差法”實現(xiàn)移動物體的檢測(車輛識別)

    目錄 一、幀差法 1、概念 2、為什么幀差法可以檢測運動的物體?? 二、使用OpenCV配合幀差法實現(xiàn)車輛識別 1、加載視頻 2、灰度處理+幀差計算 3、二值化 4、腐蝕 5、膨脹 6、框選出車輛 三、全部代碼+實現(xiàn)效果 1、代碼 2、車輛檢測效果 四、幀差法存在不足之處 ? ? ? ? 幀差

    2024年02月02日
    瀏覽(27)
  • ZYNQ圖像處理項目——幀差法運動目標(biāo)跟蹤

    ZYNQ圖像處理項目——幀差法運動目標(biāo)跟蹤

    幀差法顧名思義就是對輸入的前后兩幀圖像做差值,然后檢測出兩幀圖像不同的地方,并且可以實時跟蹤運動的目標(biāo)輪廓。 本設(shè)計是基于ZYNQ7010和VIVADO2018.3實現(xiàn)的幀差法運動目標(biāo)檢測,針對運動目標(biāo)檢測算法在傳統(tǒng) PC端上實時性較差的問題,設(shè)計了一種基于 ZYNQ 硬件加速的運

    2024年02月07日
    瀏覽(133)
  • Difference Between [Checkpoints ] and [state_dict]

    在PyTorch中,checkpoints 和狀態(tài)字典(state_dict)都是用于保存和加載模型參數(shù)的機制,但它們有略微不同的目的。 1. 狀態(tài)字典 ( state_dict ): 狀態(tài)字典是PyTorch提供的一個Python字典對象,將每個層的參數(shù)(權(quán)重和偏置)映射到其相應(yīng)的PyTorch張量。 它表示模型參數(shù)的當(dāng)前狀態(tài)。 通過

    2024年01月25日
    瀏覽(21)
  • c++中set_difference這個函數(shù)的意義和用法

    c++中set_difference這個函數(shù)的意義和用法

    今天正好碰到了這個函數(shù),雖然大概可以猜出這個函數(shù)的作用,但是仍然期待一個通俗易懂的解釋,網(wǎng)上搜索了一下,搜到百度百科,感覺沒有抓住重點,雖然示例也勉強可以理解,但是總感覺講究不夠直觀。 下圖綠色部分就是這個函數(shù)的功能了。 ? 于是,最終在Notion的幫

    2024年02月01日
    瀏覽(22)
  • 使用opencv結(jié)合幀差法和背景減法 檢測場景異常情況

    幀差法是一種簡單的背景減法技術(shù),用于檢測當(dāng)前幀和背景幀之間的差異。以下是使用OpenCV實現(xiàn)幀差法的Python代碼示例: 用于檢測是否下雨,漏水等情況。 要截取攝像頭的3秒時間并使用幀差法進行動態(tài)背景差異檢測,你可以使用OpenCV庫來完成這項任務(wù)。首先,你需要設(shè)置一

    2024年02月07日
    瀏覽(20)
  • leetcode - 2616. Minimize the Maximum Difference of Pairs

    You are given a 0-indexed integer array nums and an integer p. Find p pairs of indices of nums such that the maximum difference amongst all the pairs is minimized. Also, ensure no index appears more than once amongst the p pairs. Note that for a pair of elements at the index i and j, the difference of this pair is |nums[i] - nums[j]|, where |x| represents th

    2024年02月13日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包