价格筛选分组算法

8
我正在创建一家电子商务网站,但是我在开发一个好的算法来将从数据库中提取的产品分成合适的组时遇到了麻烦。我尝试过简单地将最高价分为四份,并以此为基础建立每个组。我还尝试过以平均数为基础的标准偏差。但是这两种方法都可能导致价格范围没有任何产品符合,这不是一个有用的筛选选项。
我还尝试过将产品分成四分位数,但我的问题是价格范围从1美元到4,000美元。4,000美元的产品几乎不销售,也不那么重要,但它们却使我的结果产生偏差。
有什么想法吗?我应该在统计课上更加认真一些...
更新:
最终,我结合了一些方法。我使用了四分位数/桶方法,但通过硬编码某些范围,在其中出现更多的价格组。
//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;
    }
}

听起来,如果您将仅包含价格的产品信息与实际销售信息相结合,那么您将能够执行更好的拆分(尽管我还不知道如何做到)。 - Eyal Schneider
4个回答

3

这里有一个想法:基本上您可以将价格分成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组。我认为这是最有前途的方法之一,唯一的问题是它会导致奇怪的价格范围,即使它们很好地代表了数据。换句话说,我可能会得到像15.47美元至152.87美元这样的价格范围。每个桶可能有均匀的分布,但价格边界是任意的和令人困惑的。 - Dave W.

3

这里有一个想法,跟随我的评论思路:

我假设你有一组产品,每个产品都有价格和销售量估计标签(作为总销售额的百分比)。首先,按照价格对所有产品进行排序。接下来,开始拆分:遍历排序后的列表,并累积销售量。每次达到大约25%时割裂。如果这样做3次,将会得到4个具有不同价格范围和相似销售量的子集。


0
你到底想要什么作为最终结果(能否给我们一个分组的例子)?如果你的唯一目标是让所有的组都有足够重要的产品,那么即使你找到了适用于当前数据集的完美算法,也不意味着它将适用于明天的数据集。根据你需要的组数,我建议你简单地制定符合你需求的任意分组,而不是使用算法。例如:($1 - $25,$25-100,$100+)。从消费者的角度来看,我的思维自然会将产品分成3个不同的价格类别(便宜、中档和昂贵)。

0

我觉得你想太多了。

如果你知道自己的产品,并且喜欢精细的结果,那么我会简单地硬编码这些价格范围。如果你认为售卖的商品在$1到$10之间是有意义的,那就把它放进去,你不需要一个算法。只需检查以便仅显示具有结果的范围。

如果你不了解你的产品,我建议将所有产品按价格排序,并将其分成4组,每组产品数量相等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接