00:00
所以这里边我们直接可以去,现在啊,就是根据公式呃计算。所有的推荐优先级,或者说推荐评分啊,首先。以呃,以这个product ID作为K,然后做对吧。好,呃,所以大家会看到接下来我们的操作就是scores.goodbye那么BY哪个参数呢?是应该用到它里边每个元素的,对,第一个这个product ID,那么得到的结果我们去做一个处理map一下,这里大家要稍微注意一下啊,就是这里边group by之后的这个map,他拿到的是一个什么样的东西呢?对,这个大家要稍微注意一下啊,就是这里边我们拿到的东西是前边就是我,对就是我们下划线一,也就是product ID对不对,那后边其实是我们的,对,是我们整个的元素,这个大家要注意一下,所以这里边我们做一个模式匹配第一。
01:35
像是product ID,然后后边应该就是我们应该得到的是一个什么东西呢?对,是一个score list对不对,呃,是一个,因为已经做了这个group by嘛,呃,得到的是他的完整的一个列表,然后是所有元素的这样的一个列表,好那么。对应做什么操作呢?我们返回什么东西呢。
02:04
最后我们想返回的。大家看一眼,我们想返回的这个东西是不是还是一个int double类型的一个数组啊,所以我们就是要product一个product ID是不是对应到一个score就可以了,就把后面的这个数组,我们要最后按照公式算出一个数就完事,哎,那大家想到前面这个是不是还是product ID啊,对吧?呃,然后后面关键是这个,呃,这个list怎么去做计算呢?呃,那大家会想到我首先要拿到这个list,是不是拿到它的所有的对第二个参数,这才是所有的那个那个值啊,对吧?然后我们去做什么操作,要求平均,对要求平均值,那我们看一下这里面有没有均值之类的操作呢?诶好像没有average没有,那所以我们是不是先求和啊,对,所以这里边先上,然后大家会想到是不是在除以它的对除以它的个数啊,那么这里面的个数是不是其实就是score list的长度啊,所以这里边我可以直接score list点。
03:24
Less,呃,除一项,这是不是就是我们的第一项,呃,就已经得到了,那后边是不是就应该加上,加上我们的那个第二项,第二项是什么?要要算一个log对不对?呃,那是里边我们算出来的那个,呃,增强因子的那个计数器对应的值,如果它要是没有的话,我们是不是得用一啊,对吧?或者是零的话,我们得用一,然后最后再求一个log,那这里边我们就给一个log吧,自定义一个log函数好了,Inre map。里边get or default是不是这样啊,我们要去拿到当前product ID对应的,呃,那个计数器的值,如果没有的话,取什么?对,是不是取一就可以了,所以这是我们这个第二项,当然了,后面还有第三项,大家看到是不是跟这里应该是一样啊,只不过是一个减去。
04:26
里边是decre map对吧?诶这样就完成了我们整个的这个计算过程,好,当然这里边这个log我们这里边没有定义,所以说大家可以直接调用这个mass对吧,Mass里边应该会有这个log方法对不对,但是大家如果想到,那那我可能得去确定一下这个log到底是以什么为底呢?我不知道什么为底对吧?那大家看这个log应该是什么为底啊对,他这是以E为底,那我们如果要是想要去,呃,就是自定义这个东西怎么办呢?那我们就在外外层再去做一个实现了,对吧?啊就就不能在这里边直接调用ma.log了,好,那么做完这个map之后。
05:15
我们看一下这个括号啊,好,应该应该是已经得到了每一个product ID还对应着后面这一串,不要看着比较长,其实就是我们那个公式,呃,这就是按照公式算出来的一个数,对吧,那得到这个之后,我们可能最后是要返回。是不是要返回一个推荐列表啊,所以返回推荐列表的话,是不是还应该排序啊,按照得分排序,哎,所以是这样,那那所以我们这里边就直接做一个对呃,Thought with就好了,那大家会看到,诶这里面你直接salt,不能salt,因为前面的这个数据结构不一样,对吧?那我们是不是可以先把它对转换成ARRA,然后再做一个。
06:11
Salt with现在有这个方法了,那我们根据哪个来做salt呢?对,根据第二个元素做salt,还是按照这个降序排列啊,这样就得到的是我们想要的这样的一个数组啊,这就是这样一个过程。好,那这一部分都已经搞定了,那接下来是不是还还有一个这个东西没搞定啊,对吧,Get product,我们看一下这个东西怎么来写这个,其实呃,很简单啊,我们只是当时把它专门摘出来了,Get product same score,那首先第一个其实就应该是一个product id1,对吧,我就写product product1。嗯。我的鼠标怎么飘了?
07:02
好,PRODUCT1。然后后边是PRODUCT2,呃,然后最后边这个,当然这还是一个那个就是相似度矩阵了,这个就就又copy一下啊,这个确实麻烦了一点。呃,那整个的这些东西最后得到的应该是一个什么呢?返回什么呢?得到一个评分,呃,就是它的那个相似度评分,对不对,或者说就是相似度的那个score,所以他当然就是一个double了,好,呃,那么这个在做计算的时候。我们直接可以想到从same products里边可以去对去get一个product,按照product id1product1去get一个它对应的这个值对不对?呃,那么后边我们去做一个模式匹配啊match,顺便给大家复习一下模式匹配的写法对不对?呃,那么如果说。
08:07
大家看啊,如果有值的话,那是不是它应该属于sum这个这个类对吧,如果是some SIM的话,我就直接返回什么呢。PRODUCT1有值的话,拿到的这应该是他的那个列表,对不对,相似度列表,所以我对应应该是sum这个SIM,再去取对PRODUCT2。然后那大家会想到这里边你要这么写的话,那就又是一个模式匹配,再去match一下对不对,那如果里边还能拿到一个值的话,Score的话,我们就返回这个score是不是就完事了,呃,当然如果说你拿不到的话,是一个nu的话,那的话。对,就返回零,这里注意它是double类型,返回0.0对不对啊,那同样在外层,如果要是没有拿到是一个nu的话,是不是直接返回零啊,如果list没有的话,直接返回0.0就可以了啊,这是这一部分内容,呃,最后就是我们还有一个,大家看这部分做完之后,应该上面是不报错了,没有问题了,对吧?还有一个小问题就是这个log,如果我们想自定义的话,这里啊。
09:29
自定义log函数,我们可以在这里边对它做一个实现,那么这个log我应该传什么东西呢?是不是传进来一个int类型的数就可以了,最后返回一个double类型对吧?呃,当然了,这个在应用的过程当中,我们还得需要就是ma.log啊,因为我们自己没办法去去写这个log板对吧?具体的这个计算这个没办法写啊,那这里边我们定义一个以什么为底,我定义一个常量,比方说我以十为底,定义一个N等于十,那大家想到我怎么样把本身ma.log那个以E为底的函数转换成以十为底的函数呢?大家回忆一下是不是有一个换底公式啊,大家还记得吗?
10:23
好,所以这里边我们直接就返回ma.log换底公式是怎么写的,就是某一个以某一个数为底,然后我们就对除以log n是不是就可以了,就是这两个它都是以E为底的,这两个的底是相同,然后我们直接log m除以log n转换过来的这个数是不是就是log以N为底的M啊,因为大家记得那个呃,就是底和我们整个的那个M,这个数它是其实是分子分母的关系,对吧?啊,这就是换底公式,好,那么做到这一步,我们就基本上已经把上面的全部都实现了。
我来说两句