package com.bp.domain.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.springframework.beans.factory.annotation.Autowired;
import com.bp.mapper.UserDataUtilMapper;
import com.bp.service.UserService;
public class UserSimUtil {
@Autowired
private UserDataUtilMapper userDataUtilMapper;
@Autowired
private UserService userService;
Map<String, Double> simUserSimMap = new HashMap<String, Double>();
@Autowired
private UserDataUtil udUtil;
//与其他用户比较,求皮尔逊相关系数
public List<String> UserSim(int u_id){
List<String> newsList=new ArrayList<String>();
String id=String.valueOf(u_id);
Map<String, Map<String, Double>> userPerfMap=udUtil.getAllUsers();
Map<String, Map<String, Double>> UserObjMap=udUtil.getAllObjUsers();
String output1 = "皮尔逊相关系数:";
Map<String, Double> per=userPerfMap.get(id);
for (Entry<String, Map<String, Double>> userPerfEn : userPerfMap.entrySet()) {
String userId = userPerfEn.getKey();
if (!id.equals(userId)) {
double sim = getUserSimilar(per, userPerfEn.getValue());
output1 += id+"与" + userId + "之间的相关系数:" + sim + ",";
simUserSimMap.put(userId, sim);
}
}
System.out.println(output1);
System.out.println("根据系数推荐:");
List<String> list=getRecommend(UserObjMap, simUserSimMap,id);
Map<String, Double> liMap=UserObjMap.get(id);
int flag=1;
for(int i=0;i<list.size();i++){
for(Entry<String, Double> entry : liMap.entrySet()){
if(entry.getKey().equals(list.get(i))){
flag=0;
break;
}else{
flag=1;
}
}
if(flag==1){
newsList.add(list.get(i));
//System.out.println();
}
}
return newsList;//获得推荐新闻
}
//推荐新闻
private List<String> getRecommend(Map<String, Map<String, Double>> simUserObjMap,
Map<String, Double> simUserSimMap, String id) {
Map<String, Double> objScoreMap = new HashMap<String, Double>();
for (Entry<String, Map<String, Double>> simUserEn : simUserObjMap.entrySet()) {
String user = simUserEn.getKey();
double sim = 0;
if(!id.equals(user)){
sim = simUserSimMap.get(user);
System.out.println(user);
for (Entry<String, Double> simObjEn : simUserEn.getValue().entrySet()) {
double objScore = sim * simObjEn.getValue();
String objName = simObjEn.getKey();
//System.out.println(objName);
if (objScoreMap.get(objName) == null) {
objScoreMap.put(objName, objScore);
}else {
double totalScore = objScoreMap.get(objName);
objScoreMap.put(objName, totalScore + objScore);
}
}
}
}
List<Entry<String, Double>> enList = new ArrayList<Entry<String, Double>>(objScoreMap.entrySet());
Collections.sort(enList, new Comparator<Map.Entry<String, Double>>() {
public int compare(Map.Entry<String, Double> o1, Map.Entry<String, Double> o2) {
Double a = o1.getValue() - o2.getValue();
if (a == 0) {
return 0;
}else if (a > 0) {
return 1;
}else {
return -1;
}
}
});
List<String> list=new ArrayList<String>();
for(int i=enList.size()-1;i>-1;i--){
System.out.println(enList.get(i).getKey());
System.out.println(enList.get(i).getValue());
}
for(int i=enList.size()-1;i>-1;i--){
if(enList.get(i).getValue()>5){
list.add(enList.get(i).getKey());
}
}
System.out.println(enList.size()+"个");
return list;
}
//计算相似度
private double getUserSimilar(Map<String, Double> pm1, Map<String, Double> pm2) {
int n = 0;// 数量n
int sxy = 0;// Σxy=x1*y1+x2*y2+....xn*yn
int sx = 0;// Σx=x1+x2+....xn
int sy = 0;// Σy=y1+y2+...yn
int sx2 = 0;// Σx2=(x1)2+(x2)2+....(xn)2
int sy2 = 0;// Σy2=(y1)2+(y2)2+....(yn)2
for (Entry<String, Double> pme : pm1.entrySet()) {
String key = pme.getKey();
Double x = pme.getValue();
Double y = pm2.get(key);
if (x != null && y != null) {
n++;
sxy += x * y;
sx += x;
sy += y;
sx2 += Math.pow(x, 2);
sy2 += Math.pow(y, 2);
}
}
// p=(Σxy-Σx*Σy/n)/Math.sqrt((Σx2-(Σx)2/n)(Σy2-(Σy)2/n));
double sd = sxy - sx * sy / n;
double sm = Math.sqrt((sx2 - Math.pow(sx, 2) / n) * (sy2 - Math.pow(sy, 2) / n));
return Math.abs(sm == 0 ? 1 : sd / sm);
}
}
微笑愉快
- 粉丝: 1
- 资源: 1
最新资源
- 成熟FOC电机控制GD32F1XX全C程序,全开源 资料含: 电路图,PcB文件及c程序 主要于电动自行车,电动三轮车等,有感控制 直接可用,不是一般的普通代码 也可以自行移植到国产32位芯片
- 毕业设计基于Python卷积神经网络CNN的垃圾邮件分类系统源码+模型(高分毕设)
- Matlab遗传算法路径优化求解,该模型是关于生鲜果蔬冷链配送背景下的路径优化,在经典的路径优化最低成本计算求解的基础上加入了拥堵系数矩阵,模型更加完善,本人写的实列,注释详细带模型,目标函数
- yolov11 改进项目测试1
- 基于自回归整合滑动平均模型(ARIMA)的时间序列预测
- 邢台市桥东区社区停车信息管理系统(编号:68241253).zip
- 校友录管理系统(编号:27740154).zip
- 校园志愿者服务管理系统(编号:01301288).zip
- 光伏并网逆变器控制器避雷器simulink仿真
- 学生竞赛管理系统.zip
- 学生报名管理系统(编号:9093943).zip
- 学生选课系统(编号:54331102).zip
- 庞大的股票市场数据集.zip
- 学校学报出版发行管理系统(编号:73605195).zip
- 雅妮电影票购买系统(编号:8811483).zip
- 学院网站系统 (编号:45648108).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈