2010-07-21 13 views
8

Tworzę witrynę e-commerce i mam problem z opracowaniem dobrego algorytmu sortowania produktów, które są pobierane z bazy danych do połowy odpowiednich grup. Próbowałem po prostu podzielić najwyższą cenę na 4 i oprzeć każdą grupę z tego. Próbowałem także odchyleń standardowych opartych na średniej. Oba mogą wynikać z przedziałów cenowych, do których nie wchodzi żaden produkt, co nie jest przydatną opcją filtrowania.Algorytm grupowania filtrów cenowych

Próbowałem również przyjmować kwartyle produktów, ale moim problemem jest to, że cena waha się od 1 do 4,000 USD. Te 4000 USD prawie nigdy nie sprzedają się i są o wiele mniej ważne, ale wciąż przekreślają moje wyniki.

Jakieś myśli? Powinienem zwrócić większą uwagę w rankingu klasy ...

Aktualizacja:

skończyło się łącząc Metody trochę. Użyłem metody kwartyle/kubełka, ale zhakowałem ją nieco, kodując pewne zakresy, w których pojawiłaby się większa liczba grup cenowych.

//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; 
    } 
} 
+0

Wygląda na to, że jeśli wzbogacisz informacje o produkcie (zawiera tylko ceny) wraz z rzeczywistymi informacjami o sprzedaży, będziesz w stanie wykonać lepszy podział (choć nie wiem jak). –

Odpowiedz

2

Oto pomysł: w zasadzie chcesz posortować cenę do wiadra 10, każda cena za klucz w tablicy, wartość to liczba ile produkty są w danym przedziale cenowym:

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

Od wyniku można użyć przycisku resetowania i zakończenia, aby uzyskać min/maks. Każdego segmentu:

Kinda brute force, ale może być przydatna ...

+0

To jest podobne do mojego podejście, w którym brałem kwartyle, z wyjątkiem tego, że wybrałeś 10 grup zamiast 4. Myślę, że jest to jedno z najbardziej obiecujących podejść, moim jedynym problemem jest to, że powoduje dziwne zakresy cen, nawet jeśli stanowią one dobrą reprezentację danych. Innymi słowy, mogę skończyć z cenami w zakresie od 15,47 USD do 152,87 USD. Każde wiadro może mieć równomierną dystrybucję, ale granice cen są arbitralne i dezorientujące. –

0

Czego dokładnie szukasz jako efektu końcowego (czy możesz podać nam przykładowe grupowanie)? Jeśli Twoim jedynym celem jest posiadanie znacznej liczby wystarczająco ważnych produktów, to nawet jeśli znajdziesz idealny algorytm działający na bieżący zestaw danych, nie oznacza to, że będzie on działał z zestawem danych jutra. W zależności od liczby zestawów grup, które potrzebujesz, po prostu tworzyłem dowolne grupy, które pasują do twoich potrzeb, zamiast używać algorytmu. Dawny. (1 dolar - 25 USD, 25-100 USD, 100 USD +). Z punktu widzenia konsumenta mój umysł w naturalny sposób dystrybuuje produkty w 3 różnych kategoriach cenowych (tanie, średnie i drogie).

0

Myślę, że za dużo myślisz.

Jeśli znasz swoje produkty i lubisz dobre wyniki, po prostu zakodowałbym te przedziały cenowe. Jeśli uważasz, że od 1 do 10 USD ma sens w przypadku sprzedaży, nie musisz stosować algorytmu. Po prostu wykonaj test, aby wyświetlić tylko zakresy, które mają wyniki.

Jeśli nie znasz swoich produktów, po prostu posortuję wszystkie produkty według ceny i podzielę je na 4 grupy równej liczby produktów.

3

Oto pomysł, po linii myślenia mojego komentarza:

Zakładam, że masz zestaw wyrobów, każdy z nich oznaczone przez cenę i szacunkową wielkość sprzedaży (jako procent od sumy obroty). Najpierw posortuj wszystkie produkty według ich ceny. Następnie rozpocznij podział: przechodź do uporządkowanej listy i zwiększaj sprzedaż. Za każdym razem, gdy osiągniesz około 25%, wycinaj. Jeśli zrobisz to 3 razy, spowoduje to 4 podzestawy o rozbieżnych przedziałach cenowych i podobną wielkość sprzedaży.