原文:https://www.itero.gg/articles/champ-recommend

从电商到游戏的推荐系统

作者之前写过一篇文章,介绍如何使用图网络为《英雄联盟》(LoL)提供英雄推荐。那种技术叫做"用户-用户协同过滤",即利用已知的用户信息找到相似用户,然后基于他们的偏好进行推荐。

为了便于理解,我们用经典的亚马逊例子来说明。假设你把PS4和最新的FIFA游戏加入购物车,算法会查看所有同时购买过PS4和FIFA的用户,找出他们购物车中还有哪些其他商品,比如最新的NFL游戏《Madden》,然后推荐给你。

今天,我们要看的是另一种推荐算法——“基于内容的模型”。这种技术不是基于用户相似性,而是基于物品本身的相似性。比如,如果你在购买EA出品的PS4体育游戏,系统会推荐其他EA出品的PS4体育游戏。当你没有用户偏好信息时(比如产品刚上线),这种方法特别有用。

然而,《英雄联盟》有近150个英雄,我们不想花大量时间手动标注所有需要的属性。因此,我们改用游戏内的统计数据来"描述"英雄,比如平均每局击杀数或对目标的伤害量。

为此,我分析了15万场钻石段位的对局。注意,我只统计了上单、中单和ADC玩家,因为辅助和打野的统计数据存在本质差异(比如补兵获得的金币较少)。

对所有英雄的数据进行平均后,首先注意到的是许多统计指标之间存在明显的相关性。这并不意外——比如"连杀次数"和"总击杀数"几乎完全相关(前者表示玩家完成连杀的次数,后者是那局游戏的总击杀数)。在统计学中,这被称为"多重共线性":多个数据点之间存在线性相关。

展示多重共线性问题的图表

处理这种多重共线性的常见方法有两种:排除法(选择击杀数,删除连杀次数)或聚合(击杀数 × 连杀次数)。但更好的解决方案是主成分分析(PCA),它能够自动提取这些属性之间的核心关系,无需手动干预或删除潜在的关键驱动因素。

PCA是一个相当复杂的主题,需要理解特征向量/特征值,网上有很多优秀的文章介绍,这里就不赘述了。简单来说,PCA的目标是在尽可能减少变量数量的同时,捕获数据中尽可能多的方差。这些压缩后的变量被称为主成分。

每个主成分解释的方差百分比

将PCA应用到数据集后,我们发现超过30%的方差可以用第一个成分解释,第二个成分解释了约16%,第三个约11%,以此类推。

但这些成分代表什么?为了理解它们的构成,请看下面的图表,展示了哪些变量构成了第一个成分。很明显,获得的金币是这个成分的最大贡献者,其次是目标伤害、最大连杀、连杀次数、造成的伤害和总击杀数。可以说,这个成分捕获了与获得金币相关的变量。如果再加上"物理"伤害这个特征,你可能会想到像菲奥娜或泰达米尔这样的英雄在这个成分上得分较高。

展示与第一个主成分最相关的原始变量图表

第二个成分主要由两个属性构成:推塔数和自我减伤(格挡/招架/免疫/减免等)。不过,你可能在想:这跟基于内容的推荐模型有什么关系?我们现在有了两个包含超过50%英雄间方差的主成分。这些可以看作是描述性代理——不是"体育游戏",而是"能击杀所有人的英雄";不是"EA出品",而是"高推塔伤害"!我们可以将这些描述性成分绘制在二维空间中,看看它们如何组合在一起(抱歉,从旧博客转移到iTero时格式不太理想!右键保存图片可以更仔细地查看):

前两个主成分的二维表示,可作为推荐引擎的基础

注:虽然图中用黄色标注了"辅助"英雄,但数据实际上只来自有补兵的路线。也就是说,你看到的基兰数据来自他打上单、中单或APC时的情况。

细心的读者会注意到,成分1是反向的,高伤害/高击杀在X轴上得分较低。成分2没有反向,所以Y轴上的高数值表示大量推塔和伤害减免。为了验证是否按预期工作,看看左上角的英雄(即造成大量物理伤害、推塔并减免伤害的英雄):菲奥娜和泰达米尔(泰达米尔的大招算作伤害减免)。再看看中下方的卡特琳娜和卡尔萨斯,他们在伤害和击杀方面得分较高,但不擅长推塔和减免伤害。听起来很合理。

下一步很简单:推荐基于欧几里得距离(直线距离)最短的英雄。你经常玩塔里克?试试茂凯。阿卡丽?试试菲兹。打不死的蒙多医生?你会喜欢我们的赛恩。

如果想进一步扩展,我们可以使用更高维度。回到展示每个成分捕获多少方差的图表,我认为有理由基于3个,甚至5个维度来构建模型。原理相同,但由于可视化变得困难,我们暂时就到这里。

希望这篇文章能为你提供另一种值得探索的推荐类型,以及PCA的优势。虽然我以《英雄联盟》为例,但这些方法可以轻松应用到任何其他领域。我建议你回到那个大图表,找到你的主玩英雄,看看你是否同意周围那些英雄的玩法风格相似。

读后感想

作为老玩家,感觉这个推荐系统不太实用,因为我已经对每个英雄的风格都有了大致了解,或许对于刚接触这个游戏的新手更有吸引力。但文章中将英雄归类为某些指标特征集合的思想对我有一些启发:比如将每个英雄的控制、位移、施法距离、坦度这些特征收集起来,当BP只剩下最后一个位置时,根据团队缺少的属性,反向推测找到对应的英雄。这个或许在BP中能帮大忙