人工智能算法(一)—协同过滤算法

这是本人第一篇介绍人工智能算法的博客。之前写的大部分博客都是为了解决具体问题或者解决问题中的思考。这次想笼统而又概括的去总结一些自己学习的算法。

废话少说,进入正题。

一、什么是协同过滤算法?

协同过滤算法,英文Collaborative Filtering。这个名词的意思有两层,首先过滤很好理解,过滤就是为了在一大堆信息中过滤出想要的信息。协同的意思就是利用社群的作用,不同个体之间相互协作来进行过滤。

因为最开始是用来过滤电子邮件的算法,根据用户自己选择的喜好来发送尽可能精确的信息(用户想看到的)。后来,goruplens对其有了革命性的应用。grouplens甚至不需要用户选择自己的喜好而是根据用户过往的记录来判断。当然,无法人工的去设定“喜欢”这个界限,什么样的行为才算是“喜欢”?于是,他们引入了“协同”。两个行为模式相似的人,兴趣爱好也一样。这就是最开始的假设,这个假设一直沿用到现在,无论是电影,电商平台,搜索引擎都是沿用这个假设。

总而言之,协同过滤可以大体分为两步:

1、“协同”:寻找个体在群体中相似个体。

2、“过滤”:根据某个体的相似个体的行为,猜测该个体的未来行为。

二、协同过滤的具体流程

1、具体怎么“协同”?

第一步,我们需要确定我们依照什么来确定个体之间的相似。

例如,电影推荐中我们根据电影评分、在电商推荐系统中我们也许通过评论,打星,是否分享推荐、在新闻推荐时也许通过用户在新闻浏览界面停留了多久等等。也就是说,我们要确立的是一个假设。假设两个个体的XX行为和属性相似,那么这两个个体相似。

确定了假设之后,就需要计算。我们需要将假设数字化才能计算。拿电影来举例子,如果对电影只有喜欢和不喜欢两种态度。那么可以设定喜欢就是1不喜欢就是0。假设还有个中等选项,也许就有0、1、2三种标准。我们需要的就是数字量化用户对电影的态度。笼统的说,量化个体的某个属性。

第二部,寻找相似度高的个体。

习惯上我们把两两相似度高的个体称为“邻居”。寻找邻居的方法很多,不过都有一个共同点,那就是把个体想像成一个高维空间的向量。我们把个体的各个属性设定成向量的各个维度。

继续拿电影举例,例如:用户X对10部电影评分  X[1,4,5,3,2,5,1,2,3,4]。用户Y同样   Y[4,3,2,1,5,2,3,5,4,1]。

这样就建立了两个用户的评分向量,这个便是10维向量。当我们有了每个用户的向量之后就可以计算他们之间的“相似度”了。

“相似度”计算方法很多,常用欧氏距离、余弦相似度、皮尔逊系数(实际上皮尔逊是余弦相似度的去中心化,这里不细讲)等等。往往这些相似度计算,可以想像成两个点(两个个体)计算距离(欧氏距离),或者是两个向量计算夹角(余弦相似度)。

这样我们计算每两个个体之间的相似度,n个用户计算次数为:1+2+3+........+(n-1)次。时间复杂度大概是n^2。不过如果我们考虑到维度的话,假设有m个维度,每次计算就需要m次那么实际时间复杂度为n^2*m。

2、“过滤”

过滤是个很简单的过程,继续用电影为例。假设判断我和某个用户相似,那么说明我们共同看过一些电影,同时也有一些我们看了但是不相同的电影。那么把他看过我没看过的推荐给我。

当然我们要设定一个数量,来确认相似度排名前多少个算相似用户。不同的取值推荐效果会有影响。

三、如果看待协同过滤算法

协同过滤最大的优势,就是几乎可以用于任何领域,这主要是取决于协同过滤本身就不是一个固定的解决方案。而是一种数学思维,正如之前写到的,只要确定好怎么样算得上是相似,那就能进行过滤。

反过来说,在使用协同过滤的时候我们可以通过不同的角度去实验,并且结合其他的算法。我们在计算相似度的时候,需要一个数值来代表个体对某个项目的“态度”,在电影推荐系统中我们直接用评分来代表态度。但实际上评分不只是态度的体现,态度也不只是用评分来决定。我们可以看出相似度计算其实是协同过滤的核心,怎么来确定这个核心数值也是一个很值得研究的问题。同时我们就能引出其他算法,例如模糊聚类、遗传算法等等。这些问题在之后我还继续研究。

猜你喜欢

转载自blog.csdn.net/ACM5100/article/details/84708335