假设一种简单的情况,互联网上有5个网站可供访问,分别是网站A~D,他们之间互相链接,如下图所示,例如“网站A”下面只有一个超链接“网站D”,“网站B”和“网站C”下面分别都只有超链接“网站A”,那么这些网站在搜索引擎上应该怎么进行排序呢?当然可以按照所访问的网站停留时间进行排序。这个被称作PageRank的算法是由谷歌创始人布林和佩奇提出的。
我们可以算算任意一个网站的访问可能性,例如算算小王从网站A跳到其他网站的可能性。我们假设小王在浏览网站A时有0.85的可能会点击下面的超链接,由于网站A下面只有一个超链接网站D,就是说从网站A通过超链接访问网站D的可能性是0.85乘以1,剩下0.15乘以1/5他可以直接访问网站D,所以从网站A跳到网站D的可能性为0.85*1+0.15*1/5=0.88;而0.15*1/5的机会他会浏览网站A、B、C、E。因此我们可以按这种方法算出小王从甲网站跳到乙网站的概率。
可以用矩阵来表示上图中各网站通过超链接访问的逻辑关系。n表示链接的先后次序。
下面在matlab中用蒙特卡罗方法来计算网站访问的可能性(时间比例)
numsim = 5000; % 模拟5000次
g = [0 0 0 1 0; 1 0 0 0 0; 1 0 0 0 0; 0 1 1 0 1; 0 0 1 0 0]%链接矩阵
n = length(g); %网站个数
state = 1; %系统初始状态
p = 0.85 %访问超链接的可能性
m = zeros(n,n) %生成一个nxn阶零方阵,或者说初始化可能性矩阵
for i = 1:n
for j = 1:n
m(i,j) = p*g(i,j)/sum(g(i,:)) + (1-p)/n;
end
end
pages = zeros(1,n); %网站访问次数统计
fprintf('\n\n');
fprintf('========================================\n');
fprintf('computed probabilities from %d simulations\n\n', numsim);
fprintf('simulations pageA pageB pageC pageD pageE\n');
fprintf('========================================\n');
%
for i=1:numsim
prob = rand;
if prob < m(state,1)
state = 1;
elseif prob < m(state,1) + m(state,2)
state = 2;
elseif prob < m(state,1) + m(state,2) + m(state,3)
state = 3;
elseif prob < m(state,1) + m(state,2) + m(state,3) + m(state, 4)
state = 4;
else state = 5;
end
pages(state) = pages(state) + 1;
if ~mod(i,numsim/5)
fprintf('%11d %6.3f %6.3f %6.3f %6.3f %6.3f\n', i, pages/sum(pages));
end
end
运行结果
==================================================
computed probabilities from 5000 simulations
simulations pageA pageB pageC pageD pageE
==================================================
1000 0.291 0.096 0.206 0.279 0.128
2000 0.294 0.108 0.198 0.281 0.118
3000 0.294 0.110 0.200 0.282 0.113
4000 0.294 0.110 0.201 0.284 0.112
5000 0.294 0.109 0.204 0.283 0.111