上述分解中会构建出一个矩阵∑,该矩阵只有对角元素,其他元素均为0(近似于0)。另一个惯例就是,∑的对角元素是从大到小排列的。这些对角元素称为奇异值。
奇异值与特征值(PCA 数据中重要特征)是有关系的。这里的奇异值就是矩阵 \(Data * Data^T\) 特征值的平方根。
普遍的事实:在某个奇异值的数目(r 个=>奇异值的平方和累加到总值的90%以上)之后,其他的奇异值都置为0(近似于0)。这意味着数据集中仅有 r 个重要特征,而其余特征则都是噪声或冗余特征。
SVD 算法特点优点:简化数据,去除噪声,优化算法的结果
缺点:数据的转换可能难以理解
使用的数据类型:数值型数据
推荐系统是利用电子商务网站向客户提供商品信息和建议,帮助用户决定应该购买什么产品,模拟销售人员帮助客户完成购买过程。
推荐系统场景Amazon 会根据顾客的购买历史向他们推荐物品
Netflix 会向其用户推荐电影
新闻网站会对用户推荐新闻频道
推荐系统要点基于协同过滤(collaborative filtering) 的推荐引擎
利用Python 实现 SVD(Numpy 有一个称为 linalg 的线性代数工具箱)
协同过滤:是通过将用户和其他用户的数据进行对比来实现推荐的。
当知道了两个用户或两个物品之间的相似度,我们就可以利用已有的数据来预测未知用户的喜好。
基于物品的相似度和基于用户的相似度:物品比较少则选择物品相似度,用户比较少则选择用户相似度。【矩阵还是小一点好计算】
基于物品的相似度:计算物品之间的距离。【耗时会随物品数量的增加而增加】
由于物品A和物品C 相似度(相关度)很高,所以给买A的人推荐C。
用户/物品|物品A|物品B|物品C
基于用户的相似度:计算用户之间的距离。【耗时会随用户数量的增加而增加】
由于用户A和用户C 相似度(相关度)很高,所以A和C是兴趣相投的人,对于C买的物品就会推荐给A。
相似度计算inA, inB 对应的是 列向量
欧氏距离:指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。二维或三维中的欧氏距离就是两点之间的实际距离。
相似度= 1/(1+欧式距离)
相似度= 1.0/(1.0 + la.norm(inA - inB))
物品对越相似,它们的相似度值就越大。
皮尔逊相关系数:度量的是两个向量之间的相似度。
相似度= 0.5 + 0.5 * corrcoef() 【皮尔逊相关系数的取值范围从 -1 到 +1,通过函数0.5 + 0.5 * corrcoef()这个函数计算,把值归一化到0到1之间】
相似度= 0.5 + 0.5 * corrcoef(inA, inB, rowvar = 0)[0][1]
相对欧氏距离的优势:它对用户评级的量级并不敏感。
余弦相似度:计算的是两个向量夹角的余弦值。
余弦值 = (A·B)/(||A||·||B||) 【余弦值的取值范围也在-1到+1之间】
相似度= 0.5 + 0.5 * 余弦值
相似度= 0.5 + 0.5 \* ( float(inA.T \* inB) / la.norm(inA) \* la.norm(inB))
如果夹角为90度,则相似度为0;如果两个向量的方向相同,则相似度为1.0。
代码实现
'''基于欧氏距离相似度计算,假定inA和inB 都是列向量 相似度=1/(1+距离),相似度介于0-1之间 norm:范式计算,默认是2范数,即:sqrt(a^2+b^2+...) ''' def ecludSim(inA, inB): return 1.0/(1.0 + la.norm(inA - inB)) '''皮尔逊相关系数 范围[-1, 1],归一化后[0, 1]即0.5 + 0.5 * 相对于欧式距离,对具体量级(五星三星都一样)不敏感皮尔逊相关系数 ''' def pearsSim(inA, inB): # 检查是否存在3个或更多的点不存在,该函数返回1.0,此时两个向量完全相关。 if len(inA) < 3: return 1.0 return 0.5 + 0.5 * corrcoef(inA, inB, rowvar=0)[0][1] '''计算余弦相似度 如果夹角为90度相似度为0;两个向量的方向相同,相似度为1.0 余弦取值-1到1之间,归一化到0与1之间即:相似度=0.5 + 0.5*cosθ 余弦相似度cosθ=(A*B/|A|*|B|) ''' def cosSim(inA, inB): num = float(inA.T*inB) # 矩阵相乘 denom = la.norm(inA)*la.norm(inB) # 默认是2范数 return 0.5 + 0.5*(num/denom) 推荐系统的评价采用交叉测试的方法。【拆分数据为训练集和测试集】
推荐引擎评价的指标: 最小均方根误差(Root mean squared error, RMSE),也称标准误差(Standard error),就是计算均方误差的平均值然后取其平方根。
如果RMSE=1, 表示相差1个星级;如果RMSE=2.5, 表示相差2.5个星级。
推荐系统原理推荐系统的工作过程:给定一个用户,系统会为此用户返回N个最好的推荐菜。
实现流程大致如下:
寻找用户没有评级的菜肴,即在用户-物品矩阵中的0值。