这种需求经常出现,令人惊讶的是似乎没有标准的解决方案。假设我有一组数值属性——你可以想象用这些来对大学或城市进行排名,基于诸如学生/教师比例、污染等多个组成部分的得分——我想将它们转化为一个单一的得分。
我想通过一些例子进行插值来得到一个一致的评分函数。
也许有标准的多维曲线拟合或数据平滑库之类的东西可以使这变得简单明了?
更多例子:
- 将两个血压数值转化为一个单一的得分,用以衡量你的血压与最佳状态的接近程度
- 将身体测量数据转化为一个单一的指标,用以衡量你与理想体型的差距
- 将一组时间(如100米短跑等)转化为某项运动的健身得分
回答:
tl;dr: 查看HiScore。它将允许你快速编写和维护行为合理的评分函数。
为了举一个简单的例子,假设你有一个应用程序,接收一组距离和时间作为输入,你想将它们映射到1-100的得分。例如,你得到(1.2英里,8:37),你希望返回,例如,64。
典型的方法是选择几个基函数,然后调整这些基函数的系数以获得“看起来正确”的得分。例如,你可能有一个关于每英里分钟的线性基函数,再加上距离的其他基函数(可能是距离的线性和距离平方根的线性)。你甚至可以使用例如径向基函数来在你的输入范围内实现更复杂的表达。(这与其他答案中建议的机器学习算法如SVM等非常相似。)
这种方法通常相当快,但有很多缺点。首先,你必须正确选择基函数,这对于更抽象和更具表达力的函数来说可能很困难。其次,你会发现你的得分会很快僵化:如果你发现一个你认为得分错误的输入,找出如何在确保评分函数的其余部分“看起来正确”的同时进行更改将是一个挑战。第三,向得分中添加另一个属性(例如,跑步者是男性还是女性)可能很困难,因为你可能会发现需要向你的基函数添加更多项。最后,这种方法没有明确保证你的得分会智能地表现——根据你选择的基函数和系数,某人在7:03跑完一英里可能比某人在7:01跑完1.1英里得分更高。
另一种方法是以HiScore的形式存在,这是我面对类似问题时编写的Python库。使用HiScore,你可以对一组参考集的项目进行评分标记,然后它会生成一个智能地通过这些得分进行插值的评分函数。例如,你可以取你应用程序的最后100个输入,结合一些你最极端的输入(或许取在(距离,时间)空间中你提交的输入的凸包),对它们进行标记,并使用HiScore生成一个合理的评分函数。如果它生成的得分与你的看法不一致,只需将其添加到参考集中,并用正确的标签重新创建评分函数,因为HiScore保证通过参考集进行插值。
HiScore的一个特性是你的属性需要是单调的,或者总是增加或减少的。对于“跑步时间”设置,这不是问题,因为当距离增加时(在固定时间下)得分应该上升,而当时间增加时(在固定距离下)得分应该下降。HiScore的单调性让你对得分的表现充满信心;它保证某人在7:03跑完一英里不会比某人在7:01跑完1.1英里得分更高。
你提到的血压设置很有趣,因为它不是单调的。低血压不好,但高血压也不好。不过,你仍然可以在这里使用HiScore:只需将每个测量值分成“高血压”和“低血压”两个部分,其中至少有一个为零。例如,收缩压读数为160将被映射到收缩压+属性为60和收缩压-属性为0。得分应该在这两个新属性上都呈下降趋势,因此这种方法将一个非单调的二维问题(具有属性收缩压和舒张压)转化为一个单调的四维问题(具有属性收缩压+,收缩压-,舒张压+,舒张压-)。(这个技巧类似于帮助将线性规划问题转化为标准形式的技巧。)