算法找出数据集中最真实的市场价格平均值

时间:2012-04-29 23:43:23

标签: php algorithm sorting

我拥有的:

  • 用户在拍卖网站上销售foobars。
  • 每个foobar都是相同的。
  • foobar的价格由用户决定。
  • 我将废弃每个价格清单,形成一个如下数据集:
    $ prices =('foobar'=> [12.34,15.22,14.18,20.55,9.50]);

我需要什么:

  • 找出每天,每周,每月的实际平均市场价格。

我面临的问题:

  • 异常值拒绝实施并未证明效果非常好,因为数据存在偏差。
  • 用户极不可能以低于平均市场价格的方式进行拍卖,因为它无法撤消。即使它低于市场价格,这种情况也很少发生,总体平均值不会受到影响。但是,那些试图提高价格的用户更有可能发生频繁发生,影响实际的平均市场价值。

我想我会怎么做:

Daniel Collicott:
  

如果我理解正确,你想要计算最佳值   销售商品的价值。 (或者你想要计算真实的   值Δα)

     

卖家非常自然地玩游戏(例如ebay),试图最大化   他们的利润。

     

出于这个原因,我会避免平均/ SD方法:它们也是如此   对特定销售策略造成的异常值敏感。

     

游戏理论方面,我认为聪明的卖家会估计最高   可能通过研究他们的销售价格(最大利润)   竞争对手及其历史销售额:找到最佳点。

     

出于这个原因,我会记录历史价格的直方图   所有卖家,看看价格的分布,使用的东西   接近模式以确定最佳价格,即最大价格   常见的促销价。更好的是,我会按利润衡量价格   (与历史销售量成比例)每个卖家。

     

我怀疑这会更接近您的最佳市场价值;如果你   正在寻找真正的市场价值,然后在下面评论或与我联系   在我的机器学习公司

我的问题:

  • @Daniel Collicott帖子中提到的事情的更详细解释:

    - >最佳销售价值 - >实际销售价值 - >两种算法

5 个答案:

答案 0 :(得分:7)

使用平均值标准偏差,您的第一个问题非常简单:

$prices = array
(
    'bar' => array(12.34, 102.55),
    'foo' => array(12.34, 15.66, 102.55, 134.66),
    'foobar' => array(12.34, 15.22, 14.18, 20.55, 99.50, 15.88, 16.99, 102.55),
);

foreach ($prices as $item => $bids)
{
    $average = call_user_func_array('Average', $bids);
    $standardDeviation = call_user_func_array('standardDeviation', $bids);

    foreach ($bids as $key => $bid)
    {
        if (($bid < ($average - $standardDeviation)) || ($bid > ($average + $standardDeviation)))
        {
            unset($bids[$key]);
        }
    }

    $prices[$item] = $bids;
}

print_r($prices);

基本上,您只需删除低于avg - stDev或高于avg + stDev的出价。


实际功能(从my framework移植):

function Average()
{
    if (count($arguments = func_get_args()) > 0)
    {
        return array_sum($arguments) / count($arguments);
    }

    return 0;
}

function standardDeviation()
{
    if (count($arguments = func_get_args()) > 0)
    {
        $result = call_user_func_array('Average', $arguments);

        foreach ($arguments as $key => $value)
        {
            $arguments[$key] = pow($value - $result, 2);
        }

        return sqrt(call_user_func_array('Average', $arguments));
    }

    return 0;
}

输出(demo):

Array
(
    [bar] => Array
        (
            [0] => 12.34
            [1] => 102.55
        )

    [foo] => Array
        (
            [1] => 15.66
            [2] => 102.55
        )

    [foobar] => Array
        (
            [0] => 12.34
            [1] => 15.22
            [2] => 14.18
            [3] => 20.55
            [5] => 15.88
            [6] => 16.99
        )
)

答案 1 :(得分:3)

如果您要做的只是规范化数据集 - 即汇聚到反映平均值的集合上,那么您可以使用KurtosisSkewness来表征数据集的结构以帮助识别异常值 - (使用数据集的其余部分计算每个点的度量,旨在最小化Kurtois并保持偏斜的倾向 - 拒绝极值并重复直到排除值不会显着改变度量)。

但你的问题更有趣:

让我看看我是否做得对:你对foobar市场有不完全的了解,但你可以获得有关它的有限具体信息。

您希望使用有限的数据集来预测有关市场的隐藏信息。

您需要Bayesian Average(另请参阅Bayesian Inference)。

假设您每天有1000个价格;

对于每一天,计算:均值,模式,中位数,stdev,峰度和偏度 - 这给出了市场形态的处理:

  • 意思是&amp;中位数将显示价格如何变动
  • 模式&amp; stdev将展示市场的成熟程度(成熟市场应该走低) STDEV)
  • 峰度将显示价格弹性 - 低值 弹性,更高的塑料 - 也与成熟有关
  • 偏斜将显示需求趋势 - 左边的长尾表示bargin猎人,右边的尾部表示愿意支付更高的价格

比较每日价值将使您能够衡量市场的健康状况。

一旦你有了几周的趋势数据(随着时间的推移它变得越来越好),你可以开始测试真实的价格。

  1. 首先,对数据集第一天的真实价格进行有根据的猜测。
  2. 使用偏斜加权的价格样本计算市场的贝叶斯平均价格,但样本不超过每日集合的80%/ stddev ^ 2
  3. 这已成为您的真实价格。
  4. 每天重复2 - 4会给你一个缓慢移动的价格。
  5. 如果真正的价格跳跃,那么样本量太小或市场运作不正常(即一些参与者支付高于价值,卖出低于价值,供应受到限制,购买价格不是'与价值相关等)。

    我已经对二手车的价格进行了建模(它们不是同质的)但我确实得到了一些合理的收敛 - +/- 10%,但那是在有限的数据集上。它似乎也适用于房价,而不是商品或足球比分。

    它永远不会给你一个明确的预测答案,特别是在拍卖环境中 - 但它应该让你更接近真正的价格而不是算术平均值。

答案 2 :(得分:2)

好的,在经历了很多苦苦挣扎之后,这个解决方案似乎无论多么极端(或不是) max 异常值似乎都有效。请记住,我的数学知识非常原始,所以请耐心等待。

$prices = array
(
    'baz' => array(12.34, 15.66),
    'bar' => array(12.34, 102.55),
    'foo' => array(12.34, 15.66, 102.55, 134.66),
    'foobar' => array(12.34, 15.22, 14.18, 20.55, 99.50, 15.88, 16.99, 102.55),
);

foreach ($prices as $item => $bids)
{
    $average = average($bids);
    $standardDeviation = standardDeviation($bids);

    foreach ($bids as $key => $bid)
    {
        if ($bid > ($average + ($average - $standardDeviation)))
        {
            unset($bids[$key]);
        }
    }

    $prices[$item] = $bids;
}

print_r($prices);

function average($arguments)
{
    if (count($arguments) > 0)
    {
        return array_sum($arguments) / count($arguments);
    }

    return 0;
}

function standardDeviation($arguments)
{
    if (count($arguments) > 0)
    {
        $result = Average($arguments);

        foreach ($arguments as $key => $value)
        {
            $arguments[$key] = pow($value - $result, 2);
        }

        return sqrt(Average($arguments));
    }

    return 0;
}

输出(demo):

Array
(
    [baz] => Array
        (
            [0] => 12.34
            [1] => 15.66
        )

    [bar] => Array
        (
            [0] => 12.34
        )

    [foo] => Array
        (
            [0] => 12.34
            [1] => 15.66
        )

    [foobar] => Array
        (
            [0] => 12.34
            [1] => 15.22
            [2] => 14.18
            [3] => 20.55
            [5] => 15.88
            [6] => 16.99
        )
)

答案 3 :(得分:2)

丹,阅读你的评论我开始认为你想要的东西可以很简单地实现。这是在C#中,但它很简单,应该很容易理解:

const double reasonable_price_range = 1.5;
List<double> prices = new List<double> { 50.00, 51.00, 52.00, 100.00, 101.00, 102.00, 150.00, 151.00, 152.00 };
double min = prices.Min();
var reasonable_prices = (from p in prices where p <= min * reasonable_price_range select p).ToList();

将所有大于最小价格的数字丢弃一定百分比(百分比是IMO的最佳衡量标准),然后返回其余数字。

这适用于所有示例。 1.5常数是任意的,应该更高(问题是,如果我们知道价格X是合理的,价格能走多远并且仍然被认为是合理的?)。然而,这依赖于甚至没有一个低的异常值 - 列表中的最低价格必须是合理的。

当然,min *常数不一定是最优决策函数,但是如果我们可以依赖min永远不是异常值,那么问题变得更加简单,因为我们可以将它们与最小元素进行比较,而不是分组元素。某种方式。

答案 4 :(得分:2)

如果我理解正确,您需要计算商品的最佳销售价值。 (或者您是否尝试计算真实的值?)

卖家非常自然地玩游戏(例如ebay),试图最大化他们的利润。

出于这个原因,我会避免平均/ SD方法:它们对特定销售策略产生的异常值过于敏感。

游戏理论方面,我认为聪明的卖家会通过研究他们的竞争对手及其历史销售额来估计最高可能的销售价格(最大利润):找到最佳点。

出于这个原因,我会记录所有卖家的历史价格直方图,并查看价格分布,使用接近该模式的东西来确定最优价格,即最常见的销售价格。更好的是,我会根据每个卖家的利润(与历史销售量成比例)来衡量价格。

我怀疑这会更接近你的最佳市场价值;如果您正在寻找真实的市场价值,请在下方发表评论或在machine learning公司与我联系