public double ndcgBinary(Triple[][] paraTrainingMatrix, Triple[][] paraTestingMatrix, int paraNumItems, int paraK) {
int[] rankList;
int[] idealRatingsRankList;
int tempNumUsers = paraTrainingMatrix.length;
double resultNdcg = 0;
double resultDcg = 0;
double resultIdcg = 0;
double[] tempPredictions;
boolean[] itemsInTrainingSet = new boolean[paraNumItems];
for (int i = 0; i < paraTrainingMatrix.length; i++) {
for (int j = 0; j < paraNumItems; j++) {
itemsInTrainingSet[j] = false;
} // Of for j
// exclude items in training set.
for (int j = 0; j < paraTrainingMatrix[i].length; j++) {
itemsInTrainingSet[paraTrainingMatrix[i][j].item] = true;
} // Of for j
// predict for the items which are not in training set.
tempPredictions = new double[paraNumItems];
for (int j = 0; j < paraNumItems; j++) {
if (itemsInTrainingSet[j]) {
continue;
} // Of if
tempPredictions[j] = predict(i, j);
} // Of for j
//
rankList = findTopK(tempPredictions, itemsInTrainingSet, paraK);
idealRatingsRankList = new int[rankList.length];
int tempNumHitItems = 0;
for (int tempRank = 0; tempRank < rankList.length; tempRank++) {
int tempItem = rankList[tempRank];
for (int tempInd = 0; tempInd < paraTestingMatrix[i].length; tempInd++) {
int tempGroundTruthTestingItem = paraTestingMatrix[i][tempInd].item;
if (tempItem == tempGroundTruthTestingItem) {
idealRatingsRankList[tempNumHitItems] = tempItem;
tempNumHitItems++;
resultDcg += Math.log(2) / Math.log(tempRank + 2);
} // Of if
} // Of for tempInd
} // Of for tempRank
// Idcg
for (int tempGTRank = 0; tempGTRank < tempNumHitItems; tempGTRank++) {
resultIdcg += Math.log(2) / Math.log(tempGTRank + 2);
} // Of for tempGTRank
if(resultIdcg > 0) {
resultNdcg += resultDcg / resultIdcg;
}//of if
} // Of for i
resultNdcg /= tempNumUsers;
return resultNdcg;
}// Of ndcgBinary