Php 价格过滤器分组算法
我正在创建一个电子商务网站,我很难开发一个好的算法来将从数据库中提取的产品分类到适当的组中。我试着简单地把最高的价格分成4个,然后根据这4个价格分组。我还尝试了基于平均值的标准差。这两种方法都可能导致价格范围超出任何产品的范围,这不是一个有用的过滤选项 我也试着拿四分之一的产品,但我的问题是价格从1美元到4000美元不等。4000美元的价格几乎从未卖出,也远没有那么重要,但它们一直在扭曲我的结果 有什么想法吗?我应该在统计课上多加注意 更新: 最后我结合了一些方法。我使用了四分位/桶方法,但通过硬编码某些范围(在这些范围内会出现更多的价格组),对其进行了一些修改Php 价格过滤器分组算法,php,algorithm,statistics,e-commerce,Php,Algorithm,Statistics,E Commerce,我正在创建一个电子商务网站,我很难开发一个好的算法来将从数据库中提取的产品分类到适当的组中。我试着简单地把最高的价格分成4个,然后根据这4个价格分组。我还尝试了基于平均值的标准差。这两种方法都可能导致价格范围超出任何产品的范围,这不是一个有用的过滤选项 我也试着拿四分之一的产品,但我的问题是价格从1美元到4000美元不等。4000美元的价格几乎从未卖出,也远没有那么重要,但它们一直在扭曲我的结果 有什么想法吗?我应该在统计课上多加注意 更新: 最后我结合了一些方法。我使用了四分位/桶方法,但通过
//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;
}
}
你到底想要什么作为你的最终结果(你能给我们一个分组的例子)?如果您的唯一目标是让所有团队都拥有大量足够重要的产品,那么,即使您提出了适用于当前数据集的完美算法,也不意味着它适用于明天的数据集。根据您需要的组的数量,我只需要创建适合您需要的任意组,而不是使用算法。例如($1-$25,$25-100,$100+)。从消费者的角度来看,我的大脑自然会将产品分为3种不同的价格类别(便宜、中档和昂贵) 我觉得你想得太多了 如果您了解您的产品,并且喜欢细粒度的结果,我只需对这些价格范围进行硬编码。 如果你认为1到10美元对你所卖的东西有意义,那么把它放进去,你不需要算法。只需进行检查,以便只显示有结果的范围
如果你不知道你的产品,我会按价格对所有产品进行分类,并将其分成4组,每组产品数量相等。以下是一个想法,遵循我的评论思路:
我假设你有一套产品,每个产品都有一个价格和一个销售量估计值(占总销售额的百分比)。首先,按价格对所有产品进行分类。下一步,开始拆分:遍历订单列表,并累积销售额。每次你达到25%左右,就从那里开始。如果您这样做3次,它将导致4个子集具有不相交的价格范围和相似的销售量。这里有一个想法:基本上您将价格分成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美元。每个桶可能有一个均匀的分布,但价格边界是任意和混乱的。