首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要计算分配百分比

需要计算分配百分比
EN

Stack Overflow用户
提问于 2014-05-07 09:23:56
回答 2查看 301关注 0票数 1

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

代码语言:javascript
复制
red    = 4
blue   = 0
orange = 2
purple = 1

我需要计算分配百分比。意思是,选择有多多样化?有20%的多样性吗?它是否100%的多样性(意味着均匀分布的4,4,4,4,4)?

我试图创造一个性感的百分比,越接近100%,个体的平均值越接近相同的值,越低的价值,他们越不平衡。

有人做过这个吗?

下面是下面示例的PHP转换。出于某种原因,它没有用4,4,4,4,4例生成1.0。

代码语言:javascript
复制
$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);

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-07 19:41:20

一个简单的,即使相当天真的方案,就是把你的观察结果和一个完全均匀的分布之间的绝对差异之和起来。

代码语言:javascript
复制
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%。

假设您有n项目的c类别,一个完全不均衡的传播将有一个分数

代码语言:javascript
复制
(c-1)*n/c + 1*(n-n/c) = 2*(n-n/c)

你应该把它映射到0%。对于得分d,可以使用线性转换

代码语言:javascript
复制
100% * (1 - d / (2*(n-n/c)))

对于您的例子来说,这将导致

代码语言:javascript
复制
100% * (1 - 5 / (2*(7-7/4))) = 100% * (1 - 10/21) ~ 52%

更好的(尽管更复杂)是Kolmogorov统计量,您可以用它对一组观测有一些给定的潜在概率分布的概率作出数学上严格的陈述。

票数 2
EN

Stack Overflow用户

发布于 2014-05-08 23:56:36

一种可能是将您的度量建立在基础上。均匀分布具有最大熵,因此可以创建如下度量:

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中实现了这一点。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23513814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档