00:00
然后接下来我们还有一步做什么呢?呃,要计算这个商品的特征向量,然后来算它的这个相似度列表,对吧?那这个过程当中还是是不是先要去拿到商品的特征向量,这里定义一个product product features。这个从哪里去拿呢?之前我们已经训练出了模型,是不是就应该能够得到它的特征矩阵,商品的特征矩阵,所以直接从model里边,它可以有一个,大家看到是不是有一个叫做product features的RDDR,这里边保存着的东西就是我们所有的这个特征向量啊,那大家可以看它里边具体的格式是什么样的呢?它是一个RDD,然后里边是一个对二元组啊,然后具体到里边的内容又是什么呢?首先是一个int,大家能想到这个int表示什么吗?对,Product ID,因为你这不就是它的这个特征向量嘛,所以当然是谁的特征向量,ID后边是一个数组,一个double类型的数组,这表示什么?对,这其实就是在各个维度特征维度上的那个特征值取值对不对?哎,整个这个数组是不是代表了它的特征向量啊,所以这里边其实就是拿到了它的特征向量,但是这里边我们后续要做它的这个特征向量处理的时候,大家会发现它本身是skyla里边的一个RA。
01:45
我们如果想要调取已有的那些,做那个向量相似度计算的时候,调取g plus里边的方法的话,那需要把它包装成转换成另外的一种数据格式,呃,就是转换成一个什么呢?转换成一个叫做double matrix的类型,那这里边我们再做一个map。
02:06
呃,这里边case每一个。Product ID和后边的是它的这个特征向量features,对吧,把它转换成什么呢?还是product ID。后边把它拗一个叫做double matrix的。这样的一个结构matrix,大家看这是不是就从g plus里面引入这样的一个数据结构啊,啊,它可以直接传入一个一个数组,把它转换成对应的矩阵,然后到时候我们就很方便的可以做向量计算了,传入的是features对吧?好,这是我们的预处理啊,然后接下来我们做什么操作?你们写到写到什么?
03:01
啊,直接把这个写到网购里面去吗?这是它的,这对这还仅仅是它的特征向量,我们是不是还要两两做比对,然后按照余弦相似度的那个计算公式,把它的相似度算出来才保存到网里面去啊,哎,所以这个过程里边还有一个专门的计算相似度的过程。那我们需要两两配对商品计算。对余弦相似度。那这个两两配对的过程可以怎么配对呢?啊对,很简单的一个想法,就是你这里有所有的product,那我自己跟自己做一个笛卡机,是不是就是两两配对在一起了啊,就是两两分别去可以考察他们之间向量的关系了,那我这里去定义一个叫做,呃,直接可以得到最后的这个推荐列表了,直接定义这个吧,我们用这个算子流式计算,呃,有点像流式计算那个操作对吧?呃,顺着下来就可以product features直接去做一个D卡机跟自己对吧。
04:19
那这里大家会想到你跟自己跟自己做D卡机的话,会有一个问题,就是说那我后边做计算,岂不是自己跟自己也要做一个相似度的计算,那个算出来肯定相似度很高,对吧,你排排序肯定排在最前面,所以我们把它过滤掉,呃,写一个filter把它过滤掉,那么这个我可以还是啊做一个模式匹配。我们取出来的是不是就是AB2个商品啊,那对应的这两个商品我们应该要求他怎么样呢?对,就是A的product ID不能等于B的product ID对不对?对于这里我们的这个product feature而言,是不是就是A的,它的第一个元素是不是就是product ID不能等于B的?
05:13
Product ID,所以大家知道filter里边我们要返回的是一个呃,是一个布尔类型的一个判判断的一个一个表达式,对吧,所以说我们直接把这个东西返回,如果说不等于的话,把它筛选出来,等于的话就直接过滤掉了,啊已经有了。一开始的这个条件过滤,接下来就可以去真正计算余弦相似度了。呃,那。这里面同样我们还是肯定要去做这个map操作了,拿到每一个A和B对应,我们应该做什么事情呢?
06:03
呃,大家会想到这里边是不是就是A的第二个元素,是不是就是我们所谓的那个特征向量,那是不是我们只要定义一个求解余弦相似度的函数,只要把这两个特征向量传进去,按道理应该就能拿到它的余弦相似度了,对吧?哎,所以这里边我们就直接这么定义吧,这里这个case啊。我们去定义一个余弦相似度,呃,叫SIM。呃,这就直接在外面,我们单独定义一个函数来实现吧,Cos。C,那么这里边我们要传入的是两个向量,这两个向量是不是就是对A的第二个元素,它的那个features和对B点二第二个元素?当然了,这个语言相似度的计算我们等一下再来实现,接下来这里返回的需要返回的是什么呢?
07:20
大家想一想,需要返回的,我我是直接把这个呃,Score返回吗?应对,其实我这里边应该应用到的是对应该返回一个三元组,就是一个商品对应着另外一个商品,然后对应着一个score,对不对?这里我们给他做一个另外的包装,我们可以借鉴一下,因为最后我们存储出来之后,是不是想要按照某一个商品的ID统计他所有的这个相似度的列表啊。那我是不是应该把后面两项包装起来,前面这个作为K,后面就可以group by by k了,跟前面的思路完全一样,对不对?所以这里边我可以去做一个包装。
08:08
返回的是不是A的,诶,Product ID。是A的一对不对,后边对是B的对product ID,再加上前面我们算出来的same score是这样的一个三元组,呃,当然了,其实这应该是一个二元组,对吧?呃,我们想象的话,它其实是这样的一个结构,那么做完了这一步操作之后,我们还可以进一步去做filter,比方说我还觉得这个不太舒服,就是这里面的这个相似度,可能什么样的相似度都筛出来了,我希望截取这个相似度大于一定值的啊,那也可以去做一个filter对不对啊,这里如果做filter的话,我直接可以判断每一个元素的对,是不是第二个二元组的第二个元素的第二个元素对,因为我们已经包装成这个形式了。
09:04
这就是same score啊,比方说我这里面要求它大于某个数大于0.4,大家可以任意去给,对吧?呃,这里报错,为什么报错?那是因为这个same score是不是还没有没有得到它的返回值啊?呃,所以这里会报错啊,等一下我们实现出来应该就没问题了,接下来我们的操作其实跟上边的这个思路就一样了,是不是同样可以group I。就按照前边的这一个product ID,是不是把它做了一个分组聚合啊,后边再去map一下,呃,是不是前边的这一个,这不是user ID,是product ID,后面这一部分是不是做一个,呃,对,做一个,按照大小做一个筛选,做一个排序,后边做一个当然可以做筛选,我们这里面没有给定数量的话,可以把这部分去掉,然后转换成我们想要的recommendation格式。最后转成DF是不是就可以了,所以这一部分我们直接可以借鉴过来啊。
10:05
好,直接把这部分copy过来,那这里就不是user ID了,这是product ID,所以这里需要给这个product ID放在第一个位置,后边的这一部分,呃,Rex同样可以做,这个就不会有take了。最后直接把它转换成recommendation是不是就可以了,哎,这就是这样的一个操作,大家看现在还一直在报错啊,这个就就非常非常不爽,我们这里先把这个实现吧,这里有一个叫做。Cos。SIM的这样的一个函数,它这里边传入的默认的是一个matrix,我们这里边其实传入的就是一个向量,对不对?呃,这里边大家只要知道这是一个product向量就可以PRODUCT1。PRODUCT2,它的特征向量传进来都是一个double matrix类型,最后是不是应该有一个返回值?
11:06
对,返回一个double类型,呃,那下面的实现怎么实现呢。那我们需要去回忆一下对这个计算公式了啊,余弦相似度这个计算公式是不是就是上边是。对两个向量的点积对吧?对应的位置的元素相乘,然后求和,下边是对模长的乘积,如果拆开来看的话,这个看起来有点复杂,我们这里直接,因为已经是double matrix类型了,大家看这个操作就非常方便,可以怎么样去操作呢?直接product一点。Dot大家看是不是可以直接点点成啊,呃,这跟我们在Python里面去直接调库是一样的啊,PRODUCT2这是不是就代表它的点击除以下边应该就是它的对模长的乘积,那模长怎么样去去算呢?同样product我们看一眼,对它有一个方法叫做NO1NOM2,大家能看懂这是什么意思吗?L1范数和L2范数,那我们前面说过模长其实就是L2范数,对,所以我们这里边直接调它的NO2就可以了,同样后边乘以PRODUCT2的。
12:36
那二这样就把它搞定了啊,所以大家看这个其实就非常简单啊,我们也可以自己去手写,手写就会很麻烦了啊,因为公式我们都知道,我们去呃便利它里边的每一个维度,然后去对应元素相乘,这个就会麻烦一点啊,接下来还有一个没做呢,就是我们这里面是不是还得把它保存到mango啊,呃,这里对应的这个写法其实跟前面是完全一致的。
13:01
直接copy下来吧,不是user RA,这里是叫product res,我们去写的时候对应的也是改这个表就可以,是不是这个表叫做product product re啊,只要写进去,我们整个的这一部分就做完了。好,那么我们可以把它来跑一下,看看运行结果怎么样。呃,大家注意一下,刚才这里我们忘记把它改回来,这里边本来是一个product re,所以用到的样例类应该是product re,把这个改掉,然后我们重新运行一下。呃,刚刚我们执行完成之后已经看到,呃,这边执行没有报错,看起来应该是正常的,所以在mango这边看一下是不是多出了,我们应该多出两个表,对吧,大家看一眼是不是多出来了呢。诶,多了一个叫做user Rex,这是我们所谓的用户推荐列表,另外还有一个product Rex,呃,这是商品的相似度列表,对吧?啊,这是我们说到想要给之后的实时推荐系统。
14:15
作为一个数据基础的一个东西啊,那我们可以来看一下user里边推荐出来的东西到底是什么样的状态呢?呃,Pretty。好,大家看,其实就是这样的一个状态啊,这里推荐出来其实最高评分还是很高的啊,大家可以看到,呃,七分哈,那因为这个确实是没准的,不一定我们之前的上限是五分,预测出来就一定是五分,因为做了矩阵分解嘛,他按照这个特征向量有可能推荐出来预测评分就很高,最高分达到了七分,然后还有五点几分,呃,后面我们先截取前20,最少的也有4.81,所以整个这些看起来都是预测评价是非常高的一些商品,大家可以看一下这个结果啊,当然还有。
15:06
我们也可以对应的看一下。哦,大家看这一部分我们好像没有做截取,所以好像就比较多,对吧,只是有了一个filter条件是大于0.4,所以这里看起来就有点多,大家如果觉得看起来比较复杂的话,也可以把这个筛选条件给的高一点哦,大家看这个最高的相似度呢,会有多少啊,0.9988,说明这个商品应该是非常非常接近,还看product ID,至少保证它不是同一个,如果是同一个自己跟自己比的话,是不是应该是相似度是多少,大家想一下,对,应该肯定是一,因为自己跟自己做点乘,是不是乘出来就是模长的平方,那你下边还要做那个呃模长,那那肯定就是算出来就是一了,所以大家可以看到啊,大部分其实是在呃,0.7几0.6几的这个水平,呃,就是整体来讲。
16:02
物品的相似度可以根据这个来算,这就是我们这一部分内容。
我来说两句