MapReduce原理——PageRank算法Java版

Page Rank就是MapReduce的来源,下文是一个简单的计算PageRank的示例。

import java.text.DecimalFormat;

/**
 * Created by jinsong.sun on 2014/7/15.
 */
public class PageRankCaculator {

    public static void main(String[] args) {
        double[][] g = calcG(genS(), 0.85);
        double[] q = genQ();

        int i = 0;
        while (i++ < 100000) {
            q = calcQ(g, q);
            printQString(q);
        }
    }

    public static double[][] genS() {
        double[] linkA = {0.00, 0.50, 0.50, 0.00, 0.50};
        double[] linkB = {0.25, 0.00, 0.00, 0.00, 0.00};
        double[] linkC = {0.25, 0.00, 0.00, 1.00, 0.50};
        double[] linkD = {0.25, 0.50, 0.50, 0.00, 0.00};
        double[] linkE = {0.25, 0.00, 0.00, 0.00, 0.00};

        return new double[][]{linkA, linkB, linkC, linkD, linkE};
    }

    public static double[] genQ() {
        return new double[] {1.00, 1.00, 1.00, 1.00, 1.00};
    }

    /**
     * 计算G矩阵。公式:G = α*S + (1-α)*(1/n)*U
     *
     * @param s     原始矩阵
     * @param alpha 权重
     * @return  G矩阵
     */
    public static double[][] calcG(double[][] s, double alpha) {
        int size = 5;
        //all one matrix
        double[][] u = {{1.00, 1.00, 1.00, 1.00, 1.00}, {1.00, 1.00, 1.00, 1.00, 1.00}
                        , {1.00, 1.00, 1.00, 1.00, 1.00}, {1.00, 1.00, 1.00, 1.00, 1.00}
                        , {1.00, 1.00, 1.00, 1.00, 1.00}};
        //计算a*S
        double[][] m1 = new double[size][size];
        for (int i = 0; i < s.length; i++) {
            for (int j = 0; j < s[i].length; j++) {
                m1[i][j] = s[i][j] * alpha;
            }
        }

        //(1-α)*(1/n)*U
        double[][] m2 = new double[size][size];
        for (int i = 0; i < u.length; i++) {
            for (int j = 0; j < u[i].length; j++) {
                DecimalFormat df = new DecimalFormat("#.0000");
                m2[i][j] = Double.parseDouble(df.format((1.0 - alpha) * (1.0 / size) * u[i][j]));
            }
        }

        //G = α*S + (1-α)*(1/n)*U
        double[][] m3 = new double[size][size];
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                m3[i][j] = m1[i][j] + m2[i][j];
                DecimalFormat df = new DecimalFormat("#.0000");
                m3[i][j] = Double.parseDouble(df.format(m3[i][j]));
            }
        }

        return m3;
    }

    /**
     * 计算特征向量。公式:q_next = G * q_curr
     *
     * @param g     G矩阵
     * @param q     特征向量
     * @return
     */
    public static double[] calcQ(double[][] g, double[] q) {
        double[] qNext = new double[g.length];
        for (int i = 0; i < g.length; i++) {
            for (int j = 0; j < g[i].length; j++) {
                qNext[i] += g[i][j] * q[j];
            }
        }
        return qNext;
    }

    public static void printQString(double[] m) {
        String s = "{ {:p00}, {:p10}, {:p20}, {:p30}, {:p40} }";
        for (int i = 0; i < 5; i++) {
            s = s.replace(":p" + i + "0", String.valueOf(m[i]));
        }
        System.out.println(s);
    }
}

MapReduce原理——PageRank算法Java版,布布扣,bubuko.com

时间: 2024-10-02 06:03:44

MapReduce原理——PageRank算法Java版的相关文章

微博URL短网址生成算法原理及(java版、php版实现实例)

短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代原来冗长的网址,让使用者可以更容易的分享链接. 例如:http://t.cn/SzjPjA 短网址服务,可能很多朋友都已经不再陌生,现在大部分微博.手机邮件提醒等地方已经有很多应用模式了,并占据了一定的市场.估计很多朋友现在也正在使用. 看过新浪的短连接服务,发现后面主要有6个字符串组成,于是第一个

扎金花大小比较算法(Java版)

注:以下算法说明仅限一副牌(不包含大小王)的情况 1.扎金花规则说明(大家都懂的,这里做简单描述): 1)玩家每人3张牌: 2)牌面大小2.3.4.5.6.7.8.9.10(用T表示),J.Q.K.A,大小依次递增: 3)牌的花色有黑桃(用H表示).红心(用X表示).梅花(用M表示).方块(用F表示),大小依次递减: 4)牌有豹子(3张牌数字大小相同).同花顺.同花(此种未实现,有兴趣的玩家可以自己加上,或者欢迎和我交流).顺子.对子.散牌几种类型,大小依次递减: 5)玩家先比牌的类型,如先按照

MapReduce实现PageRank算法(邻接矩阵法)

前言 之前写过稀疏图的实现方法,这次写用矩阵存储数据的算法实现,只要会矩阵相乘的话,实现这个就很简单了.如果有不懂的可以先看一下下面两篇随笔. MapReduce实现PageRank算法(稀疏图法) Python+MapReduce实现矩阵相乘 算法实现 我们需要输入两个矩阵A和B,我一开始想的是两个矩阵分别存在两个文件里然后分别读取,但是我发现好像不行,无法区分打上A.B的标签. 所以我一开始就把A.B矩阵合起来存在一个文件里,一次读取. mapper.py 1 #!/usr/bin/env

MapReduce 之PageRank 算法概述、设计思路和源码分析

早就对PageRank 算法感兴趣,但一直都是轮廓性的概念,没有具体深入学习.最近要学习和总结MapReduce 的实例,就又把PageRank 算法重新学习了一遍,并基于MapReduce 进行了实现. 1. PageRank是什么 PageRank,网页排名,右脚网页级别.是以Google 公司创始人Larry Page 之姓来命名.PageRank 计算每一个网页的PageRank值,并根据PageRank值的大小对网页的重要性进行排序.PageRank的基本思想是:对于一个网页A来说,链

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插

PageRank算法java实现版本

PageRank算法是Google的核心搜索算法,在所有链接型文档搜索中有极大用处,而且在我们的各种关联系统中都有好的用法,比如专家评分系统,微博搜索/排名,SNS系统等.    PageRank算法的依据或思想:     1,被重要的网页链接的越多(外链)  ,此网页就越重要     2,此网页对外的链接越少越重要     这两个依据不能是独立的,是需要一起考虑的.但是问题来了,我们怎样判断本网页的外链是很重要的呢?循环判断?那不死循环了?     解决办法是:给定阀值,让循环在此临界处停止.

A*(也叫A star, A星)寻路算法Java版

寻路算法有很多种,A*寻路算法被公认为最好的寻路算法. 首先要理解什么是A*寻路算法,可以参考这三篇文章: http://www.gamedev.net/page/resources/_/technical/artificial-intelligence/a-pathfinding-for-beginners-r2003(英文) http://www.cppblog.com/christanxw/archive/2006/04/07/5126.html(中文) http://www.cnblog

数据结构和算法(Java版)

主要内容:(内容来自互联网以及李刚著作的<突破程序员基本功的16课>) 1.数据结构:线性表.栈.队列.树&二叉树 2.算法:常用内部排序(选择.插入.交换.归并) 目录: 1. 线性表(顺序存储.链式存储单链表.双向链表)-------------2014/10/15 2. 栈(顺序栈.链栈)                                        -------------2014/10/15 线性表(顺序存储.链式存储):一对一松耦合关系.(List就是线性

AHP算法--java版

一个自己写的AHP简单算法,其实就是一些循环计算而已,记录下来,以后或许会用到: 首先了解下什么是AHP 层次分析法(Analytic Hierarchy Process,简称AHP)是美国运筹学家.匹兹堡大学T. L. Saaty教授在20世纪70年代初期提出的, AHP是对定性问题进行定量分析的一种简便.灵活而又实用的多准则决策方法.它的特点是把复杂问题中的各种因素通过划分为相互联系的有序层次,使之条理化,根据对一定客观现实的主观判断结构(主要是两两比较)把专家意见和分析者的客观判断结果直接