維基百科主要的特徵向量

https://scikit-learn.org/stable/auto_examples/applications/wikipedia_principal_eigenvector.html

強調圖中節點相對重要性的一種經典方法是計算鄰接矩陣的主要特徵向量,以便將每個特徵向量的分量值作為中心性分數分配給每個節點:

https://en.wikipedia.org/wiki/Eigenvector_centrality

在圖中的網頁和連結上,這些值被Google稱為PageRank分數, 本範例的目的為分析維基百科文章內部的鏈接圖,以根據此特徵向量中心性按相對重要性對文章進行排名。

計算主特徵向量的傳統方法是使用冪迭代方法:

https://en.wikipedia.org/wiki/Power_iteration

在這要感謝Martinsson的隨機SVD算法,才能夠在scikit-learn中實現計算。 此範例的數據是從DBpedia轉儲中獲取,DBpedia 是一項從維基百科裡萃取結構化內容的專案計畫, 這些計畫所得的結構化資訊,也將放在網際網路中公開讓人取閱。

(一)引入函式庫

引入函式庫如下: 1. bz2 import BZ2File:用bzip2格式進行壓縮 2. import os:調用操作系統命令查詢文件 3. import datetime:計算日期 4. import time:計算時間 5. numpy as np:產生陣列數值 6. from scipy import sparse:產生稀疏矩陣 7. from joblib import Memory:將資料進行暫存 8. sklearn.decomposition import randomized_svd:計算分解的隨機SVD 9. urllib.request import urlopen:開啟URL網址

(二)載入壓縮檔

* ```redirects_en.nt.bz2
  • page_links_en.nt.bz2

redirects_url = "http://downloads.dbpedia.org/3.5.1/en/redirects_en.nt.bz2"
redirects_filename = redirects_url.rsplit("/", 1)[1]

page_links_url = "http://downloads.dbpedia.org/3.5.1/en/page_links_en.nt.bz2"
page_links_filename = page_links_url.rsplit("/", 1)[1]

resources = [
    (redirects_url, redirects_filename),
    (page_links_url, page_links_filename),
]

for url, filename in resources:
    if not os.path.exists(filename):
        print("Downloading data from '%s', please wait..." % url)
        opener = urlopen(url)
        open(filename, 'wb').write(opener.read())
        print()

(三)函數設置

Transitive Closure中文譯作遞移閉包,用來紀錄由一點能不能走到另一點的關係,如果能走到,則兩點之間以邊相連。

(四)鄰接矩陣

首先,先介紹何謂稀疏矩陣,對於一個矩陣而言, 若數值為零的元素遠遠多於非零元素的個數,且非零元素分佈沒有規律時,這樣的矩陣被稱作稀疏矩陣。 此函數提取鄰接的圖作為稀疏矩陣(sparse matrix), 並使用稀疏矩陣作為鄰接矩陣。

其中運用scipy的sparse.lil_matrix建立一個稀疏矩陣。

定義鄰接矩陣之函數:

其中回傳三個值:

  • X:計算出來的稀疏矩陣。

  • redirects:python 的字典型態,存取文章名稱。

  • index_map:python 的字典型態,存取文章名稱及索引。

為了能夠在RAM中工作,5M個連結後停止。

(五)計算奇異向量

使用randomized_svd計算SVD(奇異值分解)

Output:

(六)計算主要特徵向量之分數

定義中心性分數(centrality scores)之函數,用Power 迭代法計算主要特徵向量。 這個方法也適用於知名的Google PageRank上,並實施於NetworkX project(BSD授權條款) 其版權:

Output:

(七)完整程式碼

Python source code:wikipedia_principal_eigenvector.py

https://scikit-learn.org/stable/_downloads/637afdd681404c733540858401aadf5c/wikipedia_principal_eigenvector.py

Last updated