<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      博客園 首頁 私信博主 顯示目錄 隱藏目錄 管理 動畫

      PageRank算法及優化 綜述報告


      PageRank算法及優化 綜述報告

      看完這些論文的感覺:Google提出了PageRank,之后十幾年 一人改一點,就能一人寫一篇論文(霧)。
      你一改 我一改 大家明天都能畢業
      但WPR(VOL)和EWPR(VOL)真的毫無創新性,上一個算法提出后隔年就發出來了,感覺好水。

      說是綜述報告,其實就是為了作業隨便寫的,隨便看看就好。


      前言

      關于PageRank的研究成果有很多,但與無權圖相比帶權圖的算法仍然較少。
      因為個人目前水平和時間問題,只對PageRank及Weighted PageRank優化方向的幾個簡單算法進行介紹。

      Simplified PageRank

      L. Page, S. Brin等1于1998年提出簡化的PageRank算法:

      \[PR(u)=c\sum_{v\in B(u)}\frac{PR(v)}{N_v} \]

      其中:\(u\)表示某個網頁,\(PR(u),PR(v)\)分別為\(u,v\)網頁的排序值(網頁的排名得分,即rank score),\(B(u)\)為連向\(u\)的網頁集合,\(N_v\)\(v\)的出度,\(c=1.0\)factor used for normalization(標準化參數?)。

      所有網頁的排序值\(PR(x)\)可以通過迭代若干次計算。
      但是,當一個網絡中存在兩個點及以上的環,且該環沒有出邊時,這個環會積累其它網頁的排序值而不會傳遞出去,使得所有連向該環的網頁的排序值變為\(0\),不合實際。這個問題叫做rank sink

      PageRank

      為解決rank sinkL. Page, S. Brin等1根據隨機游走將簡化的PageRank改為:

      \[PR(u)=(1-d)+d\sum_{v\in B(u)}\frac{PR(v)}{N_v} \]

      其中:\(d\)dampening factor(不跳出概率?),通常設為\(0.85\)

      相比Simplified PageRank,該算法考慮了用戶在瀏覽網頁時有概率跳出當前瀏覽的網頁,而任意再選擇其它網頁的情況,從而避免了rank sink
      作者測試了該算法,大概在\(O(\log n)\)次迭代后排序值會收斂。

      Weighted PageRank (WPR)

      PageRank算法的每次迭代,將每個網頁的排序值平均分給了它指向的網頁。但在實際中,同一網頁指向的不同鏈接的重要性可能不同,分到的排序值也應不同。
      Wenpu Xing, Ali Ghorbani2在2004年發表Weighted PageRank Algorithm,提出了Weighted PageRank(WPR)算法:

      \[PR(u)=(1-d)+d\sum_{v\in B(u)}PR(v)W_{(v,u)}^{in}W_{(v,u)}^{out} \]

      \(W_{(v,u)}^{in}\)表示:考慮\(u\)的入度和\(v\)連向的所有點的入度,\(v\to u\)這條邊該分配\(v\)的多少權值:

      \[W_{(v,u)}^{in}=\frac{I_u}{\sum_{p\in R(v)}I_p} \]

      其中:\(I_u\)表示\(u\)的入度,\(R(v)\)表示\(v\)連向點的集合。

      \(W_{(v,u)}^{out}\)表示:考慮\(u\)的出度和\(v\)連向的所有點的出度,\(v\to u\)這條邊該分配\(v\)的多少權值:

      \[W_{(v,u)}^{out}=\frac{O_u}{\sum_{p\in R(v)}O_p} \]

      其中:\(O_u\)表示\(u\)的出度,\(R(v)\)表示\(v\)連向點的集合。

      作者認為,一個網頁越受歡迎,連向它的網頁和它連出的網頁越多。所以WPR根據\(v\)指向網頁集合\(R(v)\)中點的出度和入度,分配\(v\)的排序值。這樣\(v\)排序值會更多地分配到更受歡迎的網頁上,而不是均分。
      作者實驗表明:將WPR用于搜索,得到的結果的相關性高于傳統PageRank算法。

      PageRank based on Visits of Links (VOL)

      Gyanendra Kumar等3在2011年發表Page Ranking Based on Number of Visits of Web Pages,提出了Page Ranking based on Visits of Links(VOL)算法:

      \[PR(u)=(1-d)+d\sum_{v\in B(u)}\frac{L_uPR(v)}{TL(v)} \]

      其中\(L_u\)表示通過鏈接\(v\to u\)訪問\(u\)的次數,\(TL(v)\)表示\(\sum_{u\in R(v)}L_u\),即通過\(v\)上的鏈接訪問其它網頁的總次數。

      該算法考慮了用戶的瀏覽傾向,根據用戶的實際瀏覽行為(鏈接的訪問數)決定哪個網頁更受歡迎,將更多的排序值分配到用戶瀏覽最多(更受歡迎)的網頁上。
      VOL與之前算法相比具有如下特點:

      1. 具有動態性,更符合網頁搜索的特性。
      2. 結果不是僅與網絡結構相關,還與用戶行為有關,更具目標導向性;而之前算法中,網頁的排序值與用戶實際訪問該網頁的情況無關。
      3. 用戶可以在搜索的同時提高該算法的準確性。
      4. 一大問題是,需要動態統計每個網頁上用戶的瀏覽行為。

      綜上,VOL比傳統PageRank的搜索結果更相關,但也帶來了具體實現的問題。

      Weighted PageRank based on Visits of Links (WPR(VOL))

      Neelam Tyagi, Simple Sharma4在2012年發表Weighted Page Rank Algorithm Based on Number of Visits of Links of Web Page,提出了Weighted PageRank based on Visits of Links(WPR(VOL))算法:

      \[WPR_{VOL}(u)=(1-d)+d\sum_{v\in B(u)}\frac{L_uWPR_{VOL}(v)W_{(v,u)}^{in}}{TL(v)} \]

      其中:\(WPR_{VOL}(u)\)是WPR(VOL)算法計算出的\(u\)的重要性\(PR(u)\)\(W_{(v,u)}^{in}\)是WPR中,考慮\(u\)的入度和\(v\)連向的所有點的入度,\(v\to u\)這條邊該分配\(v\)的多少權值:

      \[W_{(v,u)}^{in}=\frac{I_u}{\sum_{p\in R(v)}I_p} \]

      因為VOL算法中考慮了出度影響的受歡迎程度(即\(\frac{L_u}{TL(v)}\)),作者沒有使用\(W_{(v,u)}^{out}=\frac{O_u}{\sum_{p\in R(v)}O_p}\)
      該算法將WPR(網頁的受歡迎程度)與VOL(用戶的實際瀏覽行為/鏈接的訪問數)結合,按照另一種比例分配排序值。
      WPR(VOL)的特點、問題與VOL基本相同,但搜索結果相關性更強。

      但是作者在所給例子的計算過程中,\(R(u)\)\(B(u)\)搞混了,結果都是錯的,這也能發論文嗎。(下面EWPR(VOL)中這里沒有錯)

      Enhanced Weighted PageRank based on Visits of Links (EWPR(VOL))

      Sonal Tuteja5在2013年發表Enhancement in Weighted PageRank Algorithm Using VOL,對WPR(VOL)算法進行了優化:

      \[EWPR_{VOL}(u)=(1-d)+d\sum_{v\in B(u)}WPR_{VOL}(v)W_{(v,u)}^{in}W_{(v,u)}^{out} \]

      改進的原因是,作者認為WPR(VOL)算法中沒有考慮\(W_{(v,u)}^{out}\)(事實上考慮過這點),需要加上,于是就乘了個\(W_{(v,u)}^{out}\)然后發了篇新論文。
      但是,公式中的\(WPR_{VOL}\)是指WPR(VOL)還是EWPR(VOL)中的網頁排序值?

      如果是前者,那代入后完整公式應為:

      \[EWPR_{VOL}(u)=(1-d)+d\sum_{v\in B(u)}\frac{L_uEWPR_{VOL}(v)\big(W_{(v,u)}^{in}\big)^2W_{(v,u)}^{out}}{TL(v)} \]

      為什么\(W_{(v,u)}^{in}\)就要算兩次?作者沒有說明\(W^{in},W^{out}\)為什么不同。

      如果是后者,那EWPR(VOL)與WPR算法不一樣嗎?

      下面有作者給出的例子,例子與介紹VOL算法中的例子相同,包含visit of links。但是,給出的計算過程中沒有出現形如\(\frac{L_u}{TL(v)}\)的對visits的考慮。所以上面問題答案是后者,那例子中的EWPR(VOL)就是WPR(迷惑起來了)。
      然后作者給出了WPR與EWPR(VOL)在\(d\)取不同值時的不同結果,這個不同結果是如何得出來的?所以個人認為是作者的例子計算過程寫錯了,公式也有問題。
      公式應為:

      \[EWPR_{VOL}(u)=(1-d)+d\sum_{v\in B(u)}\frac{L_uEWPR_{VOL}(v)W_{(v,u)}^{in}W_{(v,u)}^{out}}{TL(v)} \]

      可能是我水平低吧,我認為這篇論文/這算法和CtrlCV沒區別,還有問題,這期刊隨便發嗎。

      局部近似算法(基于\(Push\)操作的APXPR算法)

      彭茂、張媛6在2016年發表《帶權網絡的個性化PageRank計算_彭茂》,提出了基于\(Push\)操作的PageRank計算方法,其時間復雜度優于傳統迭代算法。

      \(s\)為PageRank中各點排序值構成的向量,\(p(s)\)為計算后的\(s\)向量,\(W\)為狀態轉移矩陣,\(\alpha=1-d\)為跳出概率。則可知\(p(s)\)為如下方程的唯一解:

      \[p(s)=\alpha s+(1-\alpha)p(s)W \]

      傳統迭代算法可表示為:

      \[p^{k}=\alpha s+(1-\alpha)p^{k-1}W \]

      算法的誤差限通常定義為:\(||p^k-p^{k-1}||\leq\varepsilon\),時間復雜度為\(O\left(\frac{m\log\varepsilon}{\log(1-\alpha)}\right)\)

      作者給出了帶權圖的一個近似PageRank計算方法,復雜度上界為\(O\left(\frac{\Delta}{\varepsilon\alpha}\right)\),其中\(\Delta\)為圖頂點的最大出度。算法如下。

      \(r\)為非負向量,且對任意頂點\(v\)\(r(v)\leq\varepsilon\cdot outdgree(v)\),則稱向量\(p(s-r)\)為PageRank向量\(p(s)\)\(\varepsilon-\)近似。
      該算法持續更新一個向量對\((p,r)\),使其始終滿足:

      \[p(I-(1-\alpha)W)=\alpha(s-r) \]

      \[r=s-p\left(\frac{1}{\alpha}I-\frac{1-\alpha}{\alpha}W\right) \]

      算法初始時\(p=0,r=s\)\(p,r\)通過如下\(Push\)操作更新(\(p',r'\)\(Push\)操作后所得向量):

      對某個點\(u\)

      1. \(p'(u)=p(u)+\alpha\cdot\beta\cdot r(u)\)
      2. \(r'(u)=r(u)-\beta\cdot r(u)+(1-\alpha)w_{u,u}\cdot\beta\cdot r(u)\)
      3. \(r'(v)=r(v)+(1-\alpha)w_{u,v}\cdot\beta\cdot r(u)\)(對所有滿足\((u,v)\in E\)\(v\)
        未更新的\(p'=p,r'=r\)
        \(W=D^{-1}A=(w_{ij})_{n\times n}\)為轉移矩陣,則\(w_{u,u}=0\)\(\beta\)為預設值,默認為\(\frac12\)

      可知\(p=p(s-r)\Rightarrow p'=p(s-r')\)
      因為\(Push\)過程可以看做,\(r\)中的某些概率轉移到了\(p\)中,所以對所有滿足\(r(u)\geq\varepsilon\cdot outdgree(u)\)的點執行\(Push\)操作,可得到如下計算\(\varepsilon-\)近似PageRank向量方法:

      ApxPR(s, α, ε)
          Let p=0 and r=s
          while r(u)>ε*outdgree(u) for some vertex u
              Pick any vertex u where r(u)>ε*outdgree(u)
              Apply Push(u)
          return p and r
      

      作者證明了該APXPR算法時間復雜度為\(O\left(\frac{\Delta}{\varepsilon\alpha}\right)\),其中\(\Delta\)為圖頂點的最大出度,遠優于迭代算法的\(O\left(\frac{m\log\varepsilon}{\log(1-\alpha)}\right)\)

      該算法也支持動態帶權網絡修改,更新網絡一條邊的復雜度為\(O\left(\frac{\Delta}{\varepsilon\alpha^2}\right)\),且實際計算時間會小很多。而傳統冪迭代法只能重新計算。動態網絡的計算這里不再展開。

      此外,作者介紹了蒙特卡洛策略計算PageRank向量的方法,也支持在線更新網絡。對于一個\(n\)個頂點、\(m\)條邊的圖,保持\(m\)條邊持續更新的復雜度為\(O\left(\frac{nRf}{\alpha^2}\right)\)

      作者通過實驗得出:

      1. 靜態圖中\(Push\)算法與蒙特卡洛算法均優于冪迭代法;圖的稠密度較高時蒙特卡洛算法優于\(Push\)算法。
      2. 動態圖中,在圖的更新量較少時,\(Push\)算法優于蒙特卡洛方法。

      代碼實現

      對WPR(VOL)算法與ApxPR算法的簡單實現(節點數較小時)。
      在節點數、邊數不大時,算法實現很簡單,但當節點數很大,即現實中網頁數非常多時,可能需要改進實現方法。

      每次迭代復雜度為\(O(n+m)\)

      /*
      Sample Input:
      3 4
      1 3 2
      3 1 2
      1 2 1
      2 3 2
      Output:
      WPR[1]=0.6319057
      WPR[2]=0.2096800
      WPR[3]=0.5669479
      */
      #include <bits/stdc++.h>
      #define pc putchar
      #define gc() getchar()
      #define pb emplace_back
      typedef long long LL;
      const int N=1e3+5;
      const double d=0.85;
      
      inline int read()
      {
      	int now=0,f=1; char c=gc();
      	for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
      	for(;isdigit(c);now=now*10+c-48,c=gc());
      	return now*f;
      }
      
      struct Edge
      {
      	int v,w;
      };
      struct Graph
      {
      	std::vector<int> e[N];
      };
      struct PageRank
      {
      	Graph R,B;
      	int n,L[N][N],TL[N],I[N],O[N];
      	double WPR[N],W_in[N][N],W_out[N][N];
      	
      	void AddEdge(int w,int v,int u)
      	{
      		R.e[u].pb(v), B.e[v].pb(u);
      		++I[v], ++O[u], L[u][v]+=w, TL[u]+=w;
      	}
      	void Output()
      	{
      		for(int i=1; i<=n; ++i) printf("WPR[%d]=%.7f\n",i,WPR[i]);
      	}
      	void WPRVOL()
      	{
      		for(int u=1; u<=n; ++u)
      		{
      			double sum=0;
      			for(auto v:B.e[u]) sum+=L[v][u]*WPR[v]*W_in[v][u]/TL[v];
      			WPR[u]=1-d+d*sum;
      		}
      	}
      	void Calc()
      	{
      //Init WPR
      		for(int i=1; i<=n; ++i) WPR[i]=1;
      //Calc W_in W_out
      		for(int u=1; u<=n; ++u)
      		{
      			if(!R.e[u].size()) continue;
      			int sumI=0,sumO=0;
      			for(auto v:R/*B*/.e[u]) sumI+=I[v], sumO+=O[v];//這里WPR(VOL)論文中使用的B(u) 
      			for(auto v:R.e[u]) W_in[u][v]=1.0*I[v]/sumI, W_out[u][v]=1.0*O[v]/sumO;
      		}
      //Calc values iteratively
      		for(int T=300,t=1; t<=T; ++t)//應該有一個校驗誤差是否滿足的函數,不寫了 
      		{
      			WPRVOL();
      //			printf("\nIteration %d:\n",t), Output();
      		}
      		Output();
      	}
      	void Init()
      	{
      		n=read();
      		for(int m=read(); m--; AddEdge(read(),read(),read()));
      		Calc();
      	}
      }PR;
      
      int main()
      {
      	PR.Init();
      
      	return 0;
      }
      

      局部近似算法

      /*
      Sample Input:
      3 4
      1 3 2
      3 1 2
      1 2 1
      2 3 2
      Output:
      PR[1]=1.2303706
      PR[2]=0.4986050
      PR[3]=1.2710243
      */
      #include <bits/stdc++.h>
      #define pc putchar
      #define gc() getchar()
      #define pb emplace_back
      typedef long long LL;
      const int N=1e3+5;
      const double d=0.85;
      const double alpha=1-d, beta=0.5, epsilon=1e-8;
      
      inline int read()
      {
      	int now=0,f=1; char c=gc();
      	for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
      	for(;isdigit(c);now=now*10+c-48,c=gc());
      	return now*f;
      }
      
      struct Edge
      {
      	int v,w;
      };
      struct Graph
      {
      	std::vector<int> e[N];
      };
      struct PageRank
      {
      	Graph R,B;
      	int n,I[N],O[N],A[N][N];
      	double p[N],r[N],w[N][N];
      	
      	void AddEdge(int w,int v,int u)
      	{
      		R.e[u].pb(v), B.e[v].pb(u);
      		++I[v], ++O[u], A[u][v]+=w;
      	}
      	void Output()
      	{
      		for(int i=1; i<=n; ++i) printf("PR[%d]=%.7f\n",i,p[i]);
      	}
      	int Exist(double e)
      	{
      		for(int u=1; u<=n; ++u)
      			if(r[u]>e*O[u]) return u;
      		return 0;
      	}
      	void Push(int u,double a,double b)
      	{
      		p[u]=p[u]+a*b*r[u];
      		for(auto v:R.e[u]) r[v]=r[v]+(1-a)*w[u][v]*b*r[u];
      		r[u]=r[u]-b*r[u]+(1-a)*0*b*r[u];
      	}
      	void ApxPR(double a,double e,double b)
      	{
      //Init
      		for(int i=1; i<=n; ++i) p[i]=0, r[i]=1;
      //APXPR
      		int u;
      		while(u=Exist(e),u) Push(u,a,b);
      	}
      	void Init()
      	{
      		n=read();
      		for(int m=read(); m--; AddEdge(read(),read(),read()));
      //Calc wij
      		for(int i=1; i<=n; ++i)
      		{
      			int D=0;
      			for(int j=1; j<=n; ++j) D+=A[i][j];
      			for(int j=1; j<=n; ++j) w[i][j]=1.0*A[i][j]/D;
      		}
      //ApxPR 
      		ApxPR(alpha,epsilon,beta);
      		Output();
      	}
      }PR;
      
      int main()
      {
      	PR.Init();
      
      	return 0;
      }
      

      總結

      PageRank最初的幾個算法雖然容易理解,但在當時確實很具有創新性,比如PageRank、Weighted PageRank和PageRank based on Visits of Links。
      但是之后的提出的兩個算法 WPR(VOL)和EWPR(VOL),只是簡單地將前面的算法進行結合,沒太有創新性,且內容都有很大的錯誤,合理懷疑只是在水論文。
      除了冪迭代法,還有很多其它算法,也比迭代法更復雜、有創意。

      參考

      posted @ 2021-05-01 16:44  SovietPower  閱讀(3052)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产精品成人午夜福利| xbox免费观看高清视频的软件| 国产福利社区一区二区| 男女爽爽无遮挡午夜视频| 国产精品黄色大片在线看| 人妻av一区二区三区av免费| 天堂v亚洲国产v第一次| 亚洲中文字幕成人综合网| 亚洲一本大道无码av天堂| 亚洲精品人妻中文字幕| 麻豆国产成人AV在线播放| 人妻一区二区三区三区| 武装少女在线观看高清完整版免费| 国产成人一区二区三区在线观看| 亚洲欧洲日产国码久在线| 亚洲国产精品国自拍av| 亚洲伊人成无码综合网| 久久夜色国产噜噜亚洲av| 亚洲av在线观看| 国产亚洲人成网站在线观看| 激情国产一区二区三区四| 日本japanese丰满白浆| 三人成全免费观看电视剧高清| 国产亚洲制服免视频| 亚洲香蕉av一区二区蜜桃| 97欧美精品系列一区二区| 宁夏| 亚洲国产成人精品激情姿源| 亚洲中文在线精品国产| 亚洲开心婷婷中文字幕| 天天爽夜夜爱| 内地偷拍一区二区三区| 综合色天天久久| 一区二区三区四区亚洲自拍| 国产老熟女视频一区二区| 久久99热只有频精品8| 精品国产中文字幕懂色| 色偷偷中文在线天堂中文| 好了av四色综合无码| 色九九视频| 久久99精品国产99久久6尤物|