计算机毕业设计Django+Vue.js考研推荐系统 考研分数线预测 中公考研爬虫 混合神经网络推荐算法 考研可视化 机器学习 深度学习 大数据毕业设计

Python数据分析与可视化期末项目报告

     项目名称:  考研推荐系统数据分析与可视化                                         

    学    号:                                           

    姓    名:                                            

专业班级:                                            

                  2023年12月

考研推荐系统

  • 项目概述

考研(研究生入学考试)是许多大学毕业生追求深造的一种途径。为了帮助考生更好地选择适合自己的研究生专业和院校,开发一个考研推荐系统可以为考生提供个性化的建议。该项目旨在通过数据分析和可视化技术,为考生提供基于数据的研究生专业和院校推荐。

通过数据分析和可视化,为考生提供具有个性化的研究生专业和院校推荐服务,帮助考生更好地选择适合自己的研究生方向。

该项目涉及数据处理、统计分析和可视化等技术,需要结合数据库管理、数据清洗、数据分析工具和可视化库进行开发实现。

  • 大数据分析、挖掘与可视化开发环境

    本项目采用Python语言及第三方库进行大数据分析、挖掘,包括训练模型的构建、后端开发环境、使用的第三方库和模型评估等方面。

  1. 软件开发环境:PyCharm、Navicat、MySQL

2.第三方库包

django==2.2.1
django-simpleui==2.1
djangorestframework==3.9.1
pandas
requests
Beautifulsoup4
pyecharts

  • 数据采集

本项目爬虫由两个爬虫同时组成,并可以并行爬取数据。

其中一个爬虫用于采集研究生院校的基本信息,包括学校名称、地理位置、专业设置等。另一个爬虫用于采集历年考研数据,包括报考人数、录取人数、专业录取分数线等。爬虫可以通过网络请求和HTML解析的方式获取所需数据,并将数据保存到本地csv文件或数据库中。

四、数据准备(含数据清洗、补全、整合、转换等)

在数据准备阶段,对采集到的数据进行清洗、补全、整合和转换等处理操作,以确保数据的质量和一致性。这包括处理缺失值、异常值、重复值等,对数据进行格式转换和标准化,以及将不同来源的数据整合到一个统一的数据集中。项目中所爬取的最新考研录取人数存在未知,且爬取下来的字段为-字符串,故将其修改为0.

  • 数据分析处理与训练模型的构建

在数据分析方面,我们分析了院校收藏Top10和院校评分Top10。统计了院校数量、双一流院校数量、自划线院校数量排名前十的省份。对专业报录比、学校报录比、学校报名前十做了统计分析。

在基于学校评分和收藏的模型构建阶段,我们将利用学生对不同学校的评分和收藏数据来构建推荐模型。这些评分和收藏数据可以反映学生对学校的偏好和兴趣。

  • 模型评估

数据准备:

收集学生对不同学校的评分和收藏数据。

对数据进行清洗和预处理,处理缺失值、异常值等。

特征工程:

根据评分和收藏数据,提取相关的特征,如学校评分、收藏次数等。

进行特征选择和转换,以提取对模型训练有用的特征。

模型评估:

基于准备好的特征和数据集,使用自定义算法构建推荐模型。

将数据集分为训练集和测试集,并评估模型的性能和准确性。

根据评估结果,对模型进行调整和改进,以提高推荐准确性和用户满意度。

模型优化:

可以尝试不同的机器学习算法、模型参数和特征组合,以优化模型表现。

进行模型调优和参数调整,以提高推荐结果的准确性和个性化程度。

七、数据可视化

数据可视化是将数据分析结果以直观、易于理解的图表、图形等形式展示的过程。在这一阶段,可以使用数据可视化技术,如绘制柱状图、折线图、散点图等,来展示分析结果和模型预测的信息。通过交互式界面和图表,用户可以根据自身需求进行筛选和选择,从而更好地理解和利用数据分析结果。

本项目使用柱状图分析了院校收藏和评分前十,饼状图统计了院校总数量、双一流院校数量、自划线院校数量前十的省份。最好,通过柱状图分析了每个院校及专业报录比前十情况,可以得出哪些院校或者哪些专业竞争比较激烈。

核心算法代码分享如下:

!
以下文字解释recommend.py,也就是推荐模块,比较长,不方便念。
1. 计算基于用户收藏的 Jaccard 相似度
这个函数的目的是计算当前用户与其他用户之间的 Jaccard 相似度,基于他们的收藏行为。Jaccard 相似度是通过计算两个集合的交集元素数量与并集元素数量之间的比值来衡量的。功能:
首先,该函数获取了当前用户收藏的学校,然后根据这些学校构建了一个收藏向量,向量中的每个元素代表一个学校的收藏情况。如果用户收藏了某个学校,则在向量中相应的位置上置1,否则为0。
接着,遍历除了当前用户之外的所有其他用户。对每个用户,获取其收藏的学校,构建一个收藏向量,然后计算当前用户与其他用户之间的 Jaccard 相似度。
最后,将与当前用户相似度大于给定阈值的用户及其相似度存储在一个字典中并返回。
2. 基于用户收藏计算当前用户对邻居收藏院校的 Jaccard 兴趣度
python
Copy code
def user_recommendations_jaccard_collections(user_id, similarities, similarities_jaccard):# 获取当前用户的收藏数据user_collections = UserCollection.objects.filter(user_id=user_id).values('school_id', 'collection')# 获取当前用户收藏的学校iduser_collections_school_id = [user_collection['school_id'] for user_collection in user_collections]recommendations_jaccard = {}# 邻居用户已收藏的学校中目标用户未收藏的学校for school_id in UserCollection.objects.filter(user_id__in=similarities).exclude(school_id__in=user_collections_school_id).values_list('school_id', flat=True).distinct():# 获取收藏了当前物品的用户:用户id和收藏情况(collection = 1)item_collections = UserCollection.objects.filter(school_id=school_id).values('user_id', 'collection')# 初始化一个空列表weighted_scores = []# 遍历 item_collections 中的每一条记录for collection in item_collections:# 如果该收藏记录对应的用户在 similarities_jaccard 字典中,则计算该收藏记录对该物品的权重得分if collection['user_id'] in similarities_jaccard:# 获取该收藏记录对应用户与目标用户的相似度similarity = similarities_jaccard[collection['user_id']]# 计算该收藏记录对该物品的权重得分weighted_score = similarity * collection['collection']# 将该权重得分添加到列表中weighted_scores.append(weighted_score)numerator = sum(weighted_scores)denominator = sum(similarities_jaccard.values())if denominator > 0:recommendations_jaccard[school_id] = round(numerator / denominator, 2)return recommendations_jaccard
功能:
这个函数的目的是计算当前用户对邻居收藏院校的 Jaccard 兴趣度。该兴趣度是基于当前用户与邻居用户的相似度以及邻居用户对学校的收藏情况计算的。
该函数首先检索当前用户的收藏数据,并构建了一个收藏向量,表示用户收藏的情况。
接着,遍历所有邻居用户收藏的学校,计算当前用户对这些学校的兴趣度得分,并存储在一个字典中以便返回。
2. 基于用户评分计算相似度的函数
2.1. 基于用户评分计算当前用户与其他用户的余弦相似度
python
Copy code
def user_cosine_similarity_ratings(user_id, default_similarity_cosine=0):# 获取当前用户评分数据user_ratings = UserScore.objects.filter(user_id=user_id).values('school_id', 'score')user_ratings_school_id = [user_rating['school_id'] for user_rating in user_ratings]# 构造当前用户评分向量user_rating_vector = [0 for i in range(999)]for school_id, score in user_ratings:user_rating_vector[school_id] = scoresimilarities_cosine = {}for user in User.objects.exclude(id=user_id):# 获取当前用户与其他用户共同评价的物品的评分数据ratings = user.userscores.filter(school_id__in=user_ratings_school_id).values('school_id', 'score')if ratings:  # 如果当前用户与该用户有共同评分的学校,则计算当前用户与该用户的相似度,这里使用余弦相似度# 获取该用户所有的评分学校的评分情况:(school_id,score)ratings = user.userscores.filter().values('school_id', 'score')ratings_school = [(rating['school_id'], rating['score']) for rating in ratings]# 构造该用户评分向量:rating_vectorrating_vector = [0 for i in range(999)]for school_id, score in ratings_school:rating_vector[school_id] = score# 计算两用户之间的余弦相似度similarity_cosine = cosine_similarity(user_rating_vector, rating_vector)if similarity_cosine > default_similarity_cosine:similarities_cosine[user.id] = similarity_cosinereturn similarities_cosine
功能:
这个函数的目的是计算当前用户与其他用户之间的余弦相似度,基于他们的评分行为。余弦相似度是通过计算两个向量的夹角余弦值来衡量的。
首先,该函数获取了当前用户的评分数据,然后根据这些评分构建了一个评分向量,向量中的每个元素代表一个学校的评分情况。如果用户对某个学校进行了评分,则在向量中相应的位置上记录该评分,否则为0。
接着,遍历除了当前用户之外的所有其他用户。对每个用户,获取其评分的学校,构建一个评分向量,然后计算当前用户与其他用户之间的余弦相似度。
最后,将与当前用户相似度大于给定阈值的用户及其相似度存储在一个字典中并返回。
2.2. 基于用户评分计算当前用户对邻居评分院校的余弦兴趣度
python
Copy code
def user_recommendations_cosine_ratings(user_id, similarities, similarities_cosine):# 获取当前用户评分数据user_ratings = UserScore.objects.filter(user_id=user_id).values('school_id', 'score')user_ratings_school_id = [user_rating['school_id'] for user_rating in user_ratings]recommendations_cosine = {}# 邻居用户已评分的学校中目标用户未评分的学校for school_id in UserScore.objects.filter(user_id__in=similarities).exclude(school_id__in=user_ratings_school_id).values_list('school_id', flat=True).distinct():# 获取评价了当前物品的用户和评分数据item_ratings = UserScore.objects.filter(school_id=school_id).values('user_id', 'score')# 初始化一个空列表weighted_scores = []# 遍历 item_ratings 中的每一条记录for rating in item_ratings:# 如果该评分记录对应的用户在 similarities_cosine 字典中,则计算该评分记录对该物品的权重得分if rating['user_id'] in similarities_cosine:# 获取该评分记录对应用户与目标用户的相似度similarity = similarities_cosine[rating['user_id']]# 计算该评分记录对该物品的权重得分weighted_score = similarity * rating['score']# 将该权重得分添加到列表中weighted_scores.append(weighted_score)numerator = sum(weighted_scores)denominator = sum(similarities_cosine.values())if denominator > 0:recommendations_cosine[school_id] = round(numerator / denominator, 2)return recommendations_cosine
功能:
这个函数的目的是计算当前用户对邻居评分院校的余弦兴趣度。该兴趣度是基于当前用户与邻居用户的相似度以及邻居用户对学校的评分情况计算的。
该函数首先检索当前用户的评分数据,并构建了一个评分向量,表示用户评分的情况。
接着,遍历所有邻居用户评分的学校,计算当前用户对这些学校的兴趣度得分,并存储在一个字典中以便返回。
3. 计算相似度的函数
3.1. Jaccard 相似度计算函数
功能:这个函数用于计算两个向量之间的 Jaccard 相似度。
通过将布尔向量转换为集合,它计算两个集合的交集和并集的大小,并据此计算相似度。
3.2. 重载字典计算方法
功能:这个类重载了字典的加法和乘法运算符,以支持字典之间的加法和乘法操作。
3.3. 余弦相似度计算函数
功能:这个函数用于计算两个向量之间的余弦相似度。
计算两个向量的内积作为分子,两个向量模长的乘积作为分母,然后计算相似度。
4. 基于用户收藏计算相似度的函数
4.1. 计算基于用户收藏的 Jaccard 相似度
功能:这个函数的目的是计算当前用户与其他用户之间的 Jaccard 相似度,基于他们的收藏行为。
首先,该函数获取了当前用户收藏的学校,然后根据这些学校构建了一个收藏向量,向量中的每个元素代表一个学校的收藏情况。如果用户收藏了某个学校,则在向量中相应的位置上置1,否则为0。
接着,遍历除了当前用户之外的所有其他用户。对每个用户,获取其收藏的学校,构建一个收藏向量,然后计算当前用户与其他用户之间的 Jaccard 相似度。
最后,将与当前用户相似度大于给定阈值的用户及其相似度存储在一个字典中并返回。
4.2. 基于用户收藏计算当前用户对邻居收藏院校的 Jaccard 兴趣度
功能:这个函数的目的是计算当前用户对邻居收藏院校的 Jaccard 兴趣度。该兴趣度是基于当前用户与邻居用户的相似度以及邻居用户对学校的收藏情况计算的。
该函数首先检索当前用户的收藏数据,并构建了一个收藏向量,表示用户收藏的情况。
接着,遍历所有邻居用户收藏的学校,计算当前用户对这些学校的兴趣度得分,并存储在一个字典中以便返回。
5. 基于用户评分计算相似度的函数
5.1. 基于用户评分计算当前用户与其他用户的余弦相似度
功能:这个函数的目的是计算当前用户与其他用户之间的余弦相似度,基于他们的评分行为。余弦相似度是通过计算两个向量的夹角余弦值来衡量的。
首先,该函数获取了当前用户的评分数据,然后根据这些评分构建了一个评分向量,向量中的每个元素代表一个学校的评分情况。如果用户对某个学校进行了评分,则在向量中相应的位置上记录该评分,否则为0。
接着,遍历除了当前用户之外的所有其他用户。对每个用户,获取其评分的学校,构建一个评分向量,然后计算当前用户与其他用户之间的余弦相似度。
最后,将与当前用户相似度大于给定阈值的用户及其相似度存储在一个字典中并返回。
5.2. 基于用户评分计算当前用户对邻居评分院校的余弦兴趣度
功能:这个函数的目的是计算当前用户对邻居评分院校的余弦兴趣度。该兴趣度是基于当前用户与邻居用户的相似度以及邻居用户对学校的评分情况计算的。
该函数首先检索当前用户的评分数据,并构建了一个评分向量,表示用户评分的情况。
接着,遍历所有邻居用户评分的学校,计算当前用户对这些学校的兴趣度得分,并存储在一个字典中以便返回。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/351867.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hadoop/hive/DBeaver启动流程

hadoop 启动 cd到指定目录下 cd /opt/module/hadoop-3.3.0/sbin/启动文件 ./start-all.shjps一下,查看显示的内容 应该显示以下内容 NameNode SecondaryNameNode DataNode ResourceManager NodeManager如果缺少namenode,那么执行 rm -rf /tmp/hadoo…

MicroPython+ESP32 C3开发上云

传感器PinI/O状态D412输出1开0关D513输出1开0关 概述 MicroPython是python3编程语言的精简实现,能够在资源非常有限的硬件上运行,如MCU微控制器Micropython的网络功能和计算功能很强大,有非常多的库可以使用,它为嵌入式开发带来了…

react传参有哪些常用方法?--Props,Context API和Redux全局管理

在 React 中,父子组件之间的传参主要通过以下几种方式实现: 1) Props 传递:父子传参 2)Context API: 跨多层组件传递数据 3) Redux: 全局状…

计算机网络 —— 运输层(运输层概述)

计算机网络 —— 运输层(运输层概述) 运输层运输层端口号复用分用复用(Multiplexing)分用(Demultiplexing) 常用端口号页面响应流程 我们今天进入到运输层的学习: 运输层 我们之前学习的物理层…

pytorch基础

文章目录 一、环境准备1.1安装Anaconda1.2创建虚拟环境1.3准备CUDA1.4安装pytorch1.3安装Pycharm 二、全连接神经网络原理2.1整体结构2.2神经单元2.3激活函数2.3.1非线性性2.3.2Sigmoid函数2.3.3Tanh函数2.3.4ReLU函数2.3.5Leaky ReLU函数 2.4前向传播2.5损失函数与反向传播2.5…

5G智能运维趋势

随着5G技术的普及,网络运维面临着前所未有的复杂性和数据量挑战。智能运维通过人工智能、大数据分析、自动化工具等技术,为5G网络提供了高效的管理和优化手段。在网络性能优化、故障预测与管理、资源动态调度、安全管理和网络切片管理等方面,…

Python 全栈系列250 数据流实践

说明 之前好几个企业都提过飞机在飞的时候换发动机的例子,来比喻变革是多么无奈和危险。还有的说法更直接:不变等死,变就是找死,总得选一样。 后来我自己的体会也差不多是这样,总有一些窘境让你抉择:是忽忽…

[Shell编程学习路线]——if条件语句(单,双,多分支结构)详细语法介绍

🏡作者主页:点击! 🛠️Shell编程专栏:点击! ⏰️创作时间:2024年6月17日7点50分 🀄️文章质量:95分 文章目录 ————前言———— 💯趣站&#x1f4af…

Python 显示笔记本电脑的电池状态和百分比

方法一: import psutil import psutil battery psutil.sensors_battery() if battery is None:print("No battery is found.")exit() print (battery) percentagebattery.percent print(f"Battery Percentage: {percentage}%")Battery的信息…

【K8s】专题五(3):Kubernetes 配置之 ConfigMap 与 Secret 异同

以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发!欢迎扫码关注个人公众号! 目录 一、相同点 二、不同点 一、相同点 功能作用:ConfigMap 与 Secret 都用于存储…

数据结构错题答案汇总

王道学习 第一章 绪论 1.1 3.A 数据的逻辑结构是从面向实际问题的角度出发的,只采用抽象表达方式,独立于存储结构,数据的存储方式有多种不同的选择;而数据的存储结构是逻辑结构在计算机上的映射,它不能独立于逻辑结构而存在。数…

【JavaEE精炼宝库】多线程(5)单例模式 | 指令重排序 | 阻塞队列

目录 一、单例模式: 1.1 饿汉模式: 1.2 懒汉模式: 1.2.1 线程安全的懒汉模式: 1.2.2 线程安全的懒汉模式的优化: 二、指令重排序 三、阻塞队列 3.1 阻塞队列的概念: 3.2 生产者消费者模型&#xf…

GPU的工作原理

location: Beijing 1. why is GPU CPU的存储单元和计算单元的互通过慢直接促进了GPU的发展 先介绍一个概念:FLOPS(Floating Point Operations Per Second,浮点运算每秒)是一个衡量其执行浮点运算的能力,可以作为计算…

板凳----Linux/Unix 系统编程手册 25章 进程的终止

25.1 进程的终止:_exit()和exit() 440 1. _exit(int status), status 定义了终止状态,父进程可调用 wait 获取。仅低8位可用,调用 _exit() 总是成功的。 2.程序一般不会调用 _exit(), 而是调用库函数 exit()。exit() …

python-不定方程求解

[题目描述] 给定正整数 a,b,c。求不定方程axbyc 关于未知数 x 和 y 的所有非负整数解组数。输入: 一行,包含三个正整数 a,b,c,两个整数之间用单个空格隔开。每个数均不大于 1000。输出&#xff…

游戏中插入音效

一、背景音乐 准备:素材音乐 方法: 1、方法1: (1) 将背景音乐 bgAudio 拖放到Hierarchy面板 (2) 选中 bgAudio,勾选开始运行就播放、循环播放。调节音量(volume) 2、方法2: (1) Create Empty&#x…

【Android】安卓开发的前景

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

C# 设置PDF表单不可编辑、或提取PDF表单数据

PDF表单是PDF中的可编辑区域,允许用户填写指定信息。当表单填写完成后,有时候我们可能需要将其设置为不可编辑,以保护表单内容的完整性和可靠性。或者需要从PDF表单中提取数据以便后续处理或分析。 之前文章详细介绍过如何使用免费Spire.PDF…

【面试题】MySQL常见面试题总结

备战实习,会定期给大家整理常考的面试题,大家一起加油! 🎯 系列文章目录 【面试题】面试题分享之JVM篇【面试题】面试题分享之Java并发篇【面试题】面试题分享之Java集合篇(三) 注意:文章若有错…

WPF视频学习-简单应用篇图书馆程序(一)

1.登录界面和主界面跳转 先把登录界面分为三行《Grid》 先添加两行&#xff1a; <Grid><!--//分三行&#xff0c;行排列--><Grid.RowDefinitions><RowDefinition Height"auto"/><RowDefinition Height"auto"/><RowDef…