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;
}
}
版權聲明:本文為CSDN部落客「weixin_34233421」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/weixin_34233421/article/details/92617992