http://blog.csdn.net/pipisorry/article/details/49205589
(个性化)推荐系统构建三大方法:基于内容的推荐content-based,协同过滤collaborative filtering,隐语义模型(LFM, latent factor model)推荐。这篇博客主要讲基于内容的推荐content-based。
{MMDs中基于user-item profile空间的cosin相似度的思路}
上图同时使用了explict和impliict信息建立Item profiles,推荐时很可能是推荐红色的六边形。
将item表示成一个features向量,如电影的features向量可以是
这里不同的features数值一般需要scale一下,不然数值偏大的features会dominate整个item模型的表示。其中一个比较公平的选择缩放因子的方法是:使其每个缩放因子与其对应分量的平均值成反比。另一种对向量分量进行放缩变换的方式是首先对向量进行归一化,也就是说计算每个分量的平均值然后对向量中的每一个分量减去对应的平均值。
Profile = set of “important” words in item (document)
使用TF-IDF进行文本特征抽取,所以文本的profile是一个real vector,并且要设置一个threshold来过滤。[Scikit-learn:Feature extraction文本特征提取:TF-IDF(Term frequency * Inverse Doc Frequency)词权重]
{Andrew NG机器学习course中基于user-item profile线性规划的思路}
我们将每个用户的评分预测看成一个分开独立的线性回归问题 separate linear regression problem,也就是说对每个用户j我们都要去学习它的参数向量θ^j(维度R=n+1,其中n为features的数目),这样我们就通过内积θj'Xi来预测user j对item i的评分。
content based recommendations:我们假设我们已经有不同items的features了,that capture what is the content of these movies, how romantic/action is this movie?这样的话我们就是在用items的内容features来作预测。
我们对每个item的feature向量都添加一个额外的截断interceptor feature x0=1,n=2为feature的数目(不包括x0)。
假设我们通过线性规划求出了Alice的参数θ(对于Alice评过的每部电影就是一个example,其中example0中x = [0.9 0], y = 5,用梯度下降求出theta),这样预测Alice对第3部电影的评分为4.95(如图)。
Note: 常数项1/mj删除了;且同线性规划一样不regularize θ0。
Suppose there is only one user and he has rated every movie in the training set. This implies that nu=1 and r(i,j)=1 for every i,j. In this case, the cost function J(θ) is equivalent to the one used for regularized linear regression.
[机器学习Machine Learning - Andrew NG courses]
皮皮blog
计算出规格化后的矩阵为:
[[-1.333 -1. 0. 0.333 2. ]
[-0.333 0. -1. 1.333 0. ]
[ 1.667 1. 1. -1.667 -2. ]]
Note: 距离越小越相似。
计算得到的距离矩阵分别为:
scale_alpha = 0 scale_alpha = 0.5 scale_alpha = 1 scale_alpha = 2
A B C A B C A B C A B C
[[ 0. 0.333 1. ] [[ 0. 0.278 0.711] [[ 0. 0.153 0.383] [[ 0. 0.054 0.135]
[ 0.333 0. 0.592] [ 0.278 0. 0.333] [ 0.153 0. 0.15 ] [ 0.054 0. 0.047]
[ 1. 0.592 0. ]] [ 0.711 0.333 0. ]] [ 0.383 0.15 0. ]] [ 0.135 0.047 0. ]]
Code:
import numpy as np from scipy import spatial from Utility.PrintOptions import printoptions def Nomalize(A): ''' user-item规格化:对每个元素先减行和,再减列和 ''' row_mean = np.mean(A, 1).reshape([len(A), 1]) # 进行广播运算 A -= row_mean col_mean = np.mean(A, 0) A -= col_mean with printoptions(precision=3): print(A) return A def CosineDist(A, scale_alpha): ''' 计算行向量间的cosin相似度 ''' A[:, -1] *= scale_alpha cos_dist = spatial.distance.squareform(spatial.distance.pdist(A, metric='cosine')) with printoptions(precision=3): print('scale_alpha = %s' % scale_alpha) print('\tA\t\tB\t\tC') print(cos_dist) print() if __name__ == '__main__': task = 2 if task == 1: A = np.array([[1, 2, 3, 4, 5], [2, 3, 2, 5, 3], [5, 5, 5, 3, 2]], dtype=float) Nomalize(A) else: for scale_alpha in [0, 0.5, 1, 2]: A = np.array([[1, 0, 1, 0, 1, 2], [1, 1, 0, 0, 1, 6], [0, 1, 0, 1, 0, 2]], dtype=float) CosineDist(A, scale_alpha=scale_alpha)
[海量数据挖掘Mining Massive Datasets(MMDs) week4-Jure Leskovec courses 推荐系统Recommendation System]
from:http://blog.csdn.net/pipisorry/article/details/49205589
ref: