天天看點

python實作模糊層次分析法(FAHP)

作者:我不愛機器學習

1 模糊層次分析法簡介

AHP通過明确問題目标,建立遞階層次結構模型,形成各級判斷矩陣,層次單排序和層次總排序等步驟計算各層次構成要素對總目标的組合權重,進而得到不同可行方案的綜合評價值,為選擇最優方案提供依據。

層次分析法的關鍵是建立判斷矩陣,其直接影響AHP的效果,但存在以下問題:

  • 當判斷矩陣的階數大于3時,很難保證矩陣一緻性。
  • 當判斷矩陣不具有一緻性時需要對元素進行調整,重新檢查,直到滿足一緻性。
  • 1-9标度法不符合人的思維,不像0.4:0.6更符合人的思維。
  • 一緻性判斷标準目前還是經驗結論,缺乏科學論證。

針對以上缺點,提出了模糊層次分析法。

FAHP分為2類:基于模糊數和基于模糊判斷矩陣。本文主要講解第二種。

FAHP和AHP思路基本一緻,但有3點不同:

  • 比較标度法不同,層次采用1-9,模糊層次采用0.1-0.9。
  • 層次通過兩兩比較得到判斷矩陣,模糊層次通過比較得到判斷矩陣。
  • 權重求解方法不同。

FAHP和AHP相比具有如下優點:模糊一緻矩陣易達到一緻性要求,且調整簡單。

  • 一緻性檢驗标準更科學可靠,且易于檢驗。
  • 0.1-0.9标度法更符合人的思維判斷方式。
  • 排序計算公式簡單。

除了以上标度法,還有0-1标度法、0.1-0.9五标度法、0.1-0.9九标度法。

2 模糊一緻判斷矩陣

在遞階層次結構模型中,每種具體的影響名額之間相對于與之相關的上一層因素的重要度是不同的。如在不同季節,不同氣象要素的影響不同。

模糊層次分析法根據模糊數學中的模糊一緻矩陣的定義,将标度法進行改進形成模糊一緻判斷矩陣。

模糊數學中定義如下:

python實作模糊層次分析法(FAHP)

FAHP根據上述定義,将1-9标度法轉換為0.1-0.9五标度法:

python實作模糊層次分析法(FAHP)

模糊一緻判斷矩陣表示針對上一層元素,本層與之有關的各元素之間的相對重要程度的比較。假設上一層元素與下一層元素相關聯,則可得到如下判斷清單:

python實作模糊層次分析法(FAHP)

數值表示元素和元素相對于元素進行比較時,元素和元素重要的程度,即可得到模糊一緻判斷矩陣:

python實作模糊層次分析法(FAHP)

模糊矩陣具有如下性質:

  • A的第i行和第i列元素之和為n。
  • A的轉置=A的餘矩陣,且兩者相等。
  • 從A中劃掉任意一行和其對應的列後所得的子矩陣仍然時模糊一緻矩陣。
  • A是模糊一緻矩陣的充要條件是任意兩行的對應元素之差為常數。

模糊判斷矩陣一緻性調整步驟:

  • 首先選擇相對重要性權重判斷比較有把握的一行作為基準行
  • 然後其他的各行分别減去基準行,若對應內插補點不完全相等,則調整該行,使內插補點全部相等為止。

3 權重求解方法

  • 方根法

設模糊一緻判斷矩陣:

python實作模糊層次分析法(FAHP)

則排序值 為:

python實作模糊層次分析法(FAHP)
python實作模糊層次分析法(FAHP)

該方法的結果同AHP的最大特征根法。

  • 行和歸一排序法
python實作模糊層次分析法(FAHP)
python實作模糊層次分析法(FAHP)
python實作模糊層次分析法(FAHP)

對R歸一化,結果同:

python實作模糊層次分析法(FAHP)
python實作模糊層次分析法(FAHP)
  • 新型權重
python實作模糊層次分析法(FAHP)

a = (n-1)/2。

4 案列

對2001和2002年的多個預測方法的電量預測值進行決策(類似權重、內建)。

1)建立層次結構模型

python實作模糊層次分析法(FAHP)

2)确定标準層對目标層的判斷矩陣

由于電量具有時間規律,是以曆史拟合度權重大于其他因素。

python實作模糊層次分析法(FAHP)

3)确定曆史拟合度判斷矩陣

根據模型預測值,看那個方法更符合趨勢或者誤差更小,那權重就大一些。

python實作模糊層次分析法(FAHP)

4)确定名額層對标準層的判斷矩陣

以經濟發展因素為例,GDP影響最大,用電方式調整影響最小。

python實作模糊層次分析法(FAHP)

5)确定方案層對目标層的判斷矩陣

以GDP對不同預測方法的判斷矩陣為例:

python實作模糊層次分析法(FAHP)

對判斷矩陣進行權重計算并組合,得到下表:

python實作模糊層次分析法(FAHP)

由表可知,FAHP預測優于單一方法。

5 python 實作

這裡隻寫了權重的計算:

# 方根法
def root_method(A):
    n = A.shape[0]
    R = np.prod(A,axis=1)**(1/n)
    W = R/R.sum()
    return W

# 行和歸一化排序法
def row_sum(A):
    n = A.shape[0]
    r = np.sum(A,axis=1)
    a = 2*(n-1)
    R = np.zeros_like(A)
    for i in range(n):
        for j in range(n):
            R[i][j] = (r[i]-r[j])/a+0.5
    R = np.sum(A,axis=1)-0.5
    W = R/R.sum()
    return W

def row_sum2(A):
    n = A.shape[0]
    alpha=1/np.square(n-1)
    beta=(n**2/2-2*n+1)/(n*(n-1)**2)
    W = alpha*(np.sum(A,axis=1))+beta
    W = W/W.sum()
    return W

# 新型權重
def new_method(A):
    n = A.shape[0]
    a = (n-1)/2
    W = 1/n-1/(2*a)+1/(n*a)*A.sum(axis=1)
    W = W/W.sum()
    return W
           

參考:層次分析法在電力負荷預測中的應用研究-趙雲飛.