一.模型介紹node
pagerank算法主要是根據網頁中被連接數用來給網頁進行重要性排名。算法
1.1模型解釋數據庫
模型核心:瀏覽器
a. 若是多個網頁指向某個網頁A,則網頁A的排名較高。安全
b. 若是排名高A的網頁指向某個網頁B,則網頁B的排名也較高,即網頁B的排名受指向其的網頁的排名的影響。app
名詞解釋:oop
(1)出鏈
若是在網頁A中附加了網頁B的超連接B-Link,用戶瀏覽網頁A時能夠點擊B-Link而後進入網頁B。上面這種A附有B-Link這種狀況表示A出鏈B。可知,網頁A也能夠出鏈C,若是A中也附件了網頁C的超連接C-Link。
(2)入鏈
上面經過點擊網頁A中B-Link進入B,表示由A入鏈B。若是用戶本身在瀏覽器輸入欄輸入網頁B的URL,而後進入B,表示用戶經過輸入URL入鏈B
(3)無出鏈
若是網頁A中沒有附加其餘網頁的超連接,則表示A無出鏈
(4)只對本身出鏈
若是網頁A中沒有附件其餘網頁的超連接,而只有他本身的超連接A-Link,則表示A只對本身出鏈
(5)PR值
一個網頁的PR值,機率上理解就是此網頁被訪問的機率,PR值越高其排名越高測試
網頁存在的幾種可能關係:網站
1.網頁都有出入鏈spa
此種狀況下的網頁A的PR值計算公式爲:
A的PR值由B、C來決定,而B有兩個出鏈,故爲B的PR值的一半。
2.存在網頁沒有出鏈
網頁C是沒有出鏈。由於C沒有出鏈,因此對A,B,D網頁沒有PR值的貢獻。PageRank算法的策略:從數學上考慮,爲了知足Markov鏈,設定C對A,B,C,D都有出鏈(也對他本身也出鏈~)。你也能夠理解爲:沒有出鏈的網頁,咱們強制讓他對全部的網頁都有出鏈,即讓他對全部網頁都有PR值貢獻。
此種狀況PR(A)的計算公式:
C沒有出鏈,則對全部的網頁都有貢獻,包括本身自己。
3.存在對本身出鏈的網頁
C是隻對本身出鏈的網頁。
此時訪問C時,不會傻乎乎的停留在C頁面,一直點擊C-Link循環進入C,即C網頁只對本身的網頁PR值有貢獻。正常的作法是,進入C後,存在這種狀況:在地址輸入欄輸入A/B/C/D的URL地址,而後跳轉到A/B/C/D進行瀏覽,這就是PageRank算法解決這種狀況的策略:設定存在必定機率爲α,用戶在地址欄輸入A/B/C/D地址,而後從C跳轉到A/B/C/D進行瀏覽。
此時PR(A)的計算公式爲:
通常取值α=0.85
算法公式:
通常狀況下,一個網頁的PR值計算公式爲:
注:Mpi是有出鏈到pi的全部網頁集合,L(pj)是有網頁pj的出鏈總數,N是網頁總數,α通常取值爲0.85
全部網頁PR值同時計算須要迭代計算:一直迭代計算,中止直到下面2狀況之一發生:每一個網頁的PR值先後偏差dleta_pr小於自定義偏差閾值,或者迭代次數超過了自定義的迭代次數閾值
二.實際案例
針對下圖:
進行分析:
設定每一個網站的PR值矩陣爲PR,設定矩陣S爲每一個網站的出入鏈關係,S[i][j]表示網頁j對網頁i的出鏈,可知S[i]表示全部網頁對網頁i的出鏈值,S[:,j]是網頁j對全部網頁的出鏈值。
則上圖的矩陣S爲:
則由上分析,通過式子PR=α *S*PR+(1-α)/N,迭代達到結果PR趨於穩定時即可以中止迭代:
三.Python實現
# 輸入爲一個*.txt文件,例如 # A B # B C # B A # ...表示前者指向後者 import numpy as np if __name__ == '__main__': # 讀入有向圖,存儲邊 f = open('input_1.txt', 'r') edges = [line.strip('\n').split(' ') for line in f] print(edges) # 根據邊獲取節點的集合 nodes = [] for edge in edges: if edge[0] not in nodes: nodes.append(edge[0]) if edge[1] not in nodes: nodes.append(edge[1]) print(nodes) N = len(nodes) # 將節點符號(字母),映射成阿拉伯數字,便於後面生成A矩陣/S矩陣 i = 0 node_to_num = {} for node in nodes: node_to_num[node] = i i += 1 for edge in edges: edge[0] = node_to_num[edge[0]] edge[1] = node_to_num[edge[1]] print(edges) # 生成初步的S矩陣 S = np.zeros([N, N]) for edge in edges: S[edge[1], edge[0]] = 1 print(S) # 計算比例:即一個網頁對其餘網頁的PageRank值的貢獻,即進行列的歸一化處理 for j in range(N): sum_of_col = sum(S[:,j]) for i in range(N): S[i, j] /= sum_of_col print(S) # 計算矩陣A alpha = 0.85 A = alpha*S + (1-alpha) / N * np.ones([N, N]) print(A) # 生成初始的PageRank值,記錄在P_n中,P_n和P_n1均用於迭代 P_n = np.ones(N) / N P_n1 = np.zeros(N) e = 100000 # 偏差初始化 k = 0 # 記錄迭代次數 print('loop...') while e > 0.00000001: # 開始迭代 P_n1 = np.dot(A, P_n) # 迭代公式 e = P_n1-P_n e = max(map(abs, e)) # 計算偏差 P_n = P_n1 k += 1 print('iteration %s:'%str(k), P_n1) print('final result:', P_n)
讀取文件爲:
A B
A C
A D
B D
C E
D E
B E
E A
結果爲:
可視化代碼:
import networkx as nx import matplotlib.pyplot as plt if __name__ == '__main__': # 讀入有向圖,存儲邊 f = open('input_1.txt', 'r') edges = [line.strip('\n').split(' ') for line in f] G = nx.DiGraph() for edge in edges: G.add_edge(edge[0], edge[1]) nx.draw(G, with_labels=True) plt.show()
結果以下:
四.模型實戰
題目以下:
背景:美國正在經歷關於使用合成和非合成阿片類藥物的國家危機,不管是治療和管理疼痛(法律,處方用途)仍是用於娛樂目的(非法,非處方用途)。美國疾病控制中心(CDC)等聯邦組織正在努力「拯救生命並預防這種流行病對健康的負面影響,例如阿片類藥物使用障礙,肝炎和艾滋病毒感染以及新生兒戒斷綜合症。」1簡單地執行現行法律對於聯邦調查局(FBI)和美國緝毒局(DEA)等來講,這是一項複雜的挑戰。
對美國經濟的重要部門也有影響。例如,若是阿片類藥物危機擴散到美國人口的全部橫截面(包括受過大學教育的人和具備高級學位的人),那麼企業須要精確的勞動技能,高技術組件裝配以及與客戶的敏感信任或安全關係。客戶可能難以填補這些職位。此外,若是老年人中阿片類藥物成癮的比例增長,醫療保健費用和輔助生活設施的人員配置也將受到影響。
DEA /國家法醫實驗室信息系統(NFLIS)做爲緝毒局(DEA)轉移控制辦公室的一部分,發佈了一份數據密集的年度報告,涉及「聯邦,州分析的藥物鑑定結果和相關信息」和當地的法醫實驗室。「 NFLIS內的數據庫包括來自犯罪實驗室的數據,這些數據處理了該國估計每一年120萬州和地方毒品案件的88%。對於這個問題,咱們關注位於美國五(5)個州的個別縣:俄亥俄州,肯塔基州,西弗吉尼亞州,弗吉尼亞州和田納西州。在美國,一個縣是每一個擁有稅收權力的州下面的下一級政府。提供此問題描述的是幾個供您使用的數據集。第一份文件(MCM_NFLIS_Data.xlsx)包含2010-2017年麻醉鎮痛藥(合成阿片類藥物)和海洛因的藥物鑑定計數,這些藥物來自這五個州的每一個縣,由各州的犯罪實驗室向DEA報告。當執法機構向犯罪實驗室提交證據做爲刑事調查的一部分而且實驗室的法醫科學家對證據進行檢驗時,就會發生藥物鑑定。一般,當執法機構提交這些樣本時,他們會提供位置數據(縣)及其事故報告。當證據提交給犯罪實驗室而且未提供此位置數據時,犯罪實驗室使用提交案件的市/縣/州調查執法組織的位置。出於此問題的目的,您能夠假設縣位置數據是正確的。其餘七(7)個文件是壓縮文件夾,其中包含美國人口普查局的摘錄,這些摘錄表明了2010-2016每一年中爲這五個州的縣收集的一組共同的社會經濟因素(ACS_xx_5YR_DP02.zip)。 (注:2017年沒有相同的數據。)
每一個數據集都有一個代碼表,用於定義所記錄的每一個變量。雖然您可使用其餘資源進行研究和背景信息,但提供的數據集包含您應該使用的惟一數據來解決此問題。
問題:
第1部分。使用提供的NFLIS數據,創建一個數學模型來描述五個州及其縣之間和之間報告的合成阿片類藥物和海洛因事件(病例)的傳播和特徵。使用您的模型,肯定在五種狀態中每種狀態下可能已開始使用特定阿片類藥物的任何可能位置。若是您的團隊肯定的模式和特徵繼續存在,那麼美國是否存在任何具體問題。
政府應該有?在這些藥物識別閾值水平發生這些狀況?您的模型什麼時候何地預測它們未來會發生?
第2部分。使用美國人口普查提供的社會經濟數據,解決如下問題:
有許多相互競爭的假設被提供做爲阿片類藥物使用如何達到目前水平的解釋,使用/濫用阿片類藥物,促使阿片類藥物使用和成癮增加的緣由,以及爲何阿片類藥物的使用仍然存在已知的危險。是否使用或使用趨勢與提供的任何美國人口普查社會經濟數據有關?若是是這樣,請從第1部分修改模型以包含此數據集中的任何重要因素。第3部分。最後,結合您的第1部分和第2部分結果,肯定可能的對抗阿片類藥物危機的策略。使用您的模型來測試該策略的有效性;識別成功(或失敗)所依賴的任何重要參數界限。除了主要報告以外,還要向首席管理員提供1-2頁的備忘錄,DEA / NFLIS數據庫,總結您在此建模過程當中發現的任何重要看法或結果。
解決標註黃色部分的問題,預測在何處會發生阿片和海洛因類藥物的出現。