数据挖掘课程设计实战

您所在的位置:网站首页 音乐网课平台排行 数据挖掘课程设计实战

数据挖掘课程设计实战

2023-08-06 23:47| 来源: 网络整理| 查看: 265

当当当当~上一次发博客好像是在去年11月了。歇了这么久了,就趁这个风和日丽的下午,选在数字图像处理课上跟大家分享一下一下上学期最后的数据挖掘课程设计吧!(反正数字图像处理课我是听不懂~)

项目要求用Django开发前端可视化,前端可视化模块是我的组长负责的,所以本博客主要专注于推吉安算法模块的实现、代码讲解。如有问题欢迎与我交流。

1. 项目介绍

音乐推荐系统

必须实现的需求:用户注册/登录/退出,存储音乐数据,存储用户和歌手数据,计算音乐模型,根据基于内容的推荐算法和基于物品和用户的协同过滤算法等计算用户可能感兴趣的音乐,展示用户可能喜欢的音乐,具有选择用户,选择标签(可选歌曲、歌手等),为你推荐,歌单与歌手推荐,歌单详情与歌单详情页推荐,排行榜,我的足迹,后台管理等功能。  

2. 项目演示

网站首页

登陆页面

所有歌曲页面

“猜你喜欢”页面

“我的信息”页面

“浏览记录”页面

  3. 模块分解

要开发搭建一个具有推荐功能的音乐网站,工程量着实不小。本次课程设计我们是分组每组三人进行的,三人之间的分工大概是这样的:

4. 数据库中的数据

我们选取了数据集中听歌次数最多的前500名用户,处理得到了这些用户听过的歌,共有25928首

数据处理过后的干净数据是长介个样子滴

【1】歌曲表(⭐歌曲热榜、全部歌曲模块所使用的表)

song_idtitlereleaseartist_nameyearplay_countSOBONKR12A58A7A7E0You're The OneIf There Was A WayDwight Yoakam1990726885SOAUWYT12A81C206F1UndoVespertine LiveBj?rk2001648239SOSXLTC12AF72A7F54RevelryOnly By The NightKings Of Leon2008527893SOFRQTD12A81C233C0Sehr kosmischMusik von HarmoniaHarmonia1999425463SOEGIYH12A6D4FC0E3Horn Concerto No. 4 in E flat K495: II. Romance (Andante cantabile)Mozart - Eine kleine NachtmusikBarry Tuckwell/Academy of St Martin-in-the-Fields/Sir Neville Marriner1999389880SOAXGDH12A8C13F8A1Dog Days Are Over (Radio Edit)Now That's What I Call Music! 75Florence + The Machine1999356533........................

【2】歌手表(⭐歌曲热榜所使用的表)

artist_nameLinkin ParkBlackmore's NightVanessa CarltonTarkanStelios KazantzidesAkonDierks BentleyRy Cooder......

【3】用户表(⭐登录、注册模块所使用的表)

user_idusernamepasswordsexage093cb74eb3c517c5179ae24caf0ebec51b24d2a21123456男17d13609d62db6df876d3cc388225478618bb7b9122123456男214cbca37009400bb5676ba54c2a4cc24ff0531cb73123456男24d5d1fc74f29ef42eefc2acf4c8c59da2994a0a164123456男1981193c20d49bfbca4a72eaa1119f6bb2fc4d9e485123456女17d19e8c59d207bf3e3c7ca0248a1fa684c00d006b6123456男33bedad07238f60df86cb77b2d4ef1441c8f0b3a3b7123456男319c6ebf1d5ba38bcb577149b22e19448f655f62528123456女251fc2a7f42424249718cc544a0a1036a69d5bc7b89123456女15fc05f377863a77d7784b02de2cc06cdecb85968b10123456女27...................

【4】年份表(⭐歌曲热榜所使用的表)

year200720062002199920042003.....

【5】用户-歌曲表(⭐推荐算法模块所使用的表)

song_iduser_idlisten_counttitleplay_countreleaseartist_nameyearfractional_listen_countSOABHYV12A6D4F6D0F093cb74eb3c517c5179ae24caf0ebec51b24d2a211Shadow Of The Day (Album Version)13132Minutes To MidnightLinkin Park20070.000837648SOABHYV12A6D4F6D0Fd13609d62db6df876d3cc388225478618bb7b9121Shadow Of The Day (Album Version)3657Minutes To MidnightLinkin Park20070.000273448SOABHYV12A6D4F6D0F4cbca37009400bb5676ba54c2a4cc24ff0531cb733Shadow Of The Day (Album Version)3470Minutes To MidnightLinkin Park20070.009510086...........................

【6】在Django框架的models中建好表,把他们分别导进去就可以啦!

5. 我所负责的模块

我负责完成的是推荐算法的实现模块,实现了以下几种推荐算法:

UserCF(基于用户的协同过滤)

ItemCF(基于物品的协同过滤)

SVD分解

冷启动(对新注册的用户进行音乐的推荐)

以下是我负责的推荐算法模块的代码

# Thanks to Siraj Raval for this module '''两种推荐算法:基于物品相似度和对于新用户的冷启动''' import pandas as pd import numpy as np from scipy.sparse import coo_matrix import math as mt from scipy.sparse.linalg import * #used for matrix multiplication from scipy.sparse.linalg import svds from scipy.sparse import csc_matrix #Class for Popularity based Recommender System model #计算统计返回歌曲表中每首歌的被听次数,用于新用户(解决冷启动) class popularity_recommender_py(): def __init__(self): self.train_data = None self.user_id = None self.item_id = None self.popularity_recommendations = None def create(self, train_data, user_id, item_id): self.train_data = train_data self.user_id = user_id self.item_id = item_id#进行分类的指标:可以选择 歌曲名 歌手 年份 等等 train_data_grouped = train_data.groupby([self.item_id]).agg({self.user_id: 'count'}).reset_index()#计算按分类指标的播放次数 train_data_grouped.rename(columns = {self.user_id: 'score'},inplace=True) train_data_sort = train_data_grouped.sort_values(['score', self.item_id], ascending = [0,1])#对计算结果进行排序 train_data_sort['Rank'] = train_data_sort['score'].rank(ascending=0, method='first') self.popularity_recommendations = train_data_sort.head(10)#返回前十名推荐歌曲作为推荐结果 def recommend(self, user_id): user_recommendations = self.popularity_recommendations user_recommendations['user_id'] = user_id cols = user_recommendations.columns.tolist() cols = cols[-1:] + cols[:-1] user_recommendations = user_recommendations[cols] return user_recommendations #基于用户的歌曲相似度进行推荐(基于用户的协同过滤算法)返回的是推荐歌曲的dataFrame class user_similarity_recommender_py(): def __init__(self): self.train_data = None self.user_id = None self.user_title = None#user_id self.item_title = None self.ans_user_set = {} def create(self,train_data,user_title,item_title, user_id):#构造对象 self.user_title = user_title self.train_data = train_data self.item_title = item_title self.user_id = user_id def get_all_user_train_data(self):#获取training data中的所有用户id all_users = list(self.train_data[self.user_title].unique()) return all_users def get_user_items(self, user): # 获取user用户听过的所有歌的列表 user_data = self.train_data[self.train_data[self.user_title] == user] # user这个用户都听了哪几首歌 user_items = list(user_data[self.item_title].unique()) return user_items def get_similarity_users(self):#获取前十个相似的用户 all_users = self.get_all_user_train_data()#得到所有用户 song_user = set(self.get_user_items(self.user_id))#得到待推荐用户听过的歌 lis = [] for i in all_users:#对于数据集中的每一个用户 l = [] song_i = set(self.get_user_items(i)) songs_intersection = song_i.intersection(song_user)#计算这两名用户听过歌曲的交集 if len(songs_intersection) != 0: songs_union = song_i.union(song_user)#计算这两名用户听过歌曲的并集 score = float(len(songs_intersection))/float(len(songs_union))#计算这两名用户的相似度 l.append(i) l.append(score) lis.append(l) lis.sort(key=lambda x : x[1], reverse=True)#按相似度对用户进行排序 ans = [] return lis for i in range(0, min(5,len(lis))): ans.append(lis[i][0])#得到前五名用户的user_id return ans def get_ans(self): ini_songs = self.get_user_items(self.user_id) users = self.get_similarity_users()#得到与被推荐用户最相似的前五名用户的id columns = ['similary_users','songs'] ans = [] for i in users:#对于每一个推荐结果用户 recommend_user = i[0] songs = self.get_user_items(recommend_user)#得到推荐结果用户听过的所有歌 for recommend_song in songs: if recommend_song not in ini_songs and recommend_song not in ans:#如果这首歌没被推荐过,待推荐用户也没有听过 ans.append(recommend_song) if len(ans) == 10:#限制返回的歌曲数量 return ans #Class for Item similarity based Recommender System model #基于歌曲的受众相似度进行推荐(基于物品的协同过滤算法)返回的是推荐歌曲的dataFrame class item_similarity_recommender_py(): def __init__(self): self.train_data = None self.unique_song_title = None self.user_id = None self.item_id = None self.cooccurence_matrix = None self.songs_dict = None self.rev_songs_dict = None self.item_similarity_recommendations = None self.dic = {} def create(self, train_data, user_id, item_id, unique_song_title): self.train_data = train_data self.user_id = user_id self.item_id = item_id self.unique_song_title = unique_song_title self.get_my_dic() def get_user_items(self, user): user_data = self.train_data[self.train_data[self.user_id] == user]#user这个用户都听了哪几首歌 user_items = list(user_data[self.item_id].unique()) return user_items def get_item_users(self, item): item_data = self.train_data[self.train_data[self.item_id] == item] item_users = set(item_data[self.user_id].unique()) return item_users def get_all_items_train_data(self): all_items = list(self.train_data[self.item_id].unique()) # print("all_items:",all_items) return all_items def get_my_dic(self): user_id = self.train_data['user_id'] song_title = self.train_data['title'] for i in song_title: self.dic[i] = [] lis = [] j = 0 for i in song_title: self.dic[i].append(user_id[j]) j += 1 def construct_cooccurence_matrix(self, user_songs, all_songs):#构造相似度矩阵 cooccurence_matrix = np.matrix(np.zeros(shape=(len(user_songs), len(all_songs))), float) for i in range(0, len(all_songs)):#遍历所有的歌 users_i = set(self.dic[all_songs[i]])#取出听过这一首歌的用户 for j in range(0, len(user_songs)):#遍历待推荐用户听过的所有歌 users_j = set(self.dic[user_songs[j]])#取出听过这一首歌的用户 users_intersection = users_i.intersection(users_j) if len(users_intersection) != 0: users_union = users_i.union(users_j) cooccurence_matrix[j, i] = float(len(users_intersection)) / float(len(users_union))#用Jacccard相似系数作为衡量相似度 else: cooccurence_matrix[j, i] = 0 return cooccurence_matrix def generate_top_recommendations(self, user, cooccurence_matrix, all_songs, user_songs): user_sim_scores = cooccurence_matrix.sum(axis=0)/float(cooccurence_matrix.shape[0]) #每首歌总得分为这首歌与user_songs中所有歌相似度的平均值 user_sim_scores = np.array(user_sim_scores)[0].tolist()#得到每首歌的推荐下标 sort_index = sorted(((e,i) for i,e in enumerate(list(user_sim_scores))), reverse=True)#将歌曲按总相似度进行排序 columns = ['user_id', 'song', 'score', 'rank'] df = pd.DataFrame(columns=columns)#构造一个DataFrame类型暂时存储推荐结果 rank = 1#限制返回的歌曲数量 for i in range(0,len(sort_index)):#遍历推荐列表 if ~np.isnan(sort_index[i][0]) and all_songs[sort_index[i][1]] not in user_songs and rank


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3