fengdu78 / Coursera-ML-AndrewNg-Notes

吴恩达老师的机器学习课程个人笔记
31.55k stars 10.57k forks source link

练习8【推荐电影与示例不同】的原因 #54

Open MurongDragonfly opened 4 years ago

MurongDragonfly commented 4 years ago

首先,十分感谢你分享的python版参考答案!每次自己写完,再看看你的思路,总有新的收获。

我注意到比较大的问题是(练习8末尾你自己也提到了)——“推荐的电影实际上并不符合练习文本中的内容”。这其实是Y值的normalization导致的,而吴老师在课上也没有提到这个问题(实际上他自己也算错了)。

Normalize可以形象地理解为“大众审美”:一部电影的评分用户越少,则其feature就越未知(最终求得x趋近于0),则对于任意用户,无论其对各feature的喜好(theta)如何,ta对该电影的可能评分更趋近于平均分(x theta + Ymean ≈ 0 + Ymean ≈ Ymean)。但现实中,很多电影的评分人数极少,平均分则容易出现极端值;比如Star Kid (1997),三人评分为5,平均分高达5。于是在大多数情况下,协同过滤会预测Star Kid评分为5,于是它被列为最推荐的电影(在本题的条件下,求得x theta = 0.00000028532343,所以最终结果甚至大于5)。

为了避免这种“少数代表多数”的错误,我们可以设定:当某部电影的评分总人数(R[i, :])小于某值L时,不对它进行normalize处理,即Ymean=0。预测评分x * theta + Ymean ≈ 0 + 0 ≈ 0。现实意义可理解为——由于观看人数不足,完全不推荐。

另外值得一提的是,随着电影评分人数增加,其feature越可知,即便人数低于L、使Ymean=0,但由于算法求得的x不再全部趋于0,对于有足够评分的用户(theta也不全趋于0),有可能预测评分x * theta + Ymean > 0。这意味着,我们并不是把所有评分人数不够的电影都预测为0分,而只是相对于那些评分人数足够多的电影,我们不推荐它们。

还有一种思路是,设[(每个用户的平均评分)的平均值]为评分不足人数的电影的平均评分(当用户评分电影过少时,其Ymean可记为0),来代替将Ymean“简单粗暴”地设为0。但这种方法并不影响评分人数足够多的电影的预测评分,因此不赘述。

最后提一个很有意思的点。在吴老师的作业模板里,尽管他通过“[Ynorm, Ymean] = normalizeRatings(Y, R);”计算了Ynorm,但在训练时使用 fmincg计算theta时使用的却是Y!这样算下来的x * theta本身就可能是一个较为合理预测值了,再加上Ymean,导致出现预测评分高达8、9的情况(不难分析,预测评分大概率是1-5分间的值)。

附上我的结果(n=10,maxiter=100): Predicted rating 4.6 for Star Wars (1977) Predicted rating 4.6 for Shawshank Redemption, The (1994) Predicted rating 4.5 for Schindler's List (1993) Predicted rating 4.5 for Raiders of the Lost Ark (1981) Predicted rating 4.5 for Usual Suspects, The (1995) Predicted rating 4.5 for Titanic (1997) Predicted rating 4.4 for Close Shave, A (1995) Predicted rating 4.4 for Wrong Trousers, The (1993) Predicted rating 4.4 for Empire Strikes Back, The (1980) Predicted rating 4.4 for Braveheart (1995)