最近正在学习Hadoop相关的知识,参考了很多材料,如下是C#的两种实现。
目前对这个算法只是知道了运算的过程和思路,理解的还不是太深刻,我看到论坛上很多朋友算的pr值超过1,总感觉是有问题,具体哪有问题反倒倒说不好了,请知晓的朋友帮忙分析下。
附件是两种实现方式,感兴趣的朋友可以自行下来看看,有不对的地方,欢迎批评指正。
这是第二种实现的代码,我是通过判断两个矩阵的相差的范围进而判断是否退出迭代的。
C# 语言的实现,参考http://f.dataguru.cn/forum.php?mod=viewthread&tid=58606 输出结果中的S是构建的原始矩阵
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace Pagerank
- {
- public class PagerankMapReduce
- {
- const double EPS = 0.000001;//精度值设置越小,迭代的次数就越多
- const double A = 0.85;
- const int NODE_COUNT = 5;
- public void Rank()
- {
- double[,] temp = new double[NODE_COUNT, NODE_COUNT] {
- { 0,1 / 2.0, 1 / 2.0, 0, 1 / 2.0 },
- { 1 / 4.0, 0, 0, 0, 0 },
- { 1 / 4.0, 0, 0, 1, 1 / 2.0 },
- {1/4.0,1/2.0,1/2.0,0,0},
- { 1 / 4.0, 0, 0, 0, 0 } };
- double[] last_q_vec = new double[] { 0, 0, 0, 0, 0 };
- bool canBreak = false;
- int interCount = 1;
- while (!canBreak)
- {
- double[] next_q_vec = new double[] { 0, 0, 0, 0, 0 };
- for (int row = 0; row < NODE_COUNT; row++)
- {
- for (int col = 0; col < NODE_COUNT; col++)
- {
- next_q_vec[row] += temp[row, col] * last_q_vec[col];
- }
- next_q_vec[row] = A * next_q_vec[row] + (1 - A) / NODE_COUNT;
- }
- canBreak = true;
- for (int i = 0; i < last_q_vec.Length; i++)
- {
- if (Math.Abs(last_q_vec[i] - next_q_vec[i]) > EPS)
- {
- canBreak = false;
- break;
- }
- }
- if (!canBreak)
- {
- for (int i = 0; i < next_q_vec.Length; i++)
- {
- last_q_vec[i] = next_q_vec[i];
- }
- }
- interCount++;
- }
- Console.WriteLine("InterCount:{0}", interCount);
- PrintArray(last_q_vec);
- }
- public void PrintArray(double[] row)
- {
- int dimension = row.Length;
- Console.Write("[");
- for (int col = 0; col < dimension; col++)
- {
- Console.Write(string.Format("{0,8}", row[col]));
- if (col == dimension - 1)
- {
- Console.Write("]");
- }
- else
- {
- Console.Write(" ");
- }
- }
- Console.WriteLine();
- }
- }
- }
运算结果: