个人技术总结-协同过滤
| 这个作业属于哪个课程 | 软工实践2022年春-F班社区 |
|---|---|
| 这个作业要求在哪里 | 软件工程实践总结&个人技术博客 |
| 这个作业的目标 | 个人技术博客 |
| 其他参考文献 | CSDN社区 |
目录
- 基于用户的协同过滤算法
- 技术概述
- 技术实现
- 皮尔森系数LIst的计算
- 通过皮尔森系数LIst确定最近邻LIst
- 通过最近邻LIst进行推荐
- 技术总结
基于用户的协同过滤算法
技术概述
本次软件工程实践,主要的工作是后端的开发工作。所运用的框架是springboot2,主要负责后端的推荐设计和推荐算法编写。
推荐算法用到的主要技术是基于用户的协同过滤算法。
协同过滤(简称CF)是推荐系统最重要的思想之一。在早期,协同过滤几乎等同于推荐系统。主要的功能是预测和推荐。算法通过对用户历史行为数据的挖掘发现用户的偏好,基于不同的偏好对用户进行群组划分并推荐品味相似的商品。协同过滤推荐算法分为两类,分别是:1、基于用户的协同过滤算法(user-based collaboratIve filtering)(相似的用户可能喜欢相同物品);2、基于物品的协同过滤算法(item-based collaborative filtering)(相似的物品可能被同个用户喜欢)。
技术实现
推荐算法的主要思想就是运用一定的数学公式构造各个关系之间的相似度并进行推荐。我主要使用的公式为皮尔森相关系数的推荐,即计算两个用户之间的对于文章点赞的相似度,进行相似度排序。通过选择前某几个相似度高的用户的相关非重复事物进行推荐。以下为皮尔森相关系数的计算公式:
皮尔森系数LIst的计算
这里的计算主要是将两个用户之间对于某个帖子的点赞数作为两者的相似度计算的XY值,然后通过计算每个用户的皮尔森系数来得到皮尔森系数的表,也就是皮尔森系数计算公式的实现。
public double pearson_dis(List<likelist> rating1, List<likelist> rating2) {
double sum_xy = 0.0D;
double sum_x = 0.0D;
double sum_y = 0.0D;
double sum_x2 = 0.0D;
double sum_y2 = 0.0D;
double n = 0.0D;
double avg_x = 0.0D;
double avg_y = 0.0D;
double sup_xy;
double sup_x22;
for(int i = 0; i < rating1.size(); ++i) {
likelist userName = (likelist)rating1.get(i);
for(int j = 0; j < rating2.size(); ++j) {
likelist recommendUser = (likelist)rating2.get(j);
if (userName.getPostid().equals(recommendUser.getPostid())) {
++n;
sup_xy = (double)(userName.getCount() * 10);
sup_x22 = (double)(recommendUser.getCount() * 10);
sum_xy += sup_xy * sup_x22;
sum_x += sup_xy;
sum_y += sup_x22;
sum_x2 += Math.pow(sup_xy, 2.0D);
sum_y2 += Math.pow(sup_x22, 2.0D);
}
}
}
avg_x = sum_x / n;
avg_y = sum_y / n;
System.out.println("N=" + n + " avg" + avg_x + "avg_x" + avg_y);
double sup_x2 = 0.0D;
double sup_y2 = 0.0D;
sup_xy = 0.0D;
sup_x22 = 0.0D;
double sup_y22 = 0.0D;
for(int i = 0; i < rating1.size(); ++i) {
likelist userName2 = (likelist)rating1.get(i);
for(int j = 0; j < rating2.size(); ++j) {
likelist recommendUser2 = (likelist)rating2.get(j);
if (userName2.getPostid().equals(recommendUser2.getPostid())) {
double x = (double)(userName2.getCount() * 10);
double y = (double)(recommendUser2.getCount() * 10);
sup_x2 += x - avg_x;
sup_y2 += y - avg_y;
sup_x22 += Math.pow(sup_x2, 2.0D);
sup_y22 += Math.pow(sup_y2, 2.0D);
sup_xy += sup_y2 * sup_x2;
}
}
}
double denominator2 = Math.sqrt(sup_x22 * sup_y22);
System.out.println("denominator2 " + sup_xy + " " + sup_xy + " sup_x2 " + sup_xy + " " + sup_xy + " supy2 " + sup_xy / denominator2);
double denominator = Math.sqrt(sum_x2 - Math.pow(sum_x, 2.0D) / n) * Math.sqrt(sum_y2 - Math.pow(sum_y, 2.0D) / n);
if (denominator2 == 0.0D) {
return 0.0D;
} else {
return sup_xy / denominator2;
}
}
通过皮尔森系数LIst确定最近邻LIst
public Map<String, Double> computeNearestNeighbor(likelist user, Map<String, List<likelist>> likelistMap) {
Map<String, Double> distances = new TreeMap();
Iterator var4 = likelistMap.entrySet().iterator();
while(var4.hasNext()) {
Entry<String, List<likelist>> entry = (Entry)var4.next();
String mapKey = (String)entry.getKey();
List<likelist> mapValue = (List)entry.getValue();
if (!mapKey.equals(user.getUserid().toString())) {
double distance = this.pearson_dis((List)likelistMap.get(user.getUserid().toString()), mapValue);
PrintStream var10000 = System.out;
String var10001 = (String)entry.getKey();
var10000.println("key" + var10001 + " distance" + distance);
distances.put(mapKey, distance);
}
}
System.out.println("distance" + distances);
return distances;
}
通过最近邻LIst进行推荐
public List<Integer> likeListRecommend(likelist user) {
List<Integer> recommendations = new LinkedList();
List<likelist> AllUser = this.likelistMapper.findByUser();
List<String> AllUserId = new ArrayList();
Iterator var5 = AllUser.iterator();
while(var5.hasNext()) {
likelist like = (likelist)var5.next();
AllUserId.add(like.getUserid().toString());
}
List<String> listNew = new ArrayList(new TreeSet(AllUserId));
Map<String, List<likelist>> likelistMap = new HashMap();
Iterator var7 = listNew.iterator();
while(var7.hasNext()) {
String userN = (String)var7.next();
likelistMap.put(userN, this.likelistMapper.findById(userN));
}
Map<String, Double> distances = this.computeNearestNeighbor(user, likelistMap);
double maxKey = 0.0D;
List<String> maxValue = new LinkedList();
Iterator var11 = distances.entrySet().iterator();
String neighber;
while(var11.hasNext()) {
Entry<String, Double> entry = (Entry)var11.next();
neighber = (String)entry.getKey();
Double mapValue = (Double)entry.getValue();
if (mapValue >= 0.8D && !neighber.equals(user.getUserid())) {
maxValue.add(neighber);
}
}
List<Integer> RecommendList = new ArrayList();
Iterator var23 = maxValue.iterator();
Iterator var16;
while(var23.hasNext()) {
neighber = (String)var23.next();
List<likelist> flag = (List)likelistMap.get(neighber);
List<Integer> likelistFlagList = new LinkedList();
var16 = flag.iterator();
while(var16.hasNext()) {
likelist likelist = (likelist)var16.next();
likelistFlagList.add(likelist.getPostid());
}
RecommendList.addAll(likelistFlagList);
}
List<Integer> newRecommendList = new ArrayList(new TreeSet(RecommendList));
List<likelist> userList = this.likelistMapper.findById(user.getUserid().toString());
System.out.println("maxvalue" + maxValue);
System.out.println("Recommendations" + RecommendList);
System.out.println("userlist" + userList);
System.out.println("newRecommendations" + newRecommendList);
Iterator var27 = userList.iterator();
while(var27.hasNext()) {
likelist likelist = (likelist)var27.next();
var16 = newRecommendList.iterator();
while(var16.hasNext()) {
Integer i = (Integer)var16.next();
if (likelist.getPostid() == i) {
recommendations.add(i);
}
}
}
newRecommendList.removeAll(recommendations);
if (recommendations.isEmpty()) {
}
System.out.println(newRecommendList);
return newRecommendList;
}
技术总结
基于用户的协同过滤适用于用户较少的场合,如果用户很多,计算用户相似度矩阵代价很大。,还需要更多的理解更多的算法,选择一个更加适合的算法来推荐用户喜欢的帖子。
相关推荐
CISP-CSE注册云安全工程师备考资源包基础教程
随着云计算技术的普及,云安全已成为网络安全领域的核心议题。CISP-CSE(注册云安全工程师)认证由中国信息安全测评中心颁发,旨在培养具备云安全专业知识和实践能力的实战型人才。本教程将结合"CISP-CSE注册云安全工程师备考资源包",系统性地为您梳理云安全的核心知识体系,并提供实战案例分析,助您高效备考。
绘图模拟:在冲动环境中固定时间的示例 附matlab代码.rar
绘图模拟:在冲动环境中固定时间的示例 附matlab代码.rar
基于规则的电动汽车混合能源管理系统,采用MATLAB、Simulink、Simscape Electrical和Stateflow。.zip
1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
完全复现虚拟同步发电机VSG自适应惯量阻尼控制仿真、根轨迹、调节系数对比(Simulink仿真、Matlab代码实现)
内容概要:本文围绕虚拟同步发电机(VSG)的自适应惯量阻尼控制展开深入研究,通过Simulink搭建详细的系统仿真模型,并结合Matlab代码实现控制算法,系统分析了根轨迹特性及不同调节系数对系统动态响应的影响。研究重点在于设计并验证一种能够根据电网频率变化自动调整惯量和阻尼参数的自适应控制策略,有效提升了VSG在面对负载突变或新能源波动时的频率稳定性与抗干扰能力,为高比例可再生能源接入下的电力系统稳定运行提供了关键技术支撑。; 适合人群:具备电力系统分析、自动控制理论及新能源并网技术基础的研究生、科研人员以及从事微电网、分布式能源系统设计与运维的工程技术人员。; 使用场景及目标:①深入理解虚拟同步发电机的工作原理及其在提升电网惯性方面的关键作用;②掌握基于Simulink的电力电子与控制系统建模与仿真方法;③学习并实践惯量和阻尼自适应控制策略的设计流程,通过根轨迹分析手段优化控制器参数,提升系统动态性能。; 阅读建议:建议读者结合所提供的Simulink仿真模型与Matlab代码进行同步操作,重点关注控制器设计逻辑与参数整定过程,通过改变调节系数观察系统响应变化,深化对稳定性判据与控制性能之间关系的理解。
【雷达信号处理】数字下变频(DDC)(Matlab代码实现)
【雷达信号处理】数字下变频(DDC)(Matlab代码实现)内容概要:本文主要介绍了数字下变频(DDC)技术在雷达信号处理中的应用,并提供了基于Matlab的代码实现。DDC作为现代雷达系统中的关键环节,主要用于将高频接收信号转换为便于后续处理的低频或基带信号,从而提高信号处理效率与精度。文中详细阐述了DDC的基本原理,包括混频、低通滤波和抽取等步骤,并通过Matlab代码展示了其实现过程,帮助读者理解如何在实际工程中构建和调试DDC模块。此外,文档还提及该资源属于一个涵盖多个科研方向的技术资料集合,如路径规划、电力系统优化、机器学习、通信系统仿真等,强调借助成熟工具与方法可提升科研效率。 适合人群:具备一定信号处理基础知识和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适用于从事雷达系统设计、通信工程或相关领域研究的人员。 使用场景及目标:① 学习和掌握数字下变频(DDC)在雷达信号处理中的基本原理与实现方法;② 利用Matlab进行算法仿真与验证,辅助完成课程设计、毕业课题或科研项目中的信号处理部分;③ 借助提供的代码框架拓展至其他通信或雷达系统仿真任务中。 阅读建议:此资源以Matlab代码为核心载体,注重理论与实践结合,建议读者在学习过程中同步运行代码并调整参数,观察不同设置对下变频结果的影响,加深对混频泄漏、滤波器设计和采样率变化等问题的理解,从而真正掌握DDC的关键技术细节。



