2010-07-21 56 views
8

我正在創建一個電子商務網站,而且我很難開發出一種很好的算法來對從數據庫中提取的產品進行分類,將其分類到適當的組中。我試圖簡單地將最高價格分成4份,然後將每個組分成幾份。我也嘗試了基於平均值的標準偏差。兩者都可能導致價格範圍內沒有產品將落入,這不是一個有用的過濾選項。價格過濾器分組算法

我也嘗試了四分之一的產品,但我的問題是,價格範圍從1美元到4000美元。 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; 
    } 
} 
+0

這聽起來像是如果用實際銷售信息豐富產品信息(僅包含價格),那麼您將能夠執行更好的拆分(儘管我現在還不知道如何) – 2010-07-21 22:46:03

回答

2

這裏有一個想法:基本上,你會排序的價格爲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)); 

從結果中,你可以使用重置和結束獲得每個桶的最小/最大值

有點暴力,但可能是有用的...

+0

這與我的除了你選擇了10個組而不是4個,我認爲這是最有前途的方法之一,我唯一的問題是,即使它們是數據的良好表示,它也會導致奇數的價格範圍。換句話說,我可能最終的價格範圍是15.47美元到152.87美元。每個桶可能具有均勻分佈,但價格邊界是任意的和令人困惑的。 – 2010-07-22 00:40:38

0

你究竟在尋找什麼作爲最終結果(你能給我們一個例子分組)嗎?如果你的唯一目標是讓所有的團隊都擁有足夠多的足夠重要的產品,那麼即使你想出了適用於你當前數據集的完美算法,但這並不意味着它可以與明天的數據集一起工作。根據您需要的組的數量,我可以簡單地創建適合您需求的任意組,而不是使用算法。防爆。 ($ 1 - $ 25,$ 25-100,$ 100 +)。從消費者的角度來看,我的想法很自然地將產品分成3個不同的價格類別(便宜,中檔和昂貴)。

0

我想你太想了。

如果您瞭解您的產品,並且您喜歡細粒度的結果,那麼我會簡單地對這些價格範圍進行硬編碼。 如果您認爲1美元至10美元對您所銷售的產品有意義,則將其放入,您不需要算法。只需進行檢查,以便只顯示有結果的範圍。

如果您不瞭解您的產品,我將按價格對所有產品進行分類,並將其劃分爲4組數量相同的產品。

3

這裏有一個想法,下面我的評論的思想路線:

我假定你有一組產品,它們中的每一個價格標籤和銷量估計(從總的百分比銷售)。首先,按價格分類所有產品。接下來,開始拆分:遍歷有序列表,並累積銷售量。每次你達到25%時,在那裏砍。如果您這樣做了3次,則會導致4個子集具有不相交的價格範圍和相似的銷售量。