package org.plista.kornakapi.core.recommender;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import org.apache.mahout.cf.taste.common.NoSuchItemException;
import org.apache.mahout.cf.taste.common.Refreshable;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.recommender.GenericRecommendedItem;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.recommender.IDRescorer;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.math.WeightedVector;
import org.plista.kornakapi.KornakapiRecommender;
import org.plista.kornakapi.core.cluster.StreamingKMeansClassifierModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Lists;
public class StreamingKMeansClassifierRecommender implements KornakapiRecommender{
private static final Logger log = LoggerFactory.getLogger(StreamingKMeansClassifierRecommender.class);
private StreamingKMeansClassifierModel model;
public StreamingKMeansClassifierRecommender( StreamingKMeansClassifierModel model ){
this.model = model;
}
@Override
public List<RecommendedItem> recommend(long userID, int howMany)
throws TasteException {
// TODO Auto-generated method stub
return null;
}
@Override
public List<RecommendedItem> recommend(long userID, int howMany,
IDRescorer rescorer) throws TasteException {
// TODO Auto-generated method stub
return null;
}
@Override
public float estimatePreference(long userID, long itemID)
throws TasteException {
// TODO Auto-generated method stub
return 0;
}
@Override
public void setPreference(long userID, long itemID, float value)
throws TasteException {
// TODO Auto-generated method stub
}
@Override
public void removePreference(long userID, long itemID)
throws TasteException {
// TODO Auto-generated method stub
}
@Override
public DataModel getDataModel() {
// TODO Auto-generated method stub
return null;
}
@Override
public void refresh(Collection<Refreshable> alreadyRefreshed) {
// TODO Auto-generated method stub
}
@Override
public List<RecommendedItem> recommendToAnonymous(long[] itemIDs,
int howMany, IDRescorer rescorer) throws TasteException {
List<RecommendedItem> result = Lists.newArrayListWithCapacity(itemIDs.length);
if(model.getCentroids() == null){
log.info("No centroids computed");
}else{
for(long itemID : itemIDs){
WeightedVector centroid;
try {
centroid = (WeightedVector)model.getClossestCentroid(itemID).getValue();
float normWeight = ((float)centroid.getWeight()/(float)model.getMaxWeight()) ;
/**
* TODO: new Version of mahout is supposed to allow acces on the centroid as a vector
* then volume should be normalized by volume*((Vector)centroid).getNumNonZeroElements/(float)this.model.getMeanVolume() or getMaxVolume
*/
GenericRecommendedItem item = new GenericRecommendedItem(itemID, normWeight);
result.add(item);
} catch (IOException e){
if (log.isInfoEnabled()) {
log.info("{}", e.getMessage());
}
}
}
}
if(result.size() == 0){
throw new NoSuchItemException("Item unkown");
}
return result;
}
@Override
public List<RecommendedItem> recommend(long userID, long[] itemIDs,
int howMany, IDRescorer rescorer) throws TasteException {
// TODO Auto-generated method stub
return null;
}
}