1.SVD奇异值分解的基本原理介绍
参见前面博客:SVD奇异值分解的基本原理介绍
2.降维后的数据矩阵的数据相关性
有了SVD降维后的用户对商品评分的矩阵后,现在有一个新的用户,怎么利用降维后的评分矩阵为此新用户给出个性化推荐商品呢?这时候就需要利用数据矩阵的数据相关性了。
单刀直入,直接给出数据相关性的求解思路。
Step1:求出原评分矩阵的降维矩阵
[[ 5.28849359 5.16272812 0.21491237 4.45908018]
[ 3.27680994 1.90208543 3.74001972 3.80580978]
[ 3.53241827 3.54790444 -0.13316888 2.89840405]
[ 1.14752376 -0.64171368 4.94723586 2.3845504 ]
[ 5.07268706 3.66399535 3.78868965 5.31300375]
[ 5.10856595 3.40187905 4.6166049 5.58222363]]
Step2:新用户的评分数据
newUser = np.array([5,5,0,0,0,5])
Step3:确定计算相似度的距离函数
关于机器学习中距离表示的方法有多中,详见以前博客:【机器学习】5种距离度量方法详解+Python实现([]+lambda+np.frompyfunc+向量法等多种方法实现)
为了方便讲解,我这里用了简单的欧氏距离,其实效果更好的可能是夹角余弦,都可以,在实际项目中要按照不同性质的评分矩阵,选取最合适的距离方法,上面博客提供了5中方法供挑选。
def _EM(self, userA, userB):
'''计算A和B用户的相似度,使用欧氏距离
:param userA,用户A给所有商品的评分序列
:param userB,用户B给所有商品的评分序列
:return userA和userB的相似度
Note: userA和userB的评分行为的相似度,距离越小,相似度越高
'''
C = userA - userB
em = np.sqrt(sum(np.multiply(C,C)))
return em
Step4:求出新用户和所有旧用户的相似度,找出最高相似度的旧用户
最后求得新用户评分数据和上面4个旧用户评分数据的欧氏距离为:
[5.8309518948453007, 7.6157731058639087, 8.3666002653407556, 6.6332495807107996]
可知欧氏距离越小,新用户和此旧用户的相似度越高,可知新用户和第一个旧用户的评分行为相似度最高,即:
新的用户评分数据: [5 5 0 0 0 5] 和第一个旧用户的评分数据[5,5,3,0,5,5]的评分行为相似度最高,即他们俩的相关性最高~
这里求得和新用户评分行为相关性最高的用户,就是第一个老客户,其评分数据为:[5,5,3,0,5,5]
到这里你应该了解了数据的相关性以及求解方法了。
3.SVD推荐系统的基本过程
Step1:准备用户对商品评分的评分矩阵
Step2:确定并实现定义相似度的函数,我这里了用例欧氏距离,也可以使用夹角余弦等距离算法
Step3:根据给定的奇异值平方和占比阈值percentage,计算降维的k值,然后通过SVD分解公式得到降维后的评分矩阵
Step4:在降维矩阵中,使用相似度函数找到最高相似度的旧用户数据,找到旧用户评分而新用户未评分的商品
Step5:返回step4中商品的评分表和商品表,作为推荐商品给新用户