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