com.planetj.taste.impl.recommender.slopeone
Class SlopeOneRecommender

java.lang.Object
  extended by com.planetj.taste.impl.recommender.AbstractRecommender
      extended by com.planetj.taste.impl.recommender.slopeone.SlopeOneRecommender
All Implemented Interfaces:
Refreshable, Recommender

public final class SlopeOneRecommender
extends AbstractRecommender

A basic "slope one" recommender. (See an excellent summary here for example.) This Recommender is especially suitable when user preferences are updating frequently as it can incorporate this information without expensive recomputation.

This implementation can also be used as a "weighted slope one" recommender.

Since:
1.2
Author:
Sean Owen

Constructor Summary
SlopeOneRecommender(DataModel dataModel)
          Creates a default (weighted) SlopeOneRecommender based on the given DataModel.
SlopeOneRecommender(DataModel dataModel, boolean weighted, boolean stdDevWeighted, DiffStorage diffStorage)
          Creates a SlopeOneRecommender based on the given DataModel.
 
Method Summary
 double estimatePreference(java.lang.Object userID, java.lang.Object itemID)
          
 java.util.List<RecommendedItem> recommend(java.lang.Object userID, int howMany, Rescorer<Item> rescorer)
          
 void refresh()
          

Triggers "refresh" -- whatever that means -- of the implementation. The general contract is that any Refreshable should always leave itself in a consistent, operational state, and that the refresh atomically updates internal state from old to new.

 void removePreference(java.lang.Object userID, java.lang.Object itemID)
          

Default implementation which just calls DataModel.removePreference(Object, Object) (Object, Object)}.

 void setPreference(java.lang.Object userID, java.lang.Object itemID, double value)
          

Default implementation which just calls DataModel.setPreference(Object, Object, double).

 java.lang.String toString()
           
 
Methods inherited from class com.planetj.taste.impl.recommender.AbstractRecommender
getAllOtherItems, getDataModel, recommend
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

SlopeOneRecommender

public SlopeOneRecommender(DataModel dataModel)
                    throws TasteException

Creates a default (weighted) SlopeOneRecommender based on the given DataModel.

Parameters:
dataModel - data model
Throws:
TasteException

SlopeOneRecommender

public SlopeOneRecommender(DataModel dataModel,
                           boolean weighted,
                           boolean stdDevWeighted,
                           DiffStorage diffStorage)

Creates a SlopeOneRecommender based on the given DataModel.

If weighted is set, acts as a weighted slope one recommender. This implementation also includes an experimental "standard deviation" weighting which weights item-item ratings diffs with lower standard deviation more highly, on the theory that they are more reliable.

Parameters:
dataModel -
weighted - if true, acts as a weighted slope one recommender
stdDevWeighted - use optional standard deviation weighting of diffs
Throws:
java.lang.IllegalArgumentException - if diffStorage is null, or stdDevWeighted is set when weighted is not set
Method Detail

recommend

@NotNull
public java.util.List<RecommendedItem> recommend(java.lang.Object userID,
                                                         int howMany,
                                                         Rescorer<Item> rescorer)
                                          throws TasteException

Parameters:
userID - user for which recommendations are to be computed
howMany - desired number of recommendations
rescorer - rescoring function to apply before final list of recommendations is determined
Returns:
List of recommended RecommendedItems, ordered from most strongly recommend to least
Throws:
TasteException - if an error occurs while accessing the DataModel

estimatePreference

public double estimatePreference(java.lang.Object userID,
                                 java.lang.Object itemID)
                          throws TasteException

Parameters:
userID - user ID whose preference is to be estimated
itemID - item ID to estimate preference for
Returns:
an estimated preference if the user has not expressed a preference for the item, or else the user's actual preference for the item. If a preference cannot be estimated, returns Double.NaN
Throws:
TasteException - if an error occurs while accessing the DataModel

setPreference

public void setPreference(java.lang.Object userID,
                          java.lang.Object itemID,
                          double value)
                   throws TasteException

Default implementation which just calls DataModel.setPreference(Object, Object, double).

Specified by:
setPreference in interface Recommender
Overrides:
setPreference in class AbstractRecommender
Parameters:
userID - user to set preference for
itemID - item to set preference for
value - preference value
Throws:
TasteException - if an error occurs while accessing the DataModel

removePreference

public void removePreference(java.lang.Object userID,
                             java.lang.Object itemID)
                      throws TasteException

Default implementation which just calls DataModel.removePreference(Object, Object) (Object, Object)}.

Specified by:
removePreference in interface Recommender
Overrides:
removePreference in class AbstractRecommender
Parameters:
userID - user from which to remove preference
itemID - item for which to remove preference
Throws:
TasteException - if an error occurs while accessing the DataModel

refresh

public void refresh()

Triggers "refresh" -- whatever that means -- of the implementation. The general contract is that any Refreshable should always leave itself in a consistent, operational state, and that the refresh atomically updates internal state from old to new.

Specified by:
refresh in interface Refreshable
Overrides:
refresh in class AbstractRecommender

toString

@NotNull
public java.lang.String toString()
Overrides:
toString in class java.lang.Object