推荐算法之协同过滤实例

该博客介绍了如何使用Python的surprise库进行协同过滤算法的应用,包括k折交叉验证,以及与R数据构建和算法结果的比较。
摘要由CSDN通过智能技术生成

接着上次的数据进行协同过滤算法应用

应用的知识

python的surprise
k折交叉验证
R数据构建
KNNBasic
KNNWithMeans
KNNWithZScore

数据处理与算法

# 协同过滤算法数据构建

user_artist_sum_weight <- sqldf::sqldf('select userID,artistID, sum(weight) as play_num from user_artists group by userID,artistID')
user_artist_sum_weight <- as.data.table(user_artist_sum_weight)

names(artists)[1] <- 'artistID'

artists_part <- artists[,c(1:2)]

data0 <- artists_part[user_artist_sum_weight,on='artistID']

user_taggedartists0 <- user_taggedartists[,1:3]

data1 <- user_taggedartists0[data0,on=c('userID','artistID')]
data2 <- tags[data1,on='tagID']

no_tags <- data2[is.na(data2$tagID),] 
no_tags <- no_tags[,user_artist_activity:=0]
head(no_tags)
have_tags <- data2[!is.na(data2$tagID),]
head(have_tags)

have_tags0 <- sqldf::sqldf('select userID,artistID,count(1) as user_artist_activity from have_tags group by userID,artistID')
have_tags1 <- sqldf::sqldf('select distinct userID,artistID,play_num from have_tags')

have_tags0 <- as.data.table(have_tags0)
have_tags1 <- as.data.table(have_tags1)

merge_have_tags <- have_tags0[have_tags1,on=c('userID','artistID')]
no_tags <- no_tags[,c("userID" ,"artistID" , "user_artist_activity" ,"play_num")]
merge_data <- rbind(merge_have_tags,no_tags)


# 构建等深分箱函数(Equal frequency intervals)

# play_num_EFI(1:4:4:1)
play_num_EFI <- EFI(merge_data$play_num,10,min(merge_data$play_num))
play_num_EFI$value
merge_data$play_num <- ifelse(merge_data$play_num<=37,'1',
                              ifelse(merge_data$play_num<=260,'2',
                                     ifelse(merge_data$play_num<=1387,'3','4')))

merge_data1 <- merge_data[user_artist_activity>0,]
user_artist_activity_EFI <- EFI(merge_data1$user_artist_activity,10,min(merge_data$user_artist_activity))
user_artist_activity_EFI$value
merge_data$user_artist_activity <- ifelse(merge_data$user_artist_activity==0,'0',
                                          ifelse(merge_data$user_artist_activity<=5,'1','2'))

summary(merge_data)
merge_data$user_artist_activity <- as.numeric(merge_data$user_artist_activity)
merge_data$play_num <- as.numeric(merge_data$play_num)
head(merge_data)
model_data <- sqldf::sqldf('select userID,artistID,sum(user_artist_activity)+sum(play_num) as score 
                           from merge_data group by userID,artistID')

python_data <- data.frame(user=model_data$userID,item=model_data$artistID,rating=model_data$score,timestamp=1)
# write.csv(python_data,'python_data.csv',row.names = FALSE)

python 之算法应用

# 可以使用上面提到的各种推荐系统算法
from surprise import Dataset
from surprise import  print_perf
from surprise import KNNBasic,KNNWithMeans,KNNWithZScore, KNNBaseline
import os
from surprise import Reader, Dataset
from surprise.model_selection import cross_validate
from pandas import DataFrame 
import numpy as np
import pandas as pd
######################################## KNNBasic
#algo = KNNBasic(k=1,sim_options = {'name': 'pearson','user_based': True})# 皮尔逊基于用户

## 指定文件路径
file_path = os.path.expanduser('./python_data.txt')
## 指定文件格式\n",
reader = Reader(line_format='user item rating timestamp', sep=',')
## 从文件读取数据
data = Dataset.load_from_file(file_path, reader=reader)

algo1 = KNNBasic(k=1,sim_options = {
  'name': 'pearson','user_based': True})
algo2 = KNNBasic(k=3,sim_options = {
  'name': 'pearson','user_based': True})
algo3 = KNNBasic(k=5,sim_options = {
  'name': 'pearson','user_based': True})
algo4 = KNNBasic(k=7,sim_options = {
  'name': 'pearson','user_based': True})
algo5 = KNNBasic(k=9,sim_options = {
  'name': 'pearson','user_based': True})
algo6 = KNNBasic(k=11,sim_options = {
  'name': 'pearson','user_based': True})
algo7 = KNNBasic(k=13,sim_options = {
  'name': 'pearson','user_based'<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值