9

私が持っているもの:

  • ユーザーはオークションサイトでfoobarsを販売しています。
  • 各foobarは同一です。
  • ユーザーが決定したfoobarの価格。
  • 各価格表を破棄して、次のようなデータセットを作成します。
    $ prices =('foobar' => [12.34、15.22、14.18、20.55、9.50]);

必要なもの:

  • 日、週、月ごとの現実的な平均市場価格を見つけるため。

私が直面している問題:

  • データにバイアスがかかっているため、外れ値の拒否の実装はうまく機能しないことが証明されています。
  • 元に戻すことはできないため、ユーザーが平均市場価格をはるかに下回る価格でオークションを行う可能性はほとんどありません。市場価格をはるかに下回っていても、このインスタンスが発生する頻度は非常に低いため、全体的な平均には影響しません。ただし、価格を引き上げようとするユーザーははるかに可能性が高く、現実的な平均市場価値に影響を与えるほど頻繁に発生します。

私がそれについてやろうとしていること:

Daniel Collicott:

私があなたを正しく理解しているなら、あなたはアイテムの最適な販売価値を計算したいと思うでしょう。(または実際の値を計算しようとしていますか??)

売り手は非常に自然にゲームをしていて(eBayなど)、利益を最大化しようとしています。

このため、平均/ SDアプローチは避けたいと思います。それらは、特定の販売戦術によって作成された外れ値に敏感すぎます。

ゲーム理論的には、賢い売り手は、競合他社とその過去の売上高を調査することによって、最も可能性の高い販売価格(最大利益)を見積もることができると思います。スイートスポットを見つけることです。

このため、すべての売り手の過去の価格のヒストグラムを記録し、モードに近づくものを使用して価格の分布を調べ、最適な価格、つまり最も一般的な販売価格を決定します。さらに良いことに、私は個々の売り手の利益(過去の販売量に比例)で価格を比較検討します。

これはあなたの最適な市場価値に近いと思います。実際の市場価値をお探しの場合は、以下にコメントするか、私の機械学習会社にご連絡ください

私が持っている質問:

  • @Daniel Collicottの投稿で言及されていることのより詳細な説明:

    ->最適な販売額
    ->実際の販売額
    ->両方のアルゴリズム

4

5 に答える 5

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


そして実際の機能(私のフレームワークから移植された):

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;
}

出力(デモ):

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
        )
)
于 2012-04-30T00:08:37.673 に答える
3

データセットを正規化するだけの場合、つまり平均を反映するセットに収束する場合は、尖度歪度を使用してデータセットの構造を特徴付け、外れ値を特定するのに役立てることができます(データセットの残りの部分は、尖度を最小化し、歪度の傾向を維持することを目的としています-極端な値を拒否し、値を除外してもメトリックが大幅に変化しないまで繰り返します)。

しかし、あなたの問題はもう少し興味深いものです。

私がこれを正しく理解しているかどうかを見てみましょう。あなたはfoobar市場について完全には理解していませんが、それに関する限られた具体的な情報にアクセスできます。

限られたデータセットを使用して、市場に関する隠された情報を予測したいとします。

ベイズ平均が必要です(ベイズ推定も参照)。

1日あたりの価格が1000であると仮定しましょう。

毎日、平均、最頻値、中央値、標準偏差、尖度、歪度を計算します。これにより、市場の形を把握できます。

  • 平均値と中央値は、価格がどのように動いているかを示します
  • mode&stdevは、市場がどれだけ成熟しているかを示します(成熟した市場はより低いstdevを持つ必要があります)
  • 尖度は価格弾力性を示します-低い値は弾力性があり、高い値はより可塑性があります-成熟度にも関係します
  • 歪度は需要の傾向を示します-左側の長いテールはバージンハンターを示し、右側のテールはより高い価格を支払う意思があることを示します

毎日の値を比較すると、市場の健全性を測定できます。

数週間分のトレンドデータが得られたら(時間の経過とともに良くなります)、実際の価格のテストを開始できます。

  1. 最初に、データセットの初日の実際の価格を知識に基づいて推測します。
  2. 価格のスキュー加重サンプルを使用して市場のベイズ平均価格を計算しますが、サンプルは1日セットの80%/ stddev^2以下です。
  3. これがあなたの本当の価格になります。
  4. 毎日2〜4を繰り返すと、ゆっくりと動く価格になります。

真の価格が急上昇している場合は、サンプルサイズが小さすぎるか、市場が適切に機能していません(つまり、参加者の一部が値を超えて支払い、値を下回って販売し、供給が制限され、購入価格が値など)。

私は中古車の価格をモデル化してみましたが(それらは均一ではありません)、ある程度の収束が得られました-+/- 10%ですが、それは限られたデータセットにありました。また、商品やサッカーのスコアではなく、住宅価格でも機能するようです。

特にオークション環境では、決定的な予測の答えが得られることは決してありませんが、算術平均よりもはるかに真の価格に近づくはずです。

于 2012-05-16T11:58:32.110 に答える
2

私があなたを正しく理解しているなら、あなたはアイテムの最適な販売価値を計算したいと思います。(または実際の値を計算しようとしていますか??)

売り手は非常に自然にゲームをしていて(eBayなど)、利益を最大化しようとしています。

このため、平均/ SDアプローチは避けたいと思います。それらは、特定の販売戦術によって作成された外れ値に敏感すぎます。

ゲーム理論的には、賢い売り手は、競合他社とその過去の売上高を調査することによって、最も可能性の高い販売価格(最大利益)を見積もることができると思います。スイートスポットを見つけることです。

このため、すべての売り手の過去の価格のヒストグラムを記録し、モードに近づくものを使用して価格の分布を調べ、最適な価格、つまり最も一般的な販売価格を決定します。さらに良いことに、私は個々の売り手の利益(過去の販売量に比例)で価格を比較検討します。

これはあなたの最適な市場価値に近いと思います。実際の市場価値をお探しの場合は、以下にコメントするか、私の機械学習会社にご連絡ください

于 2012-05-10T22:01:43.623 に答える
2

さて、ここで多くの苦労をした後、外れ値がどれほど極端であるか(またはそうでないか)に関係なく機能するように見える解決策があります。私の数学の知識はかなり生々しいので、これを一粒の塩と一緒に取ってください。

$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;
}

出力(デモ):

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
        )
)
于 2012-04-30T01:51:41.507 に答える
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が妥当であることがわかっている場合、価格がどれだけ高くなり、それでも妥当であると見なされるかということです)。ただし、これは、低い外れ値が1つも存在しないことに依存しています。リストの最低価格は、妥当な価格である必要があります。

もちろん、min *定数は必ずしも最適な決定関数ではありませんが、minが外れ値にならないことを信頼できる場合、要素をグループ化する代わりに、何らかの方法で最小要素と比較できるため、問題ははるかに単純になります。

于 2012-04-30T09:34:46.820 に答える