I’m trying out Mathematica for the first time and using TunkRank as my algorithm of choice. Here is what I came up with:
Following = {{2, 3, 4}, {0, 4}, {1, 3}, {1, 4}, {0, 2}}
Followers = {{1, 4}, {2, 3}, {0, 4}, {0, 2}, {0, 1, 3}}
p = 0.05
Influence[x_] := Influence[x] =
Sum[1 + (p * Influence[Followers[[x, i]]])/(1 +
Length[Following[[x]]]), {i, 0, Length[Followers[[x]]]}]
If you run this in Mathematica you will see that it doesn’t operate on just the follower nodes . Instead, the recursion is infinite. What am I doing wrong?
For a start, you might want to consider making
pa parameter with a default value (see documentation). Something likeInfluence[x_,p_?Positive:0.05]:= (* definition *).Second, you are setting the part specification
ito start at 0. In Mathematica, indices start at 1, not 0. You will end up getting theHeadof the object. In this case,Followers[[x,0]]will returnList. You need to change this and increment your data by 1.Third, you have some recursiveness in your data. Person 1 is followed by person 2, who is followed by 3 and 4, who are both followed by 1. So of course it is recursive.
You could consider an explicit
FixedPointtype of iteration, usingChopor theSameTestoption to prevent recursion for ever with small changes. But I doubt even that will avoid the problem with a test data set as cyclical as yours.EDIT
ok so I worked out the iterative solution. First you need to convert your followers data into an adjacency matrix.
{{0, 1, 0, 0, 1}, {0, 0, 1, 1, 0}, {1, 0, 0, 0, 1}, {1, 0, 1, 0, 0}, {1, 1, 0, 1, 0}}This gives the bit equivalent to the
Lengthstatements in your version.{2, 2, 2, 2, 3}{3, 2, 2, 2, 2}Convergence is fast.
Given the adjacency matrix, you can have a function:
Hope that helps. I assume this is giving the right answers.