【问题标题】:Need to calculate the percentage of distribution需要计算分配百分比
【发布时间】:2014-06-24 04:40:59
【问题描述】:

我有一组给定属性的数字:

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

提前致谢!

【问题讨论】:

    标签: math average distribution


    【解决方案1】:

    一种可能性是将您的度量基于entropy。均匀分布具有最大熵,因此您可以按如下方式创建度量:

    1) 将计数向量转换为P,一个比例向量 (概率)。

    2) 计算向量的熵函数H(P) 概率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
    

    【讨论】:

    • 我很乐意看到基于上述值的这种技术的代码示例。看起来很有趣。
    • @MarkLöwe 你去吧。
    • 我在转换您的 ruby​​ 代码时遇到问题。你能看看我上面的 php 例子吗?
    • 除以log2(arraylength) 是在所有术语合计之后完成的,而不是逐个术语。
    • 我想我终于明白了!谢谢兄弟。
    【解决方案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,您可以使用它对一组观测值具有某个给定的潜在概率分布的概率做出严格的数学陈述。

    【讨论】:

    • 谢谢!这太棒了。我几乎拥有它。 :)
    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 2011-06-01
    • 2021-01-10
    • 1970-01-01
    • 2012-04-05
    相关资源
    最近更新 更多