概述
现在我们使用的一些APP都有智能推荐功能,例如抖音能够根据你的口味推荐符合你口味的短视频,网易云音乐每天会有大约三十首歌曲推荐给你,其中的私人FM功能则可以无限推荐符合你口味的歌曲,各种购物APP中,也会根据你浏览过的商品推荐你可能需要的商品。
那么以上这些精准推荐是如何做到的呢?它底层的算法原理是什么呢?
简单的推荐系统底层的基础原理是线性代数中的向量空间,以及nxdzt距离。
向量空间
向量(vector),也被称为nxdzt量、几何向量、矢量等,在二维空间中,可以表示为一个带箭头的线段,箭头表示向量的方向,线段长度表示向量的大小。
对于空间,我们当前所处的三维空间,数学上称作三维nxdzt空间,这个三维空间中有无数的位置点,这些点之间存在关系,并且可以定义长度,角度等,还能容纳运动。
我们这里所说的向量空间就是指这样的一个空间,向量存在于这个空间中。
nxdzt距离
nxdzt距离指的是在m维空间中两个点之间的距离,例如在二维空间中,点 A(x1,x2) 和点 B(y1,y2) 之间的距离是 ( x 1 ? x 2 ) 2 + ( y 1 ? y 2 ) 2 \sqrt{(x_1-x_2)^2 + (y_1-y_2)^2} (x1??x2?)2+(y1??y2?)2 ?
以此类推,在m维空间中点 A(x1,x1…z1) 和点 B(x2,y2…z2) 的距离是: ( x 1 ? x 2 ) 2 + ( y 1 ? y 2 ) 2 + . . . + ( z 1 ? z 2 ) 2 \sqrt{(x_1-x_2)^2 + (y_1-y_2)^2 + … + (z_1-z_2)^2} (x1??x2?)2+(y1??y2?)2+…+(z1??z2?)2 ?
推荐系统算法原理
这里我们来考虑一下如何给一个用户推荐符合他口味的歌曲呢?或者说如何找到一些歌曲可能是该用户喜欢的。
找到与该用户口味类似的其他用户找到该用户喜欢的音乐风格 1.找到相似用户
首先可以遍历所有用户听过的歌,找到和你听的歌重复度最高的那个用户,也就是你跟他听的歌中,重复的是最多的,那么可以认为你俩的口味相似,然后就可以把对方听过而你没听过的歌曲推荐给你了。
在这个思路中,我们只是简单的将一首歌标记为听过没听过,但是却不知道用户最喜欢哪首歌?也就是这个结果还不够精确,如果我们能知道某个用户对一首歌的喜爱程度就好了。
我们可以定义一个给歌曲打分的规则,如图:
根据规则可以计算出一个用户和对应歌曲的分数:
现在,有了这些数据,我们可以用向量来表示一个用户的口味:
假设 W1 W2 … Wn 是指 用户X 对这些歌曲的喜欢程度vector_X = (W1, W2 … Wn)
这样,每个用户的口味就可以抽象为多维向量空间中的一个点,然后我们可以通过计算点与点之间的nxdzt距离得到用户之间口味的相似度。即距离越近,越相似。
2.找到相似歌曲
根据查找相似用户的原理,同样可以应用在查找相似歌曲中,可以将歌曲打一些标签或者特征项,比如伤感或者开学,励志,民谣等,然后给每个歌曲每个特征项打一个分,那么我们就可以得到一首歌曲的一个特征项向量。
通过计算歌曲之间特征项向量的nxdzt距离,可以得到歌曲之间的相似度。
要实现这个方案,前提是得有足够多的资源并且有足够的特征项,倘若人工进行标注,就不够客观,如此一来,通过计算特征项向量的手段就不可行了。
我们可以换一个角度看,如果对于两首歌,听的人群是都差不多的,那就可以认为这两首歌是相似的。
如下图,从歌曲角度看,可以计算出每个歌曲的一个向量,通过计算不同歌曲间向量的nxdzt距离,就可以得到歌曲之间的相似度。
最后,从用户的曲库中找到最喜欢的歌曲,根据此方法寻找相似度高的歌曲,再推荐给用户。
总结
通过简单的向量的nxdzt距离可以实现最简单的推荐系统,但是实际开发中会有一系列的问题,比如,产品一开始数据量少不足以做推荐等。
21053462