皮尔逊相关性系数算法

public class RelativityTool {
    public List<BigDecimal> rating_map_list = new ArrayList<BigDecimal>();
    public static void main(String[] args) {
        RelativityTool RelativityTool1 = new RelativityTool();
        //时间戳
        RelativityTool1.rating_map_list.add(new BigDecimal("1476882156310"));
        RelativityTool1.rating_map_list.add(new BigDecimal("1476882166585"));
        RelativityTool1.rating_map_list.add(new BigDecimal("1476882176825"));
        RelativityTool1.rating_map_list.add(new BigDecimal("1476882181935"));
        RelativityTool RelativityTool2 = new RelativityTool();
        //强度
        RelativityTool2.rating_map_list.add(new BigDecimal("-1"));
        RelativityTool2.rating_map_list.add(new BigDecimal("-2"));
        RelativityTool2.rating_map_list.add(new BigDecimal("-3"));
        RelativityTool2.rating_map_list.add(new BigDecimal("-4"));
        BigDecimal hhe = RelativityTool1.getRelativityTool_bydim(RelativityTool2);
        System.out.println(hhe);

    }


    public BigDecimal getRelativityTool_bydim(RelativityTool u) {
        BigDecimal sim = new BigDecimal("0"); //最后的皮尔逊相关度系数
        BigDecimal common_items_len = new BigDecimal(this.rating_map_list.size()); //操作数的个数
        BigDecimal this_sum = new BigDecimal("0"); //第一个相关数的和
        BigDecimal u_sum = new BigDecimal("0"); //第二个相关数的和
        BigDecimal this_sum_sq = new BigDecimal("0"); //第一个相关数的平方和
        BigDecimal u_sum_sq = new BigDecimal("0"); //第二个相关数的平方和
        BigDecimal p_sum = new BigDecimal("0"); //两个相关数乘积的和
        for (int i = 0; i < this.rating_map_list.size(); i++) {
            BigDecimal this_grade = this.rating_map_list.get(i);
            BigDecimal u_grade = u.rating_map_list.get(i);
            //评分求和                     //平方和                     //乘积和
            this_sum = this_sum.add(this_grade);
            u_sum = u_sum.add(u_grade);
            this_sum_sq = this_sum_sq.add(this_grade.pow(2));
            u_sum_sq = u_sum_sq.add(u_grade.pow(2));
            p_sum = p_sum.add(this_grade.multiply(u_grade));
        }
        BigDecimal num = common_items_len.multiply(p_sum).subtract(this_sum.multiply(u_sum));
        BigDecimal den = sqrt(common_items_len.multiply(this_sum_sq).subtract(this_sum.pow(2)).multiply(common_items_len.multiply(u_sum_sq).subtract(u_sum.pow(2))));
        if (den.compareTo(new BigDecimal("0")) == 0) {
            sim = new BigDecimal("1");
        } else {
            sim = num.divide(den,5, BigDecimal.ROUND_HALF_UP);
        }
        return sim;
    }

    //大数字开方算法
    public static BigDecimal sqrt(BigDecimal x) {
        BigDecimal n1 = BigDecimal.ONE;
        BigDecimal ans = BigDecimal.ZERO;
        while ((n1.multiply(n1).subtract(x)).abs().compareTo(BigDecimal.valueOf(0.001)) == 1) {
            BigDecimal s1 = x.divide(n1, 2000, BigDecimal.ROUND_HALF_UP);
            BigDecimal s2 = n1.add(s1);
            n1 = s2.divide(BigDecimal.valueOf(2), 2000, BigDecimal.ROUND_HALF_UP);

        }
        ans = n1;
        BigDecimal rt = new BigDecimal(ans.toString().split("\\.")[0]);
        return rt;
    }

}

转载于:https://my.oschina.net/aijiaoer0624/blog/1142930

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值