Surprise库使用总结

2023-11-05

Surprise库

Surprise(Simple Python Recommendation System Engine)是scikit系列的一个基于Python的构建和分析推荐系统的工具库。下面按照构建推荐系统并进行分析的流程梳理一遍涉及到的模块。

1. 加载数据模块

关于加载数据主要有surprise.Dataset读取数据模块和surprise.Reader数据解析模块。数据来源有以下四种:

  1. 加载库内置的数据:Dataset.load_builtin(name),内建数据有‘ml-100k’, ‘ml-1m’和 ‘jester’,默认为’ml-100k’。
from surprise import SVD
from surprise import Dataset
from surprise import accuracy
from surprise.model_selection import KFold

# Load the movielens-100k dataset
data = Dataset.load_builtin('ml-100k')

# define a cross-validation iterator
kf = KFold(n_splits=3)

algo = SVD()

for trainset, testset in kf.split(data):

    # train and test algorithm.
    algo.fit(trainset)
    predictions = algo.test(testset)

    # Compute and print Root Mean Squared Error
    accuracy.rmse(predictions, verbose=True)
  1. pandas.DataFrame加载数据:Dataset.load_from_df(df, reader)dfpandas.DataFrame格式,三列对应user_iditem_idratingreader为读取文件时的格式,是一个Reader类,在这里只需要设置rating_scale评分范围。
import pandas as pd

from surprise import Dataset
from surprise import Reader

# Creation of the dataframe. Column names are irrelevant.
ratings_dict = {'itemID': [1, 1, 1, 2, 2],
                'userID': [9, 32, 2, 45, 'user_foo'],
                'rating': [3, 2, 4, 3, 1]}
df = pd.DataFrame(ratings_dict)

# A reader is still needed but only the rating_scale param is requiered.
reader = Reader(rating_scale=(1, 5))

# The columns must correspond to user id, item id and ratings (in that order).
data = Dataset.load_from_df(df[['userID', 'itemID', 'rating']], reader)
  • Reader:读取外部数据的时候需要用到,surprise.reader.Reader(name, line_format, sep, rating_scale, skip_line)
    • name:可以选择内建数据集名称,使用时会忽略其他参数
    • line_format:定义每行格式,默认空格分割;
    • sep:设置分隔符;
    • rating_scale:设置rating范围,格式为元组;
    • skip_line:默认为0。
  1. 从一个文件加载数据:Dataset.load_from_file(file_path, reader)file_path为数据集路径,reader为文件解析类,包括每行格式、分隔符、评分范围等。
from surprise import Dataset
from surprise import Reader

# path to dataset file
file_path = os.path.expanduser('~/.surprise_data/ml-100k/ml-100k/u.data')

# As we're loading a custom dataset, we need to define a reader. In the
# movielens-100k dataset, each line has the following format:
# 'user item rating timestamp', separated by '\t' characters.
reader = Reader(line_format='user item rating timestamp', sep='\t')

data = Dataset.load_from_file(file_path, reader=reader)
  1. 针对数据已经划分好的情况,加载多个文件:Dataset.load_from_folds(folds_file, reader)
from surprise import SVD
from surprise import Dataset
from surprise import Reader
from surprise import accuracy
from surprise.model_selection import PredefinedKFold

# path to dataset folder
files_dir = os.path.expanduser('~/.surprise_data/ml-100k/ml-100k/')

# This time, we'll use the built-in reader.
reader = Reader('ml-100k')

# folds_files is a list of tuples containing file paths:
# [(u1.base, u1.test), (u2.base, u2.test), ... (u5.base, u5.test)]
train_file = files_dir + 'u%d.base'
test_file = files_dir + 'u%d.test'
folds_files = [(train_file % i, test_file % i) for i in (1, 2, 3, 4, 5)]

data = Dataset.load_from_folds(folds_files, reader=reader)
pkf = PredefinedKFold()

algo = SVD()

for trainset, testset in pkf.split(data):

    # train and test algorithm.
    algo.fit(trainset)
    predictions = algo.test(testset)

    # Compute and print Root Mean Squared Error
    accuracy.rmse(predictions, verbose=True)

2. 模型训练前的数据划分模块

这部分方法都位于surprise.model_selection.split部分。

2.1 交叉验证数据划分

方法名 说明
KFold(n_splits=5, random_state=None, shuffle=True) 基本的K折交叉验证迭代器
LeaveOneOut(n_splits=5, random_state=None, min_n_ratings=0) 留一法
PredefinedKFold 使用Dataset.load_from_folds加载数据时使用
RepeatedKFold(n_splits=5, n_repeats=10, random_state=None) 使用不同的随机数重复n次k折交叉验证
ShuffleSplit(n_splits=5, test_size=0.2, train_size=None, random_state=None, shuffle=True) 随机训练集和测试集的基本交叉验证迭代器

2.2 训练集测试集划分

train_test_split(data, test_size=0.2, train_size=None, random_state=None, shuffle=True)


3 构建算法模块

3.1 记号说明

符号 说明
R R R 评分集
R t r a i n R_{train} Rtrain, R t e s t R_{test} Rtest, R ^ \hat R R^ 训练集,测试集,预测集
U U U user集合
u u u, v v v user
I I I item集合
i i i, j j j item
U i U_i Ui 对item i有评分的user集合
U i j U_{ij} Uij 同时对item i和j有评分的user集合
I u I_u Iu user u评分过的item集合
I u v I_{uv} Iuv user u和v共同评分过的item集合
r u i r_{ui} rui user u对item i的真实评分
r ^ u i \hat r_{ui} r^ui user u对item i的估计评分
b u i b_{ui} bui user u对item i的baseline评分, b u i = μ + b u + b i b_{ui}=\mu+b_u+b_i bui=μ+bu+bi
μ \mu μ 所有评分的均值
μ u \mu_u μu user u给出的所有评分的均值
μ i \mu_i μi 打给item i的所有评分的均值
σ u \sigma_u σu user u给出的所有评分的标准差
σ i \sigma_i σi item i收到的所有评分的标准差
N i ( u ) k N_{i(u)}^k Ni(u)k 给item i有评分的user u的k个近邻user集合,使用相似度指标计算得到
N u ( i ) k N_{u(i)}^k Nu(i)k user u打过分的item i的k个近邻item集合,使用相似度指标计算得到

3.2 基于统计的算法

基于surprise.prediction_algorithms模块

  • 随机预测:random_pred.NormalPredictor
    假设训练集评分服从正态分布,根据训练集数据进行最大似然估计得到评分的均值 μ ^ \hat\mu μ^和标准差 σ ^ \hat\sigma σ^,构建正态分布 N ( μ , σ ) N(\mu,\sigma) N(μ,σ),由正态分布产生预测结果。
    μ ^ = ∑ r u i ∈ R t r a i n r u i ∣ R t r a i n ∣ \hat{\mu}=\frac{\sum_{r_{ui}\in{R_{train}}}r_{ui}}{|R_{train}|} μ^=RtrainruiRtrainrui
    σ ^ = ∑ ( r u i − μ ^ ) 2 ∣ R t r a i n ∣ \hat{\sigma}=\sqrt{\frac{\sum(r_{ui}-\hat{\mu})^2}{|R_{train}|}} σ^=Rtrain(ruiμ^)2
  • baseline:baseline_only.BaselineOnly(bsl_options={}, verbose=True)
    假设函数为 r u i = b u i = μ + b u + b i r_{ui}=b_{ui}=\mu+b_u+b_i rui=bui=μ+bu+bi,则需要最小化 ∑ r u i ∈ R t r a i n ( r u i − ( μ + b u + b i ) ) 2 + λ ( ∑ u b u 2 + ∑ i b i 2 ) \sum_{r_{ui}\in R_{train}}(r_{ui}-(\mu+b_u+b_i))^2+\lambda (\sum_u b_u^2+\sum_i b_i^2) ruiRtrain(rui(μ+bu+bi))2+λ(ubu2+ibi2),使用Stochastic Gradient Descent (SGD)Alternating Least Squares(ALS)进行求解。
    使用SGD时,损失函数为 ∑ r u i ∈ R t r a i n ( r u i − ( μ + b u + b i ) ) 2 + λ ( ∑ u b u 2 + ∑ i b i 2 ) \sum_{r_{ui}\in R_{train}}(r_{ui}-(\mu+b_u+b_i))^2+\lambda (\sum_u b_u^2+\sum_i b_i^2) ruiRtrain(rui(μ+bu+bi))2+λ(ubu2+ibi2)参数有:
参数 说明 默认值
reg 损失函数的正则化参数 λ \lambda λ 0.02
learning_rate 学习率 0.005
n_epochs 迭代次数 20
print('Using SGD')
bsl_options = {'method': 'sgd',
               'learning_rate': .00005,
               'n_epochs': 20
               }
algo = BaselineOnly(bsl_options=bsl_options)

使用ALS时,损失函数为 ∑ r u i ∈ R t r a i n ( r u i − ( μ + b u + b i ) ) 2 + λ 1 ∑ u b u 2 + λ 2 ∑ i b i 2 \sum_{r_{ui}\in R_{train}}(r_{ui}-(\mu+b_u+b_i))^2+\lambda_1\sum_u b_u^2+\lambda_2\sum_i b_i^2 ruiRtrain(rui(μ+bu+bi))2+λ1ubu2+λ2ibi2参数有:

参数 说明 默认值
reg_u item的正则化参数 λ 1 \lambda_1 λ1 15
reg_i user的正则化参数 λ 2 \lambda_2 λ2 10
n_epochs ALS过程的迭代次数 10
bsl_options = {'method': 'als',
               'n_epochs': 5,
               'reg_u': 12,
               'reg_i': 5
               }
algo = BaselineOnly(bsl_options=bsl_options)

3.3 基于近邻(协同过滤)的方法

3.3.1 相似度计算模块

sim_options={name, user_based, min_support ,shrinkage}

  • name表示相似度计算方法,有cosine, msd, pearson, pearson_baseline四种;
    • Cosine similarity
      c o s i n e _ s i m ( u , v ) = ∑ i ∈ I u v r u i r v i ∑ i ∈ I u v r u i 2 ∑ i ∈ I u v r v i 2 cosine\_sim(u,v)=\frac{\sum_{i\in{I_{uv}}}r_{ui}r_{vi}}{\sqrt{\sum_{i\in{I_{uv}}}r_{ui}^2}\sqrt{\sum_{i\in{I_{uv}}}r_{vi}^2}} cosine_sim(u,v)=iIuvrui2 iIuvrvi2 iIuvruirvi
    • Mean Squared Difference similarity
      m s d ( u , v ) = 1 ∣ I u v ∣ ∑ i ∈ I u v ( r u i − r v i ) 2 msd(u,v)=\frac{1}{|I_{uv}|}\sum_{i\in{I_{uv}}}(r_{ui}-r_{vi})^2 msd(u,v)=Iuv1iIuv(ruirvi)2
      m s d _ s i m ( u , v ) = 1 1 + m s d ( u , v ) msd\_sim(u,v)=\frac{1}{1+msd(u,v)} msd_sim(u,v)=1+msd(u,v)1
    • Pearson similarity
      p e a r s o n _ s i m ( u , v ) = ∑ i ∈ I u v ( r u i − μ u ) ( r v i − μ v ) ∑ i ∈ I u v ( r u i − μ u ) 2 ∑ i ∈ I u v ( r v i − μ v ) 2 pearson\_sim(u,v)=\frac{\sum_{i\in{I_{uv}}}(r_{ui}-\mu_u)(r_{vi}-\mu_v)}{\sqrt{\sum_{i\in{I_{uv}}}(r_{ui}-\mu_u)^2}\sqrt{\sum_{i\in{I_{uv}}}(r_{vi}-\mu_v)^2}} pearson_sim(u,v)=iIuv(ruiμu)2 iIuv(rviμv)2 iIuv(ruiμu)(rviμv)
    • Pearson baseline similarity:使用baseline b u i b_{ui} bui取代mean
      p e a r s o n _ b a s e l i n e _ s i m ( u , v ) = ∑ i ∈ I u v ( r u i − b u i ) ( r v i − b v i ) ∑ i ∈ I u v ( r u i − b u i ) 2 ∑ i ∈ I u v ( r v i − b v i ) 2 pearson\_baseline\_sim(u,v)=\frac{\sum_{i\in{I_{uv}}}(r_{ui}-b_{ui})(r_{vi}-b_{vi})}{\sqrt{\sum_{i\in{I_{uv}}}(r_{ui}-b_{ui})^2}\sqrt{\sum_{i\in{I_{uv}}}(r_{vi}-b_{vi})^2}} pearson_baseline_sim(u,v)=iIuv(ruibui)2 iIuv(rvibvi)2 iIuv(ruibui)(rvibvi)
      当评分矩阵十分稀疏时,使用下式计算以减少过拟合
      p e a r s o n _ b a s e l i n e _ s h r i n k _ s i m ( u , v ) = ∣ I u v ∣ − 1 ∣ I u v ∣ − 1 + s h r i n k a g e p e a r s o n _ b a s e l i n e _ s i m ( u , v ) pearson\_baseline\_shrink\_sim(u,v)=\frac{|I_{uv}|-1}{|I_{uv}|-1+shrinkage}pearson\_baseline\_sim(u,v) pearson_baseline_shrink_sim(u,v)=Iuv1+shrinkageIuv1pearson_baseline_sim(u,v)
  • user_based表示是否是基于用户的相似度,True表示基于用户的相似度,False表示基于物品的相似度;
  • min_support表示认为两个user或item具有相似性时具有的最少相同数量的item或user,数目小于min_support的user或item会被认为相似性为0;
  • shrinkage是在name=pearson_baseline时有用,默认值为100。

3.3.2 预测算法

knns.KNNBasic(k=40, min_k=1, sim_options={}, verbose=True):基本的基于物品or用户的协同过滤
r ^ u i = ∑ v ∈ N i ( u ) k s i m ( u , v ) × r v i ∑ v ∈ N i ( u ) k s i m ( u , v ) \hat r_{ui}=\frac{\sum_{v\in{N_{i(u)}^k}}sim(u,v)\times r_{vi}}{\sum_{v\in{N_{i(u)}^k}}sim(u,v)} r^ui=vNi(u)ksim(u,v)vNi(u)ksim(u,v)×rvi
knns.KNNWithMeans(k=40, min_k=1, sim_options={}, verbose=True):考虑用户/物品偏好的协同过滤
r ^ u i = μ u + ∑ v ∈ N i ( u ) k s i m ( u , v ) × ( r v i − μ v ) ∑ v ∈ N i ( u ) k s i m ( u , v ) \hat r_{ui}=\mu_u+\frac{\sum_{v\in{N_{i(u)}^k}}sim(u,v)\times (r_{vi}-\mu_v)}{\sum_{v\in{N_{i(u)}^k}}sim(u,v)} r^ui=μu+vNi(u)ksim(u,v)vNi(u)ksim(u,v)×(rviμv)
knns.KNNWithZScore(k=40, min_k=1, sim_options={}, verbose=True)考虑用户/物品偏好,并对用户/物品进行z-score归一化
r ^ u i = μ u + σ u ∑ v ∈ N i ( u ) k s i m ( u , v ) × ( r v i − μ v ) ÷ σ v ∑ v ∈ N i ( u ) k s i m ( u , v ) \hat r_{ui}=\mu_u+\sigma_u \frac{\sum_{v\in{N_{i(u)}^k}}sim(u,v)\times (r_{vi}-\mu_v)\div\sigma_v}{\sum_{v\in{N_{i(u)}^k}}sim(u,v)} r^ui=μu+σuvNi(u)ksim(u,v)vNi(u)ksim(u,v)×(rviμv)÷σv
knns.KNNBaseline(k=40, min_k=1, sim_options={}, bsl_options={}, verbose=True)基于baseline的协同过滤
r ^ u i = b u i + ∑ v ∈ N i ( u ) k s i m ( u , v ) × ( r v i − b v i ) ∑ v ∈ N i ( u ) k s i m ( u , v ) \hat r_{ui}=b_{ui}+\frac{\sum_{v\in{N_{i(u)}^k}}sim(u,v)\times (r_{vi}-b_{vi})}{\sum_{v\in{N_{i(u)}^k}}sim(u,v)} r^ui=bui+vNi(u)ksim(u,v)vNi(u)ksim(u,v)×(rvibvi)

3.4 基于矩阵分解的方法

  1. Simon Funk2016年参加Netflix Prize期间在博客公开了一个算法Funk-SVD,也称为Latent Factor Model。
    假设函数为 r ^ u i = q i T p u \hat r_{ui}=q_i^Tp_u r^ui=qiTpu,等同于概率矩阵分解Probabilistic Matrix Factorization
  2. matrix_factorization.SVD,考虑偏置项的LFM,也称为bias-SVD
    假设函数为 r ^ u i = μ + b u + b i + q i T p u \hat r_{ui}=\mu+b_u+b_i+q_i^Tp_u r^ui=μ+bu+bi+qiTpu
    构造损失函数为
    ∑ r u i ∈ R t r a i n ( r u i − r ^ u i ) 2 + λ ( b u 2 + b i 2 + ∣ ∣ q i ∣ ∣ 2 + ∣ ∣ p u ∣ ∣ 2 ) \sum_{r_{ui}\in {R_{train}}}(r_{ui}-\hat r_{ui})^2+\lambda(b_u^2+b_i^2+||q_i||^2+||p_u||^2) ruiRtrain(ruir^ui)2+λ(bu2+bi2+qi2+pu2)
    带入假设函数得 ∑ r u i ∈ R t r a i n ( r u i − ( μ + b u + b i + q i T p u ) ) 2 + λ ( b u 2 + b i 2 + ∣ ∣ q i ∣ ∣ 2 + ∣ ∣ p u ∣ ∣ 2 ) \sum_{r_{ui}\in {R_{train}}}(r_{ui}-(\mu+b_u+b_i+q_i^Tp_u))^2+\lambda(b_u^2+b_i^2+||q_i||^2+||p_u||^2) ruiRtrain(rui(μ+bu+bi+qiTpu))2+λ(bu2+bi2+qi2+pu2)
    使用SGD的迭代公式如下:
    b u = b u + γ ( r u i − r ^ u i − λ b u ) b_u = b_u + \gamma(r_{ui}-\hat r_{ui}-\lambda b_u) bu=bu+γ(ruir^uiλbu)
    b i = b i + γ ( r u i − r ^ u i − λ b i ) b_i = b_i + \gamma(r_{ui}-\hat r_{ui}-\lambda b_i) bi=bi+γ(ruir^uiλbi)
    q i = q i + γ ( ( r u i − r ^ u i ) p u − λ q i ) q_i = q_i + \gamma((r_{ui}-\hat r_{ui})p_u-\lambda q_i) qi=qi+γ((ruir^ui)puλqi)
    p u = p u + γ ( ( r u i − r ^ u i ) q i − λ p u ) p_u = p_u + \gamma((r_{ui}-\hat r_{ui})q_i-\lambda p_u) pu=pu+γ((ruir^ui)qiλpu)
    其中 γ \gamma γ是学习速率, λ \lambda λ是正则化系数。
    算法参数:
参数名 说明 默认值
n_factor 设置的factor数目 100
n_epochs SGD算法的迭代次数 20
biased 是否使用bias-SVD,True使用bias-SVD,False使用SVD True
lr_all 所有参数的学习速率,也可以针对不同的参数设置不同的学习速率 0.005
reg_all 所有参数的正则化系数,也可以针对不同的参数设置不同的正则化系数 0.02

返回 p u p_u pu q i q_i qi b u b_u bu b i b_i bi

  1. matrix_factorization.SVDpp
    前面的LFM模型并没有显式地考虑用户的历史行为对用户评分预测的影响。Koren在Netflix Prize比赛中提出了一个模型,将用户历史评分的物品加入到了LFM模型中,结合了基于item的邻域方法(item-CF)和LFM,称为SVD++。(论文:Factor in the Neigbhorhood: Scalable and Accurate Collaborative Filtering)
    假设函数为:
    r ^ u i = μ + b u + b i + q i T p u + 1 ∣ I u ∣ ∑ j ∈ I u w i j \hat r_{ui}=\mu+b_u+b_i+q_i^Tp_u+\frac{1}{|I_u|}\sum_{j\in I_u}w_{ij} r^ui=μ+bu+bi+qiTpu+Iu1jIuwij
    将物品相似度矩阵 w i j w_{ij} wij同样进行分解,得:
    r ^ u i = μ + b u + b i + q i T p u + 1 ∣ I u ∣ x i T ∑ j ∈ I u y j \hat r_{ui}=\mu+b_u+b_i+q_i^Tp_u+\frac{1}{|I_u|}x_i^T\sum_{j\in I_u}y_j r^ui=μ+bu+bi+qiTpu+Iu1xiTjIuyj
    为了缓解过拟合,令 x = q x=q x=q,得
    r ^ u i = μ + b u + b i + q i T ( p u + 1 ∣ I u ∣ ∑ j ∈ I u y j ) \hat r_{ui}=\mu+b_u+b_i+q_i^T(p_u+\frac{1}{|I_u|}\sum_{j\in I_u}y_j) r^ui=μ+bu+bi+qiT(pu+Iu1jIuyj)
    后面构造损失函数,以及算法的超参数与bias-SVD相似。
  2. matrix_factorization.NMF
    Non-negative Matrix Factorization (NMF),一种基于非负矩阵分解的协同过滤算法。假设函数为 r ^ u i = μ + b u + b i + q i T p u \hat r_{ui}=\mu+b_u+b_i+q_i^Tp_u r^ui=μ+bu+bi+qiTpu,与SVD的区别在于 q i q_i qi p u p_u pu的值在任何时候都是非负的。相关论文有:
参数名 说明 默认值
n_factor 设置的factor数目 15
n_epochs SGD算法的迭代次数 50
biased 是否使用偏置项 False
reg_pu p u p_u pu的正则化系数 0.06
reg_qi q i q_i qi的正则化系数 0.06
reg_bu b u b_u bu的正则化系数,biased=True时有效 0.02
reg_bi b i b_i bi的正则化系数,biased=True时有效 0.02
lr_bu b u b_u bu的学习速率,biased=True时有效 0.005
lr_bi b i b_i bi的学习速率,biased=True时有效 0.005
init_low factor随机初始化的下界,必须大于等于0 0
init_high factor随机初始化的上界 1

4. 交叉验证和超参数优化

validation.cross_validate(algo, data, measures=[u'rmse', u'mae'], cv=None, return_train_measures=False, n_jobs=1, pre_dispatch=u'2*n_jobs', verbose=False)
对于给定的算法和数据运行交叉验证过程,返回正确性和花费时间的报告。

from surprise import SVD
from surprise import Dataset
from surprise.model_selection import cross_validate

# Load the movielens-100k dataset (download it if needed),
data = Dataset.load_builtin('ml-100k')

# We'll use the famous SVD algorithm.
algo = SVD()

# Run 5-fold cross-validation and print results
cross_validate(algo, data, measures=['RMSE', 'MAE'], cv=5, verbose=True)

search.GridSearchCV(algo_class, param_grid, measures=[u'rmse', u'mae'], cv=None, refit=False, return_train_measures=False, n_jobs=1, pre_dispatch=u'2*n_jobs', joblib_verbose=0):网格搜索交叉验证

from surprise import SVD
from surprise import Dataset
from surprise.model_selection import GridSearchCV

# Use movielens-100K
data = Dataset.load_builtin('ml-100k')

param_grid = {'n_epochs': [5, 10], 'lr_all': [0.002, 0.005],
              'reg_all': [0.4, 0.6]}
gs = GridSearchCV(SVD, param_grid, measures=['rmse', 'mae'], cv=3)

gs.fit(data)

# best RMSE score
print(gs.best_score['rmse'])

# combination of parameters that gave the best RMSE score
print(gs.best_params['rmse'])

5.结果分析模块

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Surprise库使用总结 的相关文章

  • [推荐系统] 1. 深度学习与推荐系统

    文章目录 1 推荐系统 1 1 推荐系统的作用和意义 1 2 推荐系统架构 1 2 1 推荐系统的逻辑架构 1 2 2 推荐系统的技术架构 2 前置知识 2 1 传统推荐模型的演化 2 2 协同过滤 2 2 1 概述 2 2 2 用户相似度
  • 【论文不精读】Reinforced Path Reasoning for Counterfactual Explainable Recommendation

    Reinforced Path Reasoning for Counterfactual Explainable Recommendation 1 Introduction 现代推荐系统在对复杂的用户或者商品上下文进行建模时变得十分复杂并且
  • 项目实战----基于协同过滤的电影推荐系统

    文章目录 一 数据整理 二 观察用户 电影矩阵 三 协同过滤推荐 3 1 基于电影的协同过滤 3 2 基于用户的协同过滤推荐 网页版 点击这里 一 数据整理 数据及介绍 MovieLens是推荐系统常用的数据集 MovieLens数据集中
  • 一文搞懂基于用户的协同过滤推荐算法

    本文针对无上下文信息的隐性反馈数据集 每一条行为记录仅仅包含用户ID和物品ID 介绍基于用户的协同过滤算法原理 基于用户的协同过滤推荐算法本质 找到和待推荐用户相似的用户群 推进该用户群感兴趣且待推荐用户没购买过的物品 例如下图中 用户a购
  • 推荐系统的挑战

    推荐系统的挑战 推荐系统简介 随着互联网2 0的发展 用户不再是数据的消费者 满足于关键词的搜索和在线浏览 而成为了数据的生产者 数据逐渐由专业机构的生产转向由用户的生产 数据量也日益剧增 信息过载油然而生 具体的表现是一是信息过滤即如何从
  • 基于深度学习的推荐算法——推荐系统模型搭建基础及DeepCrossing原理

    本章节从推荐系统模型搭建基础和DeepCrossing原理讲解及实操两方面展开 一 推荐系统模型搭建基础 1 Keras搭建模型 keras搭建模型主要有两种模式 一种是Sequential API 另外一种是Functional API
  • 因果推断(四)——后门调整、前门调整、逆概率加权

    在因果推断 三 中 我们介绍了干预的相关概念 在本文中 我们对一些方法进行介绍 这些方法可用于利用干预分析变量之间的因果关系 在因果推断 三 中 我们得出了调整公式 如上式 假设PA为A节点的所有父节点的集合 则上 式可以修改为 其中b为P
  • 什么是「推荐系统」,有哪些主要的推荐方法?

    1 什么是推荐系统 什么是推荐系统 根据维基百科的定义 它是一种信息过滤系统 主要功能是预测用户对物品 的评分和偏好 这一定义回答了推荐系统的功能是过滤信息 连接用户和推送信息 将这一定义扩 展一下 推荐系统就是自动联系用户和物品的一种工具
  • 特征选择 (feature_selection)

    当数据预处理完成后 我们需要选择有意义的特征输入机器学习的算法和模型进行训练 通常来说 从两个方面考虑来选择特征 特征是否发散 如果一个特征不发散 例如方差接近于0 也就是说样本在这个特征上基本上没有差异 这个特征对于样本的区分并没有什么用
  • 机器学习之电子商务网站用户行为分析及服务推荐案例

    项目概述 本项目案例根据某法律咨询服务网站的用户浏览记录 把用户划分为训练集的用户和测试集的用户 再根据找出相应用户的浏览记录划分为训练集数据和测试集数据 训练集用于后续构建用户物品矩阵 再根据用户物品矩阵构建物品相似度矩阵 根据杰卡德相似
  • 【推荐系统】 一、推荐系统简介

    1 推荐系统的作用和意义 在这个时代 无论信息消费者还是信息生产者都面临巨大的挑战 信息消费者 在大量信息中找到自己感兴趣的信息很困难 信息生产者 将自己生产的信息让广大消费者关注很困难 推荐系统将用户与信息联系起来 1 1 用户角度 推荐
  • 02链路预测

    什么是链路预测 链路预测是一个利用图网络做预测的经典任务 所谓链路 Link 指节点与节点之间的连接 也就是图论中的边 如上图所示 所谓链路预测就是预测原本不相连的两个节点之间是否有边存在 若是在有权图中 那就顺便还预测下相邻边的权重 如果
  • 深度学习系列:阿里DIN模型的原理和代码实现

    一 前言 今天介绍阿里巴巴的DIN网络 不得不说 阿里妈妈的大佬是真的多 经常都会更新非常多的创造性的东西 比如DIN中使用的自适应正则化技术以及Dice激活函数以及注意力机制的使用 并且值得注意的是DIN网络中使用的注意力机制还挺多的 哈
  • 推荐系统实战2——EasyRec 推荐框架环境配置

    推荐系统实战2 EasyRec 推荐框架环境配置 学习前言 先验条件 EasyRec仓库地址 EasyRec环境配置 一 EasyRec的下载 二 EasyRec的初始化 三 EasyRec的安装 四 一些额外的情况 学习前言 EasyRe
  • 【推荐算法】FM模型:Factorization Machines

    1 线性回归 在介绍FM之前 我们先简单回顾以下线性回归 回归分析是一种预测性的建模技术 它研究的是因变量 目标 和自变量 预测器 之间的关系 这种技术通常用于预测分析 时间序列模型以及发现变量之间的因果关系 通常使用曲线 直线来拟合数据点
  • 【推荐系统】{1} —— 基于用户的协同过滤算法

    协同过滤 英语 Collaborative Filtering 简称CF 简单来说是利用某兴趣相投 拥有共同经验之群体的喜好来推荐用户感兴趣的信息 个人透过合作的机制给予信息相当程度的回应 如评分 并记录下来以达到过滤的目的进而帮助别人筛选
  • [论文笔记]知识图谱+推荐系统

    仅作个人笔记 2021 3 22 2021 3 29 1 RippleNet Propagating User Preferences on the Knowledge Graph for Recommender Systems 看到一篇翻
  • 推荐系统的循序进阶读物(从入门到精通)

    为了方便大家从理论到实践 从入门到精通 循序渐进系统地理解和掌握推荐系统相关知识 特做了个读物清单 大家可以按此表阅读 也欢迎提出意见和指出未标明的经典文献以丰富各学科需求 为避免初学者疲于奔命 每个方向只推荐几篇经典文献 1 中文综述 了
  • 推荐系统:GBDT+LR简介

    1 GBDT LR简介 前面介绍的协同过滤和矩阵分解存在的劣势就是仅利用了用户与物品相互行为信息进行推荐 忽视了用户自身特征 物品自身特征以及上下文信息等 导致生成的结果往往会比较片面 而这次介绍的这个模型是2014年由Facebook提出
  • 【技术经验分享】计算机毕业设计Python+SparkML知识图谱新闻推荐系统 新闻数据分析 新闻爬虫 新闻大数据 新闻可视化 大数据毕业设计 大数据毕设 机器学习 深度学习

    开发技术 Python爬虫 springboot vue js SparkML SparkALS 机器学习 深度学习 协同过滤算法 说明 后端使用SpringBoot Mybatis Plus框架 前端使用Vue js Element Pl

随机推荐

  • 用vb语言编写一个抄底的源代码程序实例

    以下是一个基于通达信软件编写的简单抄底源代码程序 用于自动识别股票的底部形态并发出买入信号 vbs 复制 导入通达信软件自带的股票数据接口 Dim TdxApi Set TdxApi CreateObject TdxApi TdxLocal
  • Winform自定义控件 —— 指示灯

    在开始阅读本文之前 如果您有学习创建自定义控件库并在其他项目中引用的需求 请参考 在Visual Studio中创建自定义Winform控件库并在其他解决方案中引用https blog csdn net YMGogre article de
  • Rx Java 异步编程框架

    Rx Java 文章目录 Rx Java 名词定义 举个例子 基本概念 Backpressure Upstream Downstream Objects in motion Assembly time Subscription time R
  • Cocos2d-x使用Luajit将Lua脚本编译为bytecode,从而实现加密

    项目要求对lua脚本进行加密 查了一下相关的资料 得知lua本身可以使用luac将脚本编译为字节码 bytecode 从而实现加密 试了一下 确实可行 下面是使用原生的lua解释器编译字节码 1 新建一个名为1 lua的文件 里面只有一句话
  • 带宽与码元的关系_带宽、速率(波特率、比特率)和码元宽度简述

    首先弄清楚带宽和速率的关系 信道带宽与数据传输速率的关系可以奈奎斯特 Nyquist 准则与香农 Shanon 定律描述 奈奎斯特准则指出 如果间隔为 2 f 通过理想通信信道传输窄脉冲信号 则前后码元之间不产生相互窜扰 因此 对于二进制数
  • 【云原生之Docker实战】使用Docker部署web端vscode

    云原生之Docker实战 使用Docker部署web端vscode 一 vscode server介绍 二 检查本地docke环境 1 检查系统版本 2 检查docker版本 3 检查docker状态 三 下载vscode镜像 四 部署vs
  • 北京理工大学:《Python语言程序设计》详细笔记

    第一章 程序设计基本方法 计算机与程序设计 计算机是根据指令操作数据的设备 计算机发展参照摩尔定律 表现为指数形式 编译和解释 计算机执行源程序两种方式 编译和解释 编译 将源代码一次性转换成目标代码的过程 执行编译过程的程序叫编译器 co
  • C#是不是不能把基类对象强转成它派生类对象

    转载请标明是引用于 http blog csdn net chenyujing1234 有补充的 请大家指出 最近在论坛上看到有网友问到C 中对象强转的问题 自己虽然接触过C 但对这个特性还是第一次接触 所以这里找到一些资料与大家一起分享
  • unity 模仿原神的人物移动和镜头变换

    unity 模仿原神人物移动和镜头转换 自学了几周unity了 感觉还是要做点什么上手才快 所以先做个简单的RPG游戏吧 然后很快就做出了CS那种第一人称视觉的人物操控 不过感觉体验不太好 不能边走边看周围 所以重新模仿了原神那种可以环绕人
  • 3D建模教程分享

    全套3D建模教程让你从小白到大神 工欲善其事必先利其器 目前主流的3D建模软件当然是3DMAX MAYA还有ZBrush了 开始学习之路前这三个软件肯定是必备的 欢迎大家加入Q裙 939901947 领取各种学习资料和软件 迈出成为大神的第
  • linux系统创建新用户

    一般情况下linux系统创建 删除新用户主要有以下几种方式 1 创建新用户 useradd 用户名 删除用户 userdel 用户名 2 sudo useradd m 用户名 删除用户 sudo userdel r 用户名 可以直接删掉用户
  • 联想笔记本插入耳机仍外放--解决方式

    1 打开控制面板 2 点击硬件和声音 3 点击realtek音频管理器 4 点击设备高级设置 5 选中第二项 6 点击确定 关闭所有窗口即可解决该问题
  • 数学在机器学习中的重要性

    数学在机器学习中的重要性 by Dahua Lin Linear Algebra 线性代数 和 Statistics 统计学 是最重要和不可缺少的 这代表了Machine Learning中最主流的两大类方法的基础 一种是以研究函数和变换为
  • 使用BOTO进行S3各种操作

    使用BOTO进行S3各种操作 BOTO是一个开源的PYTHON发布包 是AWS AMAZON WEBSERVICE 的PYTHON封装 近期 我们公司用到国内某知名公司的S3云存储服务 需要调用该公司提供的S3 PYTHON SDK 鉴于该
  • Java连接MySQL数据库(多种连接方法)

    当我们掌握Java的基础知识后就可以学习一些Java的高级技术 或特性 了 例如 集合 多线程 网络编程 数据库技术 并发等等 其中数据库技术在Java的学习中也是相当重要的 今天就简单介绍一下Java与MySQL数据类的 1 提前准备 下
  • 亚马逊云科技实时 AI 编程助手 Amazon CodeWhisperer,开发快人一步!

    Amazon CodeWhisperer 是一款 AI 编码配套应用程序 可在 IDE 中生成整行代码和完整的函数代码建议 以帮助您更快地完成更多工作 在本系列文章中 我们将为您详细介绍 Amazon CodeWhisperer 的相关信息
  • 传输层——TCP报文头介绍

    16位源端口号 16位目的端口号 32位序列号 32位确认序列号 4位头部长度 保留6位 U R G A C K P S H R S T S Y N F I N 16位窗口大小 16位检验和 16位紧急指针 可选项 数据 源端口 长度为16
  • flex布局(骰子布局)

    1 应该都知道使用VS来敲写页面的第一步就是新建文件夹 也可以建文件夹 这是指只有html没有css与js才可以的 然后 可以在VS中打开文件夹 也可以直接把文件夹拖进去 这有两种方法 任意一种就行了 建议你直接拖进去 因为方便 2 这次的
  • Apache配置文件httpd.conf的理解

    httpd conf 是Apache使用的主要配置文件 1 文件位置 一般在 C wamp64 bin apache apache2 4 51 conf 2 是注释符号 1 解释每一指令的作用 2 指令模板 有时去掉 就能使用 3 Unix
  • Surprise库使用总结

    文章目录 Surprise库 1 加载数据模块 2 模型训练前的数据划分模块 2 1 交叉验证数据划分 2 2 训练集测试集划分 3 构建算法模块 3 1 记号说明 3 2 基于统计的算法 3 3 基于近邻 协同过滤 的方法 3 3 1 相