我有一个PHP应用程序,允许用户指定国家/地区列表和产品列表。它告诉他们哪个零售商最接近。它使用类似于此的公式来做到这一点:
(
(匹配的国家数量/所选国家/地区数量)*(国家匹配的重要性)
+
(匹配的产品数量/所选产品数量)*(产品匹配的重要性)
)
*
(国家和解决方案匹配的重要性*(一致的匹配/可能的重合匹配数))
国家匹配的重要性为30%,[产品匹配的重要性]为10%,[国家和解决方案匹配的重要性]为2.5
所以简化它:(国家匹配+产品匹配)*乘数。
将其视为[他们是否在该国经营? +他们是否销售该产品?] * [他们是否在该国销售该产品?]
这为我们提供了每个零售商的匹配百分比,用于对搜索结果进行排名。
我的数据表看起来像这样:
id | country | retailer_id | product_id ======================================== 1 | FR | 1 | 1 2 | FR | 2 | 1 3 | FR | 3 | 1 4 | FR | 4 | 1 5 | FR | 5 | 1
直到现在它已经相当简单,因为它是一个二元决策。零售商要么在该国家经营,要么销售该产品,或者不销售。
但是,我现在被要求为系统增加一些复杂性。我已经获得了收入数据,显示了每个零售商在每个国家/地区销售的产品数量。数据表现在看起来像这样:
id | country | retailer_id | product_id | revenue =================================================== 1 | FR | 1 | 1 | 1000 2 | FR | 2 | 1 | 5000 3 | FR | 3 | 1 | 10000 4 | FR | 4 | 1 | 400000 5 | FR | 5 | 1 | 9000000
我的问题是,我不希望零售商3的销售量是零售商1的十倍,使其成为搜索结果的十倍。同样,零售商5的匹配度不应该比零售商1好九千倍。我已经研究过使用均值,模式和中位数。我尝试过使用偏离平均值的方法。我很难过如何让大跳跃变得不那么重要。我对统计领域缺乏无知感。
帮助!
答案 0 :(得分:0)
考虑使用log10()函数。与您所描述的一样,这减少了结果的直接缩放。如果您记录收入的log10(),那么收入大1000倍的人获得的分数只会大3倍。
答案 1 :(得分:0)
{阻尼'价值大幅增加的经典之作是logarithms。如果你看一下维基百科的文章,你会发现函数值最初增长得相当快,但那么就更少了。如另一个答案中所提到的,以10为基数的对数意味着每次将输入值乘以10,输出值都会增加 1 。类似地,每次将输入值乘以2时,带有基数2的对数将增加1。
如果你想削弱对数的效果,你可以考虑将它与线性函数结合起来,例如: f(x) = log2 x + 0.0001 x
...但是那个乘数需要非常仔细地调整,以便线性部分不会快速地掩盖对数部分。
提出这种加权本身就很棘手,特别是如果你不确切知道这个函数看起来是什么样子的话。但是,有一些程序可以进行曲线拟合,即你可以给它一对函数输入/输出和一个模板函数,程序会找到模板函数的好参数来逼近所需的曲线。因此,从理论上讲,你可以画出你的曲线,然后让程序找出一个好的公式。这也可能有点棘手,但我认为你可能会感兴趣。其中一个程序是开源工具QtiPlot。