package happy.research.cf;
import happy.coding.io.Logs;
import happy.research.utils.TrustUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Implement the <em>kNR trust-based</em> method proposed in paper <em>Trust-Based Collaborative Filtering</em>
*
* @author guoguibing
*/
public class KNRTrust_mt extends DefaultTrust_mt
{
public KNRTrust_mt() throws Exception
{
methodId = "kNRTrust";
}
protected Map<String, Map<String, Double>> train()
{
Map<String, Map<String, Double>> trustMap = new HashMap<>();
int count = 0;
for (String trustor : testUserRatingsMap.keySet())
{
count++;
if (count % 50 == 0) Logs.debug("Training progresss: {}/{}", count, testUserRatingsMap.size());
Map<String, Rating> asRatings = userRatingsMap.get(trustor);
if (asRatings == null) continue;
for (String trustee : userRatingsMap.keySet())
{
if (trustee.equals(trustor)) continue;
Map<String, Rating> bsRatings = userRatingsMap.get(trustee);
if (bsRatings == null) continue;
List<Double> as = new ArrayList<>();
List<Double> bs = new ArrayList<>();
for (String itemId : asRatings.keySet())
{
if (bsRatings.containsKey(itemId))
{
as.add(asRatings.get(itemId).getRating());
bs.add(bsRatings.get(itemId).getRating());
break;
}
}
double trust = TrustUtils.kNRTrust(as, bs);
if (Double.isNaN(trust)) continue;
Map<String, Double> trusteeMap = null;
if (trustMap.containsKey(trustor)) trusteeMap = trustMap.get(trustor);
else trusteeMap = new HashMap<>();
trusteeMap.put(trustee, trust);
trustMap.put(trustor, trusteeMap);
}
}
return trustMap;
}
}