计算机毕业设计Python+Vue.js知识图谱音乐推荐系统 音乐爬虫可视化 音乐数据分析 大数据毕设 大数据毕业设计 机器学习 深度学习 人工智能

开发技术
协同过滤算法、机器学习、LSTM、vue.js、echarts、django、Python、MySQL


创新点
协同过滤推荐算法、爬虫、数据可视化、LSTM情感分析、短信、身份证识别


补充说明
适合大数据毕业设计、数据分析、爬虫类计算机毕业设计


介绍

  • 音乐数据的爬取:爬取歌曲、歌手、歌词、评论
  • 音乐数据的可视化:数据大屏+多种分析图【十几个图】
  • 深度学习之LSTM 音乐评论情感分析
  • 交互式协同过滤音乐推荐: 2种协同过滤算法、通过点击歌曲喜欢来修改用户对歌曲的评分
  • 歌词、乐评的词云
  • 登录、注册、修改个人信息等【集成身份证识别、短信验证码等】

核心算法代码分享如下:

# coding = utf-8

# 基于项目的协同过滤推荐算法实现
import random

import math
import pymysql                          #数据库
from operator import itemgetter

from config import cnn


class ItemBasedCF():
    # 初始化参数
    def __init__(self):
        # 找到相似的8个,为目标用户推荐4个
        self.n_sim_movie = 8
        self.n_rec_movie = 4

        # 将数据集划分为训练集和测试集
        self.trainSet = {}
        self.testSet = {}

        # 用户相似度矩阵
        self.movie_sim_matrix = {}
        self.movie_popular = {}
        self.movie_count = 0

        print('Similar movie number = %d' % self.n_sim_movie)
        print('Recommneded movie number = %d' % self.n_rec_movie)

    # 从数据库得到“用户-物品”数据
    def get_dataset(self, pivot=0.75):
        trainSet_len = 0
        testSet_len = 0
        cnn.ping(reconnect=True)
        cursor = cnn.cursor()
        sql = ' select * from tb_rate'
        cursor.execute(sql)
        for item in cursor.fetchall():
            user, movie, rating = item[1:]
            self.trainSet.setdefault(user, {})
            self.trainSet[user][movie] = rating
            trainSet_len += 1
            self.testSet.setdefault(user, {})
            self.testSet[user][movie] = rating
            testSet_len += 1
        cursor.close()
        # cnn.close()

        print('Split trainingSet and testSet success!')
        print('TrainSet = %s' % trainSet_len)
        print('TestSet = %s' % testSet_len)

    # 读文件,返回文件的每一行
    def load_file(self, filename):
        with open(filename, 'r') as f:
            for i, line in enumerate(f):
                if i == 0:  # 去掉文件第一行的title
                    continue
                yield line.strip('\r\n')
        print('Load %s success!' % filename)

    # 计算物品之间的相似度
    def calc_movie_sim(self):
        for user, movies in self.trainSet.items():
            for movie in movies:
                if movie not in self.movie_popular:
                    self.movie_popular[movie] = 0
                self.movie_popular[movie] += 1

        self.movie_count = len(self.movie_popular)
        print("Total movie number = %d" % self.movie_count)

        for user, movies in self.trainSet.items():
            for m1 in movies:
                for m2 in movies:
                    if m1 == m2:
                        continue
                    self.movie_sim_matrix.setdefault(m1, {})
                    self.movie_sim_matrix[m1].setdefault(m2, 0)
                    self.movie_sim_matrix[m1][m2] += 1
        print("Build co-rated users matrix success!")

        # 计算物品之间的相似性 similarity matrix
        print("Calculating movie similarity matrix ...")
        for m1, related_movies in self.movie_sim_matrix.items():
            for m2, count in related_movies.items():
                # 注意0向量的处理,即某物品的用户数为0
                if self.movie_popular[m1] == 0 or self.movie_popular[m2] == 0:
                    self.movie_sim_matrix[m1][m2] = 0
                else:
                    self.movie_sim_matrix[m1][m2] = count / math.sqrt(self.movie_popular[m1] * self.movie_popular[m2])
        print('Calculate movie similarity matrix success!')

    # 针对目标用户U,找到K部相似的物品,并推荐其N部物品
    def recommend(self, user):
        K = self.n_sim_movie
        N = self.n_rec_movie
        rank = {}
        if user>len(self.trainSet):
            user = random.randint(1, len(self.trainSet))
        watched_movies = self.trainSet[user]

        for movie, rating in watched_movies.items():
            for related_movie, w in sorted(self.movie_sim_matrix[movie].items(), key=itemgetter(1), reverse=True)[:K]:
                if related_movie in watched_movies:
                    continue
                rank.setdefault(related_movie, 0)
                rank[related_movie] += w * float(rating)
        return sorted(rank.items(), key=itemgetter(1), reverse=True)[:N]

    # 产生推荐并通过准确率、召回率和覆盖率进行评估
    def evaluate(self):
        print('Evaluating start ...')
        N = self.n_rec_movie
        # 准确率和召回率
        hit = 0
        rec_count = 0
        test_count = 0
        # 覆盖率
        all_rec_movies = set()

        for i, user in enumerate(self.trainSet):
            test_moives = self.testSet.get(user, {})
            rec_movies = self.recommend(user)
            for movie, w in rec_movies:
                if movie in test_moives:
                    hit += 1
                all_rec_movies.add(movie)
            rec_count += N
            test_count += len(test_moives)

        precision = hit / (1.0 * rec_count)
        recall = hit / (1.0 * test_count)
        coverage = len(all_rec_movies) / (1.0 * self.movie_count)
        print('precisioin=%.4f\trecall=%.4f\tcoverage=%.4f' % (precision, recall, coverage))

    def rec_one(self,userId):
        print('推荐一个')
        rec_movies = self.recommend(userId)
        # print(rec_movies)
        return rec_movies

# itemCF 推荐算法接口
def recommend(userId):
    itemCF = ItemBasedCF()
    itemCF.get_dataset()
    itemCF.calc_movie_sim()
    reclist = []
    recs = itemCF.rec_one(userId)
    return recs
    # for movie, rate in recs:
    #     # print(movie, rate)
    #     reclist.append(dict(item=movie, rate=rate))
    # # itemCF.evaluate()
    # return reclist

# 测试
if __name__ == '__main__':
    print(recommend(1))

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(项目实战)业务场景中学透RocketMQ5.0-事务消息在预付卡系统中的应用

1 什么是事务消息 RocketMQ中事务消息主要是解决分布式场景下各业务系统事务一致性问题,常见的分布式事务解决方案有传统XA事务方案、TCC、本地消息表、MQ事务等。今天我们基于RocketMQ事务消息解决预付卡系统资金账户子系统和会员积分子系统、短信子系统分布式事务…

JMeter的基本使用与性能测试,完整入门篇保姆式教程

Jmeter 的简介 JMeter是一个纯Java编写的开源软件,主要用于进行性能测试和功能测试。它支持测试的应用/服务/协议包括Web (HTTP, HTTPS)、SOAP/REST Webservices、FTP、Database via JDBC等。我们最常使用的是HTTP和HTTPS协议。 Jmeter主要组件 线程组&#xff08…

永辉超市:胖东来爆改,成色几何?

单日业绩暴涨14倍。来,看看,这是被胖东来爆改后重新开业后的门店, 不出意外的流量爆炸。胖东来爆改,真是解决实体商超困境的灵丹妙药吗? 今天我们聊聊——永辉超市 最近两年实体商超日子都不好过,去年13家…

在Worpress增加网站的二级目录,并转向到站外网站

在WordPress中,你可以通过添加自定义重定向来实现将某个二级目录(例如 www.example.com/subdir)重定向到站外网站。可以通过以下几种方法来实现: 方法一:使用 .htaccess 文件 如果你的服务器使用Apache,你…

使用上海云盾 CDN 和 CloudFlare 后 Nginx、 WordPress、 Typecho 获取访客真实 IP 方法

最近因为被 DDoS/CC 攻击的厉害,明月就临时的迁移了服务器,原来的服务器就空置下来了,让明月有时间对服务器进行了重置重新部署安装生产环境。因为站点同时使用了上海云盾和 CloudFlare(具体思路可以参考【国内网站使用国外 CloudFlare CDN 的思路分享】一文)两个 CDN 服务…

Java数据类型与运算符

1. 变量和类型 变量指的是程序运行时可变的量,相当于开辟一块空间来保存一些数据。 类型则是对变量的种类进行了划分,不同类型的变量具有不同的特性。 1.1 整型变量(重点) 基本语法格式: int 变量名 初始值;代码示…

20240621在飞凌的OK3588-C开发板linux系统的CAM3上接OV5645录像

20240621在飞凌的OK3588-C开发板linux系统的CAM3上接OV5645录像 2024/6/21 19:57 开发板:OK3588-C SDK:linux R4/Buildroot v4l2-ctl --list-devices v4l2-ctl --list-formats-ext -d /dev/video16 gst-launch-1.0 v4l2src device/dev/video16 num-bu…

【Git】 -- Part2 -- 分支管理

1. 分支 在 Git 中,分支(Branch)是用于在项目中创建独立开发线路的机制。分支使得开发者可以在不影响主干(main 或 master)的情况下进行实验、开发新功能或修复 Bug。 举个例子: 分⽀就好像是科幻电影⾥⾯…

鸿蒙开发:【进程模型概述】

进程模型概述 系统的进程模型如下图所示: 应用中(同一包名)的所有PageAbility、ServiceAbility、DataAbility、FormAbility运行在同一个独立进程中,即图中绿色部分的“Main Process”。 WebView拥有独立的渲染进程,即…

OS复习笔记ch11-2

上一节我们学习的内容是I/O系统的特点和设备分类和差异,这一节我们将主要关注I/O控制方式、OS设计问题、I/O逻辑结构等。 I/O功能的演变 在专栏的ch1-2中,我们详细讲解了CPU与外设的三种交互方式,这里简单地带过。 (1&#xff0…

MPLS-LDP(个人学习笔记)

定义 标签分发协议LDP(Label Distribution Protocol)是多协议标签交换MPLS的一种控制协议,负责转发等价类FEC的分类、标签的分配以及标签交换路径LSP的建立和维护等操作。LDP规定了标签分发过程中的各种消息以及相关处理过程 术语 LDP会话&a…

计算机组成原理 | 计算机系统概述

CPI:(Clockcycle Per Instruction),指每条指令的时钟周期数。 时钟周期:对CPU来说,在一个时钟周期内,CPU仅完成一个最基本的动作。时钟脉冲是计算机的基本工作脉冲,控制着计算机的工作节奏。时钟周期 是一个时钟脉冲所…

ECharts 词云案例三:2024年阅读关键词

ECharts 词云案例三:2024年阅读关键词 引言 在数据可视化领域,ECharts 以其强大的功能性和灵活性,成为开发者和设计师的首选工具之一。继上一篇关于 ECharts 词云图的详细介绍后,本文将探索词云图的进阶应用——使用蒙版来创造更…

约束求解器方案设计

1.约束求解介绍 给定一个几何对象(点、直线段、圆、圆弧、平面等)的集合G和一个关于集合G中几何对象之间约束(点的位置、直线段的长度、圆弧对应的圆心角角度、垂直、相切等) 的集合C,则在二元组(G,C)中根…

【UIDynamic-动力学-附着行为-刚性附着 Objective-C语言】

一、接下来,我们来说这个附着行为啊, 1.我们之前举过例子,一个车坏了,另外一个车,拉着这个车,就是附着行为啊, 这个里边呢,我们新建一个项目, Name:09-附着行为-刚性附着, 附着行为呢,分为两个大类: 1)刚性附着 2)弹性附着 刚性附着,指的就是,两个物体之间…

第九届世界渲染大赛什么时候开始举办?

​第九届世界渲染大赛即将开启,全球设计师和艺术家将汇聚一堂,展现3D艺术的创新与美感。敬请期待这场业界顶级的视觉盛宴,让我们共同关注大赛的启幕时刻。 第九届世界渲染大赛开始时间 预计时间:2024年7月(中旬) 报名方法&#…

光纤三维布里渊温度和应变分布matlab模拟与仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 光纤三维布里渊温度和应变分布matlab模拟与仿真。其中 , 布里渊散射是光波与声波在光纤中传播时相互作用而产生的光散射过程 , 在不 同的条件下 , 布里渊散射又分…

51单片机STC89C52RC——4.1 独立按键(数码管显示按键值)

目录 目录 目的 一,STC单片机模块 二,矩阵按键模块 2.1 针脚定义 ​编辑 2.2 矩阵按键位置 2.3 如何理解按键按下后针脚的高低电平 2.3.1 错误理解1 2.3.2 错误理解2 2.3.3 正确判定按下的是那个按键的逻辑 2.3.4 判定按键按下的依次扫描程…

服务端代码编写中MySql大小写在Java中报错问题解决

报错信息: 原因:MySql和Java变量大小写产生的冲突。 经过查阅各个博客等,得出浅显结论(不一定对):MySql大小写不敏感,Java大小写敏感,当Javabean转为MySql数据库表时,Ja…

58-DOS与DDOS分析(正常TCP会话与SYN Flood攻击、ICMP Flood 攻击、SNMP放大攻击等)

目录 正常 TCP 会话与 SYN Flood 攻击 1、正常的三次握手过程: 2、 SYN Flood 攻击 一、攻击windows系统: 二、攻击web网站 : 拒绝服务攻击工具-Hping3-Syn Flood 攻击 拒绝服务攻击工具--Hping3--ICMP Flood 攻击 sockstress攻击 So…