00:00
好,那么已经把这一部分做完的话,大家会想到,诶,接下来UI遍历完成,那么我们的所有的更新,所有的向量特征向量是不是就更新完了。更新完成,那现在是不是就可以得到P和Q了,对吧?可以得到PQ最后的这个矩阵,那我们根据这个矩阵是不是可以得到现在的预测评分矩阵啊,可以计算预测评分矩阵,那预测评分矩阵怎么算?是不是就是把PQ直接乘起来就可以了,我们预测评分比方说叫predict r。它应该等于什么?是不是还是PQ乘起来,这个乘法是矩阵乘法对不对,是不是NP.dot啊,里边的值是不是就是一个P一个Q啊啊,所以大家看其实就这么简单,那接下来拿到这个之后,我们记得还有一个就是迭代结束条件,我们可以算当前的损失函数对不对,如果损失函数小于一个临界值的话,直接就可以结束了,对吧?另外我们也可以看看它的损失函数到底有多少,计算当前损失函数,那损失函数我们没有专门的定义出来,在这里给大家做一个实现,首先是不是cost等于零,大家想到这个损失函数是不是所有的预测的误差都要求和啊,所以我们先定义一个cost等于零,然后是不是对每一个用户,每一个物品,对应的那个误评分要做一个误差求求和啊,所以for每一个U。
01:57
M,对不对?然后每每一个爱音,嗯,啊,大家会想到我们在求损失函数的时候,是所有的都求吗?这个为零的这地方,这个误差肯定很大呀,这个是不是就不算误差了呀,对吧?所以我们的求法是不是跟之前还是很类似啊,哎,所以大家看我们的误差是不是还是根据这个就可以求出来,哎,所以这个是一样的一个做法啊,那大家会想到我们这里边是不是就不仅仅是求一个误差就完事啊,它如果大于零的话,我们其实是不是想要对想要把它直接加到cost里边去啊,而且这个cost大家会发现啊,我们前面的这两部分它。
02:56
把这一部分我们求差求出来之后还应该怎么样呢?我们看公式啊,我们的物损失函数是什么?
03:10
损失函数是什么?对,是不是前面还要有一个平方啊,所以啊,当然这里边这个谁在前谁在后没关系,对不对,我们是把后面这个放在前面了,它先减完之后,是不是还要有一个平方项啊,我们先求前面这一部分求和,求和完了之后大家会想到还应该有什么东西呢?后边是不是还要按照我们的要求,是不是还要有正则画像啊,这个正则画像是不是就是每一个PU和QY对它里边的每一个值要求平方和啊,这里边的每一个,那又是什么呢?说加上正则画像,是不是对于K就要做一个便利啊,大家会想到里边的PU和Qi去做这个,它的这个模长平方求值的时候,是不是要把里边每一个维度那个值都要求平方,然后求和,那每一个维度展开,它有几个维度,是不是K个维度啊?哎,所以我们在对K做一个展开。
04:23
是不是就得到了啊,那大家会想到它里边的这一个是不是还得costs加等于加在里边去啊?那我们加什么呢?是不是拉达要乘,大家会看到乘以这个PU,这个求和,然后QY求和对不对?那这两个都乘以拉姆达,我们把它都乘在里边好了对不对?那前边是不是就是PUUK是不是平方求和啊?所以我们把它还要有一个二次项对不对?另外是不是还要加上QKI是不是也是一个平方啊?这两个加起来乘以拉姆达,然后大家想到再对每一个K都做一个求和对不对?Cost是不是每一个K都要求一遍啊?
05:18
得到的结果是不是就是把它的每一项按照这个平方和全求起来了,这是不是就是我们的正则画像,好,这就是最后加上正则画像的一个结果,那当然大家会想到如果cost小于某一个临界值的话,比方说我们直接给一个啊,假如假如这个等于0.001的话,是不是就可以直接退出了,那大家想到退出退出什么呢?是不是退出我们这个迭代了呀?啊,所以这里边是退出迭代,所以break,那如果说一直没有小于的话,我们这个迭代达到这个上限是不是也就结束了啊,所以这里边最后就可以return对不对?大家看这个应该是对齐的对吧?跟上面的这个for对齐就可以了啊,当然了,大家想到这个Q最后是一个呃,就是横着的矩阵,跟QP的这个结构不一样对不对?那我们如果想把它做一个转置,还是转置成一样的,最后我们定义的这个结果M乘K和N乘K这个也可以,对吧?我们把它转置之后再返回,当然了,我们也可以把这个cost同样返回,对不对啊,这就是我们的这一部分内容,这就是我们最后的这个损失函数怎么了?
06:42
当前损损失函数,第二个for合的当前损失函数哦,大家看这里写错了是吧?爱音不是两个印啊,好啊,大家看的很仔细,所以做完这一步之后,我们的核心算法,诶,大家看这里面有问题啊。
07:03
Follow哦,大家看这个没有默认值对吧,所以这个。如果说我们要给定的话,那这里可能就都得给定啊,1000,然后拉姆达我们就给0.002,好好,我们把这个做完之后,就可以去做一个测试了,对吧?最后的测试大家其实之前也已经给大家看过,结果很简单,对不对?我们这个测试是不是就直接可以跑一下这个算法对吧,得到一个PQ cost,那么呃,我们调用的这个算法叫做。Copy一下啊。就是这样一个LFM对不对,呃,它的梯度下降,它里边我们要传什么呢?是不是RK,呃,还有什么。
08:11
啊,后面如果这些东西啊,这些东西不太一样啊,所以我们还是把它传一下吧。这里的内容我们就用前面定义好的超参数传进来对吧?好,那么大家会看到我们的调用其实非常简单,就是这么一行,所以大家会想到我们之后调库的时候是不是也类似啊,我们要传什么呢?是不是就是平分矩阵R要传进去,后边是不是就是一堆超参数啊?哎,我们就是把这几个超参数传进去,然后一行调用应该就能得到我们最后的结果了。好,那么这个得到结果大家会想到到底长什么样子呢?我们是不是应该还去有一个predict r,它应该等于什么呢?是不是应该等于P点啊,大家看啊,就是写成这样的形式可能会觉得更舒服一点啊,如果前面那个NP.dot2个参数大家觉不舒服的话,是不是写成这样大家觉得更舒服啊?p.dot就是一个一个矩阵点成另外一个矩阵对不对?
09:18
大家会想到这个已经转制过之后,要在成的时候,是不是还得转制一遍啊啊,所以我们这样看一眼啊。Print printq,然后print r对吧?呃,Cost,最后我们在这里去把这个predict r做一个输出,嗯,大家看这个稍微有一点慢,对吧,因为我们是不是迭代次数给的很很大啊,我们这里给了5000次对不对?好,我们看一眼结果吧,大家看我们已经得到了一个,诶,这是一个P对不对,下面这是一个Q,大家看P是几乘几的一个矩阵,M乘K是不是六乘二啊。
10:10
哎,所以我们就是有六个用户,每一个特征维度是不是都是两个这样的一个特征向量啊,对吧?每一个用户他的特征都是两个维度,那同样得到这个物品的特征是不是也是两个维度,它是一个N乘K,那有几个物品呢?是不是五个啊,因为我们最早的这个R本身的这一个矩阵是不是应该是一个六乘print r是一个六乘五的矩阵,对不对?所以我们得到的结果就是这样的,那大家看我们最后的预测误差是1.728的,诶大家看这个误差是不是很小啊,因为我们这么多个平分,最后所有的平分求了平方和,然后还加了正则画像,最后才只有1.72的误差,所以应该是比较小了,对不对?哎,我们看一眼啊。
11:07
诶,大家会看到这里边的这个。第一个预测是不是四对应的是4.027啊,哎,第三个这个一二对应的是1.887,这个看起来误差稍微还有点大,对不对啊,然后后边这个一预测的是0.934,所以对应这些如果都比较接近的话,那我们是不是有理由相信第一个用户对第二个物品他的预测评分就是2.65对不对,这就是一个预测评分对吧,说明他比较一般,不太喜欢对不对?但是对于第四个物品,这个4.62这个评分是不是就比较高啊,说明他是不是有可能很喜欢第四个物品,所以我们如果要推荐,是不是应该把这个给他推出来啊,其实大家可以想象得到,为什么他会给他推这个第四个物品呢?
12:01
大家看一看,是不是他跟哪个用户可能会接近啊,他是不是有可能对我们这里边的第四个用户有可能接近啊,然后这个物用户啊,当然这个只是一个三分对不对?嗯,大大家也可以看到稍微有一点接近,也不是也不是完全接近对吧?哎,所以大家会看到就这个它有三分,那我们这里边推荐出来是一个四分对不对,然后大家会看到他跟哪个用户不太接近呢?比如说是不是跟第二个用户有可能不太接近啊,啊但但这个就是大家会看到这个如果数据不是特别明显的话,我们确实是不太能得到明确的这种判断出来,谁跟谁接近对吧?所以我们得到就是一个比较玄学的一个一个状态,就是,反正就是它乘回去之后,诶,确实就是好使。
13:01
那我们可以看到得到的这个特征向量,第一个用户和第四个物品对吧,大家可以看到第一个用户他的两个特征向内特征值是不是都是正的,而且都有一点几对不对,然后第四个物品是不是它也都是正的,而且一个一点几,一个是二点几啊,所以得到的这个评分是不是都比较高。所以大家会看到是不是第四个物品,它的平均得分是不是都比较高啊,为什么?是不是因为它第二个本身这个特征比较这个特征比较明显,对不对,只要我们的用户第二个这个是正的,它的得分就都会比较高,对吧。那大家就会想到你这个评价就有可能不准,对不对,那怎么样有可能会准一些呢?我们是不是就会想到,哎,你这个特征维度是不是太少了呀?那假如说对我们这里是不是可以把这个K做一个调整啊,大家会想到我如果要是K大一点的话,这个效果又会怎么样呢?我们把K给一个五试一试对吧?啊,大家看这个计算就相对来讲更慢了一些,对不对?大家看到这回算出来的cost是多少?对0.54是不是就更小了呀,大家直观的去看一下,我们现在得出来啊,当然这个推荐出来这个维度就更大了,对不对,计算更复杂,我们看一下推荐出来结果怎么样,第一个四,3.979,哎,这个还是差不多的,对吧,3.98,这个差不多,之前我们是不是后两个那个二和一评价的误差很大,现在大家看到二,诶2.038是不是小了一些啊,然后10.9。
14:48
五七是不是也比之前小了一些,之前好像是0.8几对不对,呃,0.93是吗?哦,那那就是之前前面这个是1.8几对吧?啊,所以这个误差大家看到是明显减小了的,而且我们在这里其实这个cost已经很明显了,对吧,明显的有一个减小,而且大家会想到我们之前这个后面不是是不是加了那个正则画像啊,正则画像是不是我们的这个特征矩阵,你后面维度越大,是不是应该越那个像数就越乘起来就越大啊,哎,我们这里即使是像数增多,而且这个最后得到cos还减小了,那是不是代表这个预测确实就是更接近了呀?哎,这就是我们最后得到的一个结果。
15:33
好,大家可以把这个程序再好好的看一看,实现一下。
我来说两句