Алгоритм группировки ценового фильтра - PullRequest
8 голосов
/ 22 июля 2010

Я создаю сайт электронной коммерции, и у меня возникают проблемы при разработке хорошего алгоритма для сортировки продуктов, которые извлекаются из базы данных, на половину соответствующих групп.Я попытался просто разделить самую высокую цену на 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;
    }
}

Ответы [ 4 ]

3 голосов
/ 22 июля 2010

Вот идея: в основном вы бы отсортировали цену по 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));

Исходя из результата, вы можете использовать сброс и конец, чтобы получить минимум / максимум для каждого сегмента

Какая-то грубая сила, но может быть полезной ...

3 голосов
/ 22 июля 2010

Вот идея, следующая из моей мысли:

Я предполагаю, что у вас есть набор продуктов, каждый из которых помечен ценой и оценкой объема продаж (в процентах оттотальная распродажа).Сначала отсортируйте все товары по их цене.Далее начните разделение: пройдитесь по упорядоченному списку и накопите объем продаж.Каждый раз, когда вы достигаете около 25%, сократить там.Если вы сделаете это 3 раза, это приведет к тому, что 4 подмножества будут иметь непересекающиеся диапазоны цен и аналогичный объем продаж.

0 голосов
/ 22 июля 2010

Я думаю, ты слишком много думаешь.

Если вы знаете свою продукцию и вам нравятся мелкозернистые результаты, я бы просто жестко закодировал эти ценовые диапазоны. Если вы думаете, что от 1 до 10 долларов имеет смысл для того, что вы продаете, вставьте это, вам не нужен алгоритм. Просто сделайте проверку, чтобы показать только диапазоны, которые имеют результаты.

Если вы не знаете свои продукты, я бы просто отсортировал все продукты по цене и разделил бы их на 4 группы с одинаковым количеством продуктов.

0 голосов
/ 22 июля 2010

Что именно вы ищете в качестве конечного результата (не могли бы вы привести пример группировки)? Если ваша единственная цель состоит в том, чтобы у всех групп было значительное количество достаточно важных продуктов, то, даже если вы придумали идеальный алгоритм, который работает для вашего текущего набора данных, это не значит, что он будет работать с завтрашним набором данных. В зависимости от количества наборов групп, которые вам нужны, я бы просто создал произвольные группы, которые соответствуют вашим потребностям, вместо использования алгоритма. Ex. (1–25 долларов, 25–100 долларов, 100 долларов +). С точки зрения потребителя мой разум естественным образом распределяет товары по 3 разным ценовым категориям (дешево, средне и дорого).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...