java - 将 Epinions 数据集与 Moletrust 推荐系统结合使用

标签 java search trust recommendation-engine

我正在改编 https://github.com/466152112/HappyResearch/blob/master/happyresearch/src/main/java/happy/research/utils/MoleTrust.java 的 Moletrust 算法实现的开源代码 我应该为计算信任值所做的更改改编自 Moletrust 创建者撰写的论文“推荐系统的信任感知协作过滤”。他们计算信任度如下 “距源用户距离为 n 的用户的预测信任值为 (d − n + 1)/d”,其中 d 是最大传播距离。 我得到的结果不是 1 就是 0,这是不正确的。希望你能帮我找出错误。

public static HashMap<String ,Double> MoleTrustAlg ( HashMap<String,HashMap<String,Double>> trust_data,String sourceUser , int horizon)
{
    // all the visited nodes 
    List<String> nodes = new ArrayList<>(40163); 
    // source user - edges[target users - trust value] 
    Map<String, Map<String, Double>> edges = new HashMap<>(40163); 

    /* Step 1: construct directed graphic and remove cyclic */ 
    int dist = 0; 
    List<String>[] users = new List[horizon + 1]; 
    users[dist] = new ArrayList<>(); 
    users[dist].add(sourceUser); 
    nodes.add(sourceUser); 

    // Denote su: source user; tu: target user 
    while (dist < horizon) 
    { 
        dist++; 
        users[dist] = new ArrayList<>(); 
        for (String su : users[dist - 1]) 
        { 
            Map<String, Double> tns = trust_data.get(su); 
            if (tns == null) continue; // no trusted neighbours 
            for (String tn : tns.keySet()) 
            { 
                if (!nodes.contains(tn) && !users[dist].contains(tn) && !users[dist - 1].contains(tn)) 
                { 
                    users[dist].add(tn); 
                } 
            } 
        } 

        for (String su : users[dist - 1]) 
        { 
            Map<String, Double> tns = trust_data.get(su); 
            if (tns == null) continue; 
            for (String tu : tns.keySet()) 
            { 
                if (!nodes.contains(tu) && users[dist].contains(tu)) 
                { 
                    Map<String, Double> tuTrusts; 
                    if (edges.containsKey(su)) tuTrusts = edges.get(su); 
                    else tuTrusts = new HashMap<>(); 

                    double trustValue = tns.get(tu); 
                    tuTrusts.put(tu, trustValue); 
                    edges.put(su, tuTrusts); 
                } 
            } 
        } 
    } 

    /* Step 2: Evaluate trust score */ 
    dist = 0; 
    //double threashold = 0.5; 
    // trusted neighbours - trust score map 
    HashMap<String, Double> trustScores = new HashMap<>(); 
    trustScores.put(sourceUser, 1.0); 
    while (dist < horizon) 
    { 
        dist++;
        for (String su : users[dist - 1]) 
        { 
            Map<String, Double> tns = trust_data.get(su); 
            if (tns == null) continue; 
            for (String tu : tns.keySet()) 
            {

                double trust_value = (horizon -dist +1) / horizon;
                trustScores.put(tu, trust_value);
            }
        }

    } 

    trustScores.remove(sourceUser); 
    return trustScores; 
}

最佳答案

知道了

原因是 双 trust_value = (地平线 -dist +1)/地平线;

由于 Horizo​​n 和 dist 是整数,因此我需要在将结果分配给 double 变量之前对其进行转换。
double trust_value = (double) (地平线 -dist +1)/地平线;

关于java - 将 Epinions 数据集与 Moletrust 推荐系统结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50277898/

相关文章:

algorithm - 可信应用程序执行

PHP,sql 动态查询可能与 LIKE 和 OR 和 AND 一起使用,但无法以正确的方式工作

android - 在 Android 中禁用搜索按钮(快速搜索框)

git - 如何在 GIT 中按名称搜索标签?

iphone - 我们如何告诉 CFStream 使用一组 anchor 证书?

java - 转义单个反斜杠\两个

java - 从字符串生成器中删除字符

java - 如何在 RestTemplate 表单数据中传递不同数据类型的值?

java - QuickFIX/J 如何禁用自动登录响应

active-directory - User.IsInRole ("fake group") 结果为 "The trust relationship between the primary domain and the trusted domain failed"