Thursday, March 18, 2010

Mahout - userRankSimilarity

 @Override
  public double userRankSimilarity(User user1, User user2) throws TasteException {
double result = 0, total = 0;
int j = 0, k = 0, l = 0, max = 0;

    if (user1 == null || user2 == null) {
      throw new IllegalArgumentException("user1 or user2 is null");
    }

    Preference[] xPrefs = user1.getPreferencesAsArray();
    Preference[] yPrefs = user2.getPreferencesAsArray();

    if (xPrefs.length == 0 || yPrefs.length == 0) {
      return Double.NaN;
    }
  
    ArrayList cxPrefs = new ArrayList();
    ArrayList cyPrefs = new ArrayList();
  
    max = xPrefs.length < yPrefs.length ? xPrefs.length : yPrefs.length;
  
    for (int i = 0; i < max; i++) {
     int compare = xPrefs[j].getItem().compareTo(yPrefs[k].getItem());
     if (compare == 0) {
     cxPrefs.add(xPrefs[j]);
     cyPrefs.add(yPrefs[k]);
     l++;
     j++;
     k++;
     } else if (compare < 0) {
     j++;
     } else if (compare > 0){
     k++;
     } else {
     System.out.println("hahah");
     }
    }
  
    //System.out.println("before");
    Object[] axPrefs = cxPrefs.toArray();
    Object[] ayPrefs = cyPrefs.toArray();
    //System.out.println("after");
  
    for (int n = 0; n < l; n++) {
     for (int m = n + 1; m < l; m++) {
     if  ((((Preference)axPrefs[n]).getValue() - ((Preference)axPrefs[m]).getValue()) * (((Preference)ayPrefs[n]).getValue() - ((Preference)ayPrefs[m]).getValue()) < 0) {
     total++;
     }
     }
    }
  
    result = 1 - (4 * total) / (l * (l - 1));
  
    return result;
  }

No comments:

Post a Comment