乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      MapReduce在搜索引擎中一些應用

       IT技術武館 2014-07-17

      word-doc矩陣

      在進行文件分類或文檔檢索的時候,我們通常需要建立一個word-doc矩陣,來記錄每個詞在每篇文檔中出現(xiàn)的次數(shù)。

      class Mapper
          method map(docid id,doc d)
              foreach term in d
                  Emit(pair(term,id),1)

      一種更高效的方法是在mapper側進行聚合。

      class Mapper
          method map(docid id,doc d)
              H := new AssociativeArray
              foreach term in d
                  H{term} := H{term}+1
              foreach term in H
                  Emit(pair(term,id),H{term})

      圖的寬度優(yōu)先遍歷

      現(xiàn)代的爬蟲一般采用寬度優(yōu)先的規(guī)則來遍歷網(wǎng)絡。還有在Dijkstra算法中也是一種寬度優(yōu)先的規(guī)則--每發(fā)再一個新的最近點,就更新與之相鄰的節(jié)點的dist。我們可以用MapReduce迭代的方式來實現(xiàn)Dijkstra算法。每輪迭代運行一次Map-Reduce,最多迭代N次,N是圖中節(jié)點的個數(shù)。用鄰接鏈表來存儲圖。算法開始時,起始節(jié)點的dist賦0,其余的節(jié)點dist賦無窮大。先考慮簡單的情形--每條邊的權值都是1。

      class Mapper
          method map(nid n,node N)
              d := N.distance
              Emit(nid n,N)           //pass along graph structure
              foreach nodeid m in N.AdjacencyList
                  Emit(nid m,d+1)     //Emit distances to reachable nodes
                   
      class Reducer
          method reduce(nid m,[d1,d2,...])
              minDist := infinite
              M := NULL
              foreach d in [d1,d2,...]
                  if IsNode(d)
                      M := d          //recover graph structure
                  else if d<minDist    //lookup for shortest distance
                      minDist := d
              M.distance := minDist   //update shortest distance
              Emit(nid m,node M)

      在迭代式的Map-Reduce程序設計中,需要有一個driver來控制迭代的進行,檢查終止條件是否滿足。在reducer中如果所有node的minDist都沒有更新,更迭代終止。

      上面的代碼只算出了源節(jié)點到其他節(jié)點的最短路程,并沒有記錄下最短路徑,所以我們需要在更新minDist的同時記錄下它的上一個節(jié)點,mapper在輸出(nid,dist)時也應該輸出與dist對應的是哪個節(jié)點。

      上面假設任意節(jié)點間的距離都是1,當是任意值r時,只需要在mapper中輸出(nid m,d+r)就可以了。

      跟單進程的Dijkstra算法比起來,這種Map-Reduce版的算法顯然計算量大了許多,因為它每次迭代都要去檢查每一個節(jié)點的鄰居的dist是否需要更新;而單進程的Dijkstra算法通過維持一個優(yōu)先隊列,它每次迭代只需要檢查隊首元素的鄰居的dist是否需要更新。在Hadoop中,mapper和reducer通信方式非常受限,我們無法維持一個像優(yōu)先隊列這樣一種全局的數(shù)據(jù)結構。正因如此,Map-Reduce不適合于處理大規(guī)則,稠密圖。

      Page Rank

      在網(wǎng)頁排序算法中Page Rank可謂鼎鼎有名--雖然它只是Google對網(wǎng)頁進行排序的上千種因素中的一個。該算法認為一個網(wǎng)頁的重要度,由它鏈接到它的的網(wǎng)頁的重要度來決定。網(wǎng)頁重要度公式為:

      |G|中整個網(wǎng)絡當中節(jié)點的總個數(shù),α是隨機跳轉因子,L(n)是所有鉸接到網(wǎng)頁n的網(wǎng)頁的集合,C(m)是網(wǎng)頁m的出度。在網(wǎng)頁m上的一個沖浪者它以1/C(m)的概率進入網(wǎng)頁n。如何理解加式的第1項呢?一個沖浪者在瀏覽網(wǎng)頁時并不總是點擊超鏈接進行下去的,他也有可能在地址欄隨機地輸入了一個網(wǎng)址,一下子跳轉到了一個完全不相關的網(wǎng)頁。

      Page Rank算法迭代地計算每個網(wǎng)頁的重要度,實際上就是一種寬度優(yōu)先遍歷的方法。一個網(wǎng)頁從它的所有incoming網(wǎng)頁中“收集”重要度,很自然地用reducer來完成。開始時給網(wǎng)絡圖上的每個節(jié)點賦一個服從[0,1]的均勻分布的隨機值作為其重要度。Map-Reduce不斷地迭代,直到每個網(wǎng)頁的重要度都不再變化為止。

      下面的代碼簡化起見,沒有考慮公式中的第一項。

      class Mapper
          method map(nid n,node N)
              p := N.PageRank/|N.AdjacencyList|
              Emit(nid n,N)           //pass along graph structure
              foreach nodeid m in N.AdjacencyList
                  Emit(nid m,p)
                   
      class Reducer
          method reduce(nid m,[p1,p2,...])
              M := NULL
              s := 0
              foreach p in [p1,p2,...]
                  if IsNode(p)
                      M := p
                      s := M.PageRank
                  else
                      s := s+p
              M.PageRank := s
              Emit(nid m,node M)

      Graph Structure被mapper拋出,又被reducer寫入磁盤,這樣它從上一次迭代又傳遞一了下一次迭代。

       

      HMM算法

      當年李開復搞語音識別用的就是隱馬爾可夫算法,HMM在中文分詞詞性標注中也大顯威力。

      EM算法也是Machine Learning中的重要算法之一,比如HMM模型參數(shù)的確立、高斯混合模型參數(shù)的確立都要用到它。

       

      K-means算法

      K-means是一種古老且經(jīng)典的聚類算法,至今仍廣泛使用。

      class Mapper
          method setup()
              Centers[K] := ReadFromFile
          method map(docid id,doc d)
              H := new AssociativeArray
              foreach data in d
                  Centers[index] := NearestCenterToData
                  c := H{index}.left
                  s := H{index}.right
                  H{index} := Pair(c+1,s+data)
              foreach integer i in H
                  Emit(i,H{i})
                   
      class Reducer
          method reduce(integer i,pairs [p1,p2,...])
              s := 0
              c := 0
              foreach pair in [p1,p2,...]
                  s := s+pair.right
                  c := c+pair.left
              Emit(i,s/c)

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多