【问题标题】:Price Filter Grouping Algorithm价格过滤分组算法
【发布时间】:2011-03-19 06:41:24
【问题描述】:

我正在创建一个电子商务网站,但我无法开发一个好的算法来将从数据库中提取的产品分类到适当的组中。我尝试将最高价格简单地分成 4 份,然后将每组都以此为基础。我还尝试了基于平均值的标准偏差。两者都可能导致没有产品会落入的价格范围,这不是一个有用的过滤选项。

我也尝试过取产品的四分位数,但我的问题是价格从 1 美元到 4,000 美元不等。 4,000 美元几乎从来没有卖出去,而且远没有那么重要,但它们一直在扭曲我的结果。

有什么想法吗?我应该在统计课上多加注意...

更新:

我最终结合了一些方法。我使用了 quartile/bucket 方法,但通过硬编码将出现更多价格组的某些范围进行了一些修改。

//Price range algorithm

sort($prices);

//Divide the number of prices into four groups
$quartilelength = count($prices)/4;

//Round to the nearest ...
$simplifier = 10;

//Get the total range of the prices
$range = max($prices)-min($prices);

//Assuming we actually are working with multiple prices
if ($range>0 )
{
    // If there is a decent spread in price, and there are a decent number of prices, give more price groups
    if ($range>20 && count($prices) > 10) 
    {
        $priceranges[0] = floor($prices[floor($quartilelength)]/$simplifier)*$simplifier;
    }

    // Always grab the median price
    $priceranges[1] = floor($prices[floor($quartilelength*2)]/$simplifier)*$simplifier;

    // If there is a decent spread in price, and there are a decent number of prices, give more price groups
    if ($range>20 && count($this->data->prices) > 10)
    {
        $priceranges[2] = floor($prices[floor($quartilelength*3)]/$simplifier)*$simplifier;
    }
}

【问题讨论】:

  • 听起来如果你用实际的销售信息来丰富产品信息(只包含价格),那么你将能够进行更好的拆分(虽然我还不知道如何)

标签: php algorithm statistics e-commerce


【解决方案1】:

这是一个想法:基本上你会将价格分成 10 个桶,每个价格作为数组中的键,值是给定价格点有多少产品的计数:

public function priceBuckets($prices)
{    
    sort($prices);

    $buckets = array(array());
    $a = 0;

    $c = count($prices);
    for($i = 0; $i !== $c; ++$i) {
        if(count($buckets[$a]) === 10) {
            ++$a;
            $buckets[$a] = array();
        }

        if(isset($buckets[$a][$prices[$i]])) {
            ++$buckets[$a][$prices[$i]];
        } else if(isset($buckets[$a - 1][$prices[$i]])) {
            ++$buckets[$a - 1][$prices[$i]];
        } else {
            $buckets[$a][$prices[$i]] = 1;
        }
    }

    return $buckets;
}

//TEST CODE
$prices = array();

for($i = 0; $i !== 50; ++$i) {
    $prices[] = rand(1, 100);
}
var_dump(priceBuckets($prices));

从结果中,你可以使用reset和end来得到每个桶的最小值/最大值

有点蛮力,但可能有用...

【讨论】:

  • 这类似于我采用四分位数的方法,只是您选择了 10 个组而不是 4 个。我认为这是最有前途的方法之一,我唯一的问题是它会导致奇数价格范围,即使它们是数据的良好表示。换句话说,我最终可能会得到 15.47 美元到 152.87 美元之间的价格。每个桶可能有一个均匀分布,但价格界限是任意的且令人困惑。
【解决方案2】:

这是一个想法,遵循我评论的思路:

我假设您有一组产品,每个产品都标有价格和销量估计值(占总销售额的百分比)。首先,按价格对所有产品进行分类。接下来开始拆分:遍历有序列表,累计销量。每次达到大约 25% 时,就削减那里。如果您这样做 3 次,将导致 4 个子集具有不相交的价格范围和相似的销量。

【讨论】:

    【解决方案3】:

    您究竟在寻找什么作为最终结果(您能给我们一个分组示例)吗?如果您的唯一目标是让所有团队拥有大量足够重要的产品,那么,即使您提出了适用于当前数据集的完美算法,但这并不意味着它将适用于明天的数据集。根据您需要的组的数量,我会简单地制作适合您需要的任意组,而不是使用算法。前任。 (1 - 25 美元、25-100 美元、100 美元以上)。从消费者的角度来看,我的想法很自然地将产品分为 3 个不同的价格类别(便宜、中档和昂贵)。

    【讨论】:

      【解决方案4】:

      我觉得你想太多了。

      如果您了解自己的产品,并且喜欢细粒度的结果,我会简单地对这些价格范围进行硬编码。 如果你认为 1 到 10 美元对你所销售的东西有意义,那就把它放进去,你不需要算法。只需进行检查,以便只显示有结果的范围。

      如果你不知道你的产品,我会按照价格对所有产品进行排序,然后分成 4 组,每组数量相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-03
        • 2013-09-16
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多