public class PageRank {
private BinaryData adjacencyMatrix = null;
private double threshold = 0.000000001;
private double alpha = 0.3;
private double beta = 0.6;
private double gamma = 0.1;
private UnitaryData preference = new ArrayUnitaryData(new double[]{1, 1, 1});
// initialize to a random value
private UnitaryData rank = new ArrayUnitaryData(new double[]{0, 0, 0});
private UnitaryData oldRank = new ArrayUnitaryData(new double[]{1, 1, 1});
private int length = 0;
private UnitaryData alphaPart = new ArrayUnitaryData(new double[]{1, 1, 1});
private UnitaryData betaPart = new ArrayUnitaryData(new double[]{1, 1, 1});
private UnitaryData gammaPart = new ArrayUnitaryData(new double[]{1, 1, 1});
public PageRank(BinaryData data){
((ArrayBinaryData)data).Stochastic();
adjacencyMatrix = data;
length = rank.getDimension();
}
public void Iteration(){
adjacencyMatrix.print();
// alphaPart
for (int i = 0; i < length; i++) {
alphaPart.setValue(i, alpha * rank.getValue(i));
}
// betaPart
for (int i = 0; i < length; i++) {
double temp = 0;
for (int j = 0; j < length; j++) {
temp += adjacencyMatrix.getValue(i, j) * rank.getValue(j);
}
temp *= beta;
betaPart.setValue(i, temp);
}
// gammaPart
for (int i = 0; i < length; i++) {
gammaPart.setValue(i, gamma * preference.getValue(i));
}
// sum
for (int i = 0; i < length; i++) {
rank.setValue(i, alphaPart.getValue(i) + betaPart.getValue(i) + gammaPart.getValue(i));
}
for (int j = 0; j < length; j++) {
System.out.print(rank.getValue(j));
System.out.print('\n');
}
for (int j = 0; j < length; j++) {
System.out.print(oldRank.getValue(j));
System.out.print('\n');
}
System.out.print('\n');
}
public void Run(){
for (int i = 0; i < 100; i++) {
Iteration();
if (CheckFinish()) {
break;
}
oldRank = rank.clone();
}
}
public boolean CheckFinish(){
int passed = 0;
for (int i = 0; i < length; i++) {
double diff = Math.abs(rank.getValue(i) - oldRank.getValue(i));
if (diff < threshold) {
passed += 1;
}
}
if (passed == length) {
return true;
}else {
return false;
}
}
public static void main(String[] args) {
double a[][] = {
{0, 3, 5},
{3, 0, 1},
{5, 1, 0}
};
BinaryData g = new ArrayBinaryData(a);
PageRank PR = new PageRank(g);
PR.Run();
}
}
PageRank的一个简单实现
最新推荐文章于 2020-06-01 17:07:38 发布