奇异值分解
优点:简化数据,去除噪声,提高算法的结果。
缺点:数据的转换可能难以理解。
适用数据:数值型
1、SVD的应用
(1)最早的SVD应用之一就是信息检索,利用SVD的方法为隐性语义索引(LSI)或隐性语义分析(LSA)
(2)推荐系统
2、矩阵分解
3、python实现
from numpy import *from numpy import linalg
U,Sigma,VT=linalg.svd(dataMat)
4、基于协同过滤的推荐引擎
(1)相似度计算
首先,在进行协同过滤之前,我们需要将数据转化为合理的形式,即将数据转化为矩阵的形式,这样,便于我们处理和计算相似度。当我们计算出了用户 或者物品之间的相似度,我们就可以利用已有的数据来预测未知的用户喜好。比如,我们试图对某个用户喜欢的电影进行预测,推荐引擎会发现有一部电影该用户没 有看过。然后,就会计算该电影和用户看过电影之间的相似度,如果相似度很高,推荐算法就会认为用户喜欢这部电影。
这里,协同过滤的相似度计算,并不是计算两个物品的属性信息的相似程度,而是基于用户对这些物品的评价信息来计算相似度。这也是协同过滤所使用的方法,即不关心物品的描述属性,而只关心用户对于物品的评价观点来进行相似度计算。
相似度的计算方法有很多,比如欧氏距离,相关系数,余弦距离等。相关系数和余弦距离,是对两个向量之间的比较。这两种方法相对于欧氏距离的一个优势在于,它们对于用户的评级的量级并不敏感。为了将相似度归一化,我们需要对着三种方法计算得到的结果,进行归一化处理,使其最终的结果位于(0,1) 内,即:
欧式距离相似度=1/(1+欧式距离)
相关系数相似度=0.5+0.5*corrcoef()
余弦距离相似度=0.5+0.5*(cosine距离)
from numpy import linalg
#欧式距离相似度计算
def eulidSim(inA,inB):
return 1.0/(1.0+linalg.norm(inA,inB))
#相关系数相似度计算
def corrSim(inA,inB):
if len(inA)<3:return 1.0
return 0.5+0.5*corrcoef(inA,inB,rowvar=0)[0][1]
#余弦距离相似度计算
def cosineSim(inA,inB):
num=float(inA.T*inB)
denom=linalg.norm(inA)*linalg.norm(inB)
return 0.5+0.5*corrcoef(num/denom)
通常用于推荐系统的评价的指标是最小均方根误差。即,首先计算平方误差的均值,然后再对平均值开根号。
https://www.cnblogs.com/zy230530/p/7208966.html