@Override protected void calculate(Dataset dataSet) { int nUsers = dataSet.getUserCount(); similarityValues = new double[nUsers][nUsers]; // if we want to use mapping from userId to index then generate // index for every userId if (useObjIdToIndexMapping) { for (User u : dataSet.getUsers()) { idMapping.getIndex(String.valueOf(u.getId())); } } for (int u = 0; u < nUsers; u++) { int userAId = getObjIdFromIndex(u); User userA = dataSet.getUser(userAId); for (int v = u; v < nUsers; v++) { int userBId = getObjIdFromIndex(v); User userB = dataSet.getUser(userBId); /* Collect shared ratings */ Integer[] sharedItemIds = User.getSharedItems(userA, userB); if (sharedItemIds.length > 0) { double[] ratingsA = userA.getRatingsForItemList(sharedItemIds); double[] ratingsB = userB.getRatingsForItemList(sharedItemIds); /* Center ratings by subtracting average */ double avgA = userA.getAverageRating(); double avgB = userB.getAverageRating(); for (int i = 0; i < sharedItemIds.length; i++) { ratingsA[i] = ratingsA[i] - avgA; ratingsB[i] = ratingsB[i] - avgB; } /* Calculate similarity - Pearson Correlation */ PearsonCorrelation pr = new PearsonCorrelation(ratingsA, ratingsB); similarityValues[u][v] = pr.calculate(); } else { similarityValues[u][v] = 0.0; } } } }
public MovieLensUserSimilarity(String id, Dataset ds) { this.id = id; this.useObjIdToIndexMapping = ds.isIdMappingRequired(); calculate(ds); }