商品推荐是针对用户面对海量的商品信息而不知从何下手的一种解决方案,它可以根据用户的喜好,年龄,点击量,购买量以及各种购买行为来为用户推荐合适的商品。在本项目中采用的是基于用户的协同过滤的推荐算法来实现商品的推荐并在前台页面进行展示,我将会使用余弦相似度的度量方法来计算用户与用户之间相似性,最终将相似度较高的用户浏览的商品推荐给用户。更多关于机器学习推荐算法的内容详见这里
以下为通过余弦相似度公式计算得出的用户与用户之间的相似度: 具体的代码实现见RecommendUtils.java
1 2 0.999489144283392
1 3 0.951009468591049
1 4 0.6101699194694563
2 3 0.9514955455298099
2 4 0.6104817875805268
3 4 0.6408097907695536
在三角形中,cos30°=二分之根三,cos60°=1/2。很明显,cos30°相比于cos60°更接近于 1,可以看出角度越接近于 0°,对应的余弦值越接近于 1,构成这个角度的两条边也就越接近于重合,也就可以认为这两条边越相似。
在二维的平面向量中,两个向量之间夹角的余弦值公式为:
假设两个向量a,b的坐标分别为(x1,y1)、(x2,y2),所以最终可以化简为:
注:其中的x和y是两个不同的维度,在向量直角坐标系中可以认为是距x和y轴的距离,但是在实际的应用中,可以是把它理解为一个物体的任何一个可以衡量它与其他物体不同之处的属性...咳咳,还是说人话吧,在商品推荐中可以把向量 a 和向量 b 理解为两个不同的用户,把 (x1,y1) 理解为 a 用户对 x 商品的点击次数和对 y 商品的点击次数,再把对应的值带入上述公式即可求出两个用户之间的相似性,越接近于 1 ,说明两个用户的浏览行为越相似,就可以把一个用户浏览过的商品推荐给另一个没有浏览过该商品的用户,从而完成商品推荐。
设向量 A = (A1,A2,A3,...,An), B = (B1,B2,B3,...,Bn),推广到多维,公式为:
其中的 A1,A2,A3...就可以理解为该用户对不同的商品的点击量。
通过上一阶段对用户相似度之间的求解,可以获得与某个用户最相似的前N个用户,(假设需要被推荐商品的用户为X)然后在这N个用户的浏览记录中查找X没有浏览的类目,但是这N个用户浏览的二级类目的类目的id,作为推荐给用户的二级类目id
具体的代码实现见RecommendUtils.java
在上一个阶段确定了要推荐给用户的二级类目之后,找出每个类目下点击量最高的商品推荐给用户。
直观感受一下: