从价格数据集中删除异常值的算法

时间:2013-07-04 20:36:07

标签: php algorithm sorting statistics

这是一个很好的问题,我很乐意通过......

假设您运行“Widget Rental”网站,并且在您的应用程序上,您希望允许潜在购买者根据价格对小部件进行排序。 (从低到高或从高到低)。

每个小部件可以根据一年中的时间具有不同的价格。当你获得“高”季节和“低”季节时,一些小部件将根据季节有几十种不同的价格。

然而,“Widgets”的卖家特别顽皮,并且意识到如果他们将他们的小部件设置为一年中的一天非常昂贵,并且也非常便宜的一天这一年,它们很容易出现在低和高排序范围内。

目前,我采用了一种非常天真的解决方案来计算Widget的“最低价格”,即从数据集中获取lowest( N )值。

我想要的是获得一个小部件的“最低价格”,它可以准确地描绘出可以从中租用的价格......并删除较低/较高频段的异常值。

看一下这个图表......有价值......

Chart

  

X轴 - 时间(每个重要间隔为一天)

     

Y轴 - 价格

X轴是时间,Y轴是价格。现在,它包含正态分布,并且该数据集中没有任何真正的统计异常值。通常看到最低值和高值之间的价格波动高达200%。

但是,请看一下这个第二张图表......它包含一天的关税,这只是20ºuros......

enter image description here

我玩过使用Grubbs测试,看起来效果很好。

重要的是我想得到一个“从价格”。也就是说,我希望能够说,“你可以从XXXX租用这个小部件”。因此,它应该反映整体定价,忽略明确的异常值。

如果你指出我已经存在的任何方向,那么

PHP奖励积分。 (但我很高兴自己用PHP编写代码)。

1 个答案:

答案 0 :(得分:1)

一个问题是outlier实际上有多种定义。但是,为此目的,一个直接的解决方案似乎已经足够了。

您可以通过将值的范围限制为+ - 某个百分比或+ - 某些数量的标准差(可能是一个或两个,但可以very)从平均价格中删除异常值。可能你可能想要使用两者的组合,好像价格不是很多,那么折扣可以被视为异常值,这可能适合也可能不适合。无论如何,您可能不得不做一些实验来确定它的敏感程度。您可能想要设置它,因此异常值必须至少与平均值相差一定百分比,即使它只有5-20%。以下是基于平均500美元的基于百分比的限制。

  • 90%:50至950美元
  • 75%:125美元至875美元
  • 50%:250至750美元
  • 30%:350至650美元
  • 25%:$ 375至$ 650

如果使用多次通过,则可以更容易地对价格进行排序,然后移除与平均值相比最远的价格(可能考虑最高价格以及最低价格),只要它超出范围即可。这最终为O(N * D log D)以获得连续单次通过的结果直到它们没有效果,而不是单次通过O(N * D),其中N是要租用的项目数和D是考虑的天数。

在对如何定义epsilon值进行实验后,您也可能会发现Ramer–Douglas–Peucker algorithm对于找到兴趣点非常有用。