2014-05-07 41 views
1

的百分比我有一組數字爲一組給定的屬性:需要計算分佈

red = 4 
blue = 0 
orange = 2 
purple = 1 

我需要計算分配的比例。意思是,選擇有多種多樣?它有20%多樣性嗎?它是100%多樣性(意味着4,4,4,4的均勻分佈)?

我試圖創造一個接近100%的性感百分比,個體價值的平均值越高,價值越低,越不平衡。

有沒有人這樣做?

這裏是下面例子的PHP轉換。由於某些原因,它不會以4,4,4,4的例子生成1.0。

$arrayChoices = array(4,4,4,4); 

foreach($arrayChoices as $p) 
    $sum += $p; 

print "sum: ".$sum."<br>"; 

$pArray = array(); 

foreach($arrayChoices as $rec) 
{ 
    print "p vector value: ".$rec." ".$rec/$sum."\n<br>"; 
    array_push($pArray,$rec/$sum); 
} 
$total = 0; 

foreach($pArray as $p) 
    if($p > 0) 
     $total = $total - $p*log($p,2); 

print "total = $total <br>"; 

print round($total/log(count($pArray),2) *100); 

在此先感謝!

回答

2

一個簡單的,如果比較幼稚,方案是總結你的意見,並完全均勻分佈

red = abs(4 - 7/4) = 9/4 
blue = abs(0 - 7/4) = 7/4 
orange = abs(2 - 7/4) = 1/4 
purple = abs(1 - 7/4) = 3/4 

共5
之間的絕對差異的完美甚至蔓延將有一個分數零,你必須映射到100%。
假設你有c類別n項目,一個完美的分佈不均勻都會有成績的

(c-1)*n/c + 1*(n-n/c) = 2*(n-n/c) 

你應該映射到0%。對於分數d,您可以使用線性變換

100% * (1 - d/(2*(n-n/c))) 

爲了您的例子,這會導致

100% * (1 - 5/(2*(7-7/4))) = 100% * (1 - 10/21) ~ 52% 

更重要的是(雖然更加複雜)爲Kolmogorov–Smirnov statistic,使用它可以使嚴格的數學聲明關於一組觀測值具有某個給定的潛在概率分佈的概率。

+0

謝謝!這很好。我幾乎擁有它。 :) –

1

一種可能性是將您的度量基於0​​。均勻分佈有最大熵,所以你可以創建如下措施:

1)將您的計數的載體P,比例 (概率)的載體。

2)爲你的 概率P計算熵函數H(P)

3)對等於 的矢量計算熵函數H(U),其概率與P的長度相同。 (這原來 爲H(U) = -log(1.0/length(P)),所以你實際上並不 需要創建U作爲載體。)

4)你的多樣性的措施是100 * H(P)/H(U)

任何一組相等的計數都會產生100的差異。當我將它應用於您的(4,0,2,1)情況時,多樣性爲68.94。所有但具有0計數了一個元素任何載體具有多樣性0

附錄

現在的源代碼!我在Ruby中實現了這一點。

def relative_entropy(v) 
    # Sum all the values in the vector v, convert to decimal 
    # so we won't have integer division below... 
    sum = v.inject(:+).to_f 

    # Divide each value in v by sum, store in new array p 
    pvals = v.map{|value| value/sum} 

    # Build a running total by calculating the entropy contribution for 
    # each p. Entropy is zero if p is zero, in which case total is unchanged. 
    # Finally, scale by the entropy equivalent of all proportions being equal. 
    pvals.inject(0){|total,p| p > 0 ? (total - p*Math.log2(p)) : total}/Math.log2(pvals.length) 
end 

# Scale these by 100 to turn into a percentage-like measure 
relative_entropy([4,4,4,4])  # => 1.0 
relative_entropy([4,0,2,1])  # => 0.6893917467430877 
relative_entropy([16,0,0,0]) # => 0.0 
+0

我很想看到一個基於上述值的技術代碼示例。看起來很有趣。 –

+0

@MarkLöwe你走了。 – pjs

+0

謝謝!翻譯成php ...大腦傷害! ;) –