一、应用背景
假设现在有一个美食平台,经营着多种不同风味的美食,在系统中维护着一个原始打分表,其中行代表用户,列代表各种菜品在每个用户在对其消费过后进行的打分,分数为1-5分。假如顾客没有消费该商品,则默认是0分。
这次,我们尝试应用奇异值分解(SVD)以及协同过滤算法进行如何基于用户的打分矩阵太对餐品进行向量化的描述,并基于这些打分向量来衡量菜品之间的相似性。再通过顾客对菜品已经有的打分和菜品之间的先死刑来估计出顾客未消费过的菜品可能的打分情况,然后有针对性地进行菜品推荐,以求最大化消费地可能性。
在本次项目中,我个人从身边朋友收集了大约29位对不同菜品的打分评价,原始的打分表如图所示:
首先我们得把Excel中的数据转化为矩阵的形式:
import numpy as np import xlrd def excel_to_Matrix(path): #读excel数据转为矩阵函数 data = xlrd.open_workbook(path) table = data.sheets()[0] #获取excel中第一个sheet表 nrows = table.nrows #行数 ncols = table.ncols #列数 datamatrix = np.zeros((nrows, ncols)) for x in range(ncols): cols = table.col_values(x) cols1 = np.matrix(cols) #把list转换为矩阵进行矩阵操作 datamatrix[:, x] = cols1 #把数据进行存储 return datamatrix print(np.mat(excel_to_Matrix("评分表.xlsx")))
[[4. 2. 2. 5. 1. 4. 5. 1. 1. 3. 3. ] [1. 1. 0. 1. 1. 1. 1. 0. 1. 1. 1. ] [4. 0. 4. 4. 0. 3. 5. 4. 0. 3. 4. ] [3. 0. 2. 4. 0. 3. 5. 0. 2. 2. 3. ] [0. 0. 2. 0. 0. 5. 0. 0. 0. 5. 3. ] [4. 0. 1. 4. 1. 1. 2. 0. 1. 1. 1. ] [0. 0. 0. 4. 0. 0. 0. 0. 3. 0. 5. ] [0. 0. 5. 2. 2. 4. 4. 5. 2. 2. 0. ] [3. 0. 0. 3. 4. 5. 5. 3. 4. 3. 5. ] [3. 5. 5. 3. 5. 2. 4. 3. 1. 2. 5. ] [4. 3. 5. 5. 5. 5. 5. 5. 5. 5. 3. ] [0. 0. 5. 1. 0. 5. 5. 0. 3. 1. 4. ] [4. 0. 4. 4. 1. 4. 5. 4. 5. 2. 4. ] [4. 0. 3. 3.5 0. 4. 4. 0. 0. 2. 4. ] [3. 0. 5. 5. 0. 4. 5. 5. 5. 4. 5. ] [0. 4. 3. 2. 3. 5. 3. 0. 2. 3. 5. ] [5. 0. 4. 5. 0. 4. 4. 5. 3. 3.5 5. ] [4. 0. 4.5 5. 0. 3. 4. 2. 2. 3. 4. ] [3. 3. 5. 4. 4. 5. 5. 4. 5. 1. 5. ] [4. 3. 5. 3. 3. 5. 4. 4. 3. 4. 5. ] [2. 3. 4. 2. 0. 3.5 3.5 1. 1. 1.5 4. ] [2. 0. 3. 3. 3. 3. 5. 2. 2. 4. 5. ] [4. 4. 4. 5. 0. 2. 4. 3. 2. 1. 5. ] [1. 0. 1. 1. 0. 1. 2. 1. 3. 0. 3. ] [3. 0. 5. 3. 3. 5. 3. 3. 2. 3. 5. ] [5. 0. 5. 3. 3. 2. 5. 0. 5. 2. 1. ] [4. 0. 0. 4. 0. 3. 4. 0. 4. 3. 5. ] [2. 0. 5. 4. 5. 1. 5. 2. 3. 2. 0. ]] Process finished with exit code 0
二、整体思路
那么我们主要是推荐什么呢?在本次例子中,我们优先聚焦那些用户没有消费过的菜品(也就是那些用户打0分即没有消费过的菜品),通过模型估计,分析出某个具体用户可能会喜欢的菜品,然后推荐给ta。达到引导最大化消费。
为此,我们需要知道这个用户会有多喜欢某个特定没有消费过的菜品。所以我们可以采用协同过滤的思路,先通过其他用户的评价记录,来衡量出这个菜品和该用户评价过的其他菜品的相似程度,利用该用户对于其他菜品的已评分数和菜品之间的相似程度,估计出该用户会对这个未评分的菜品打出多少分。
这样就可以得到该用户所有未消费过的菜品的估计得分,拿出估计分数最高的菜品推荐给用户就可以了。总结出关键的技术点有以下三点:
(1) 衡量菜品之间的相似性。
(2)评分估计。
(3)稀疏评分矩阵的处理。
三、如何衡量菜品之间的相似性?
两个菜品,我们通过部队用户对其的打分,将其量化成一个分数向量,然后将其量化成分数向量,然后通过对两个菜品的分数向量进行分析比较,定量地进行两个菜品的相似度计算。计算相似度的方法有很多,比如说:欧拉距离、皮尔逊相关系数、余弦相似度等……
本次只是初次接触协同过滤,所以简单只用余弦相似度这何种方法来分析两个菜品的相似度。
对于两个指定向量:向量