对于给定的一组属性,我有一组数字:
red = 4
blue = 0
orange = 2
purple = 1我需要计算分配百分比。意思是,选择有多多样化?有20%的多样性吗?它是否100%的多样性(意味着均匀分布的4,4,4,4,4)?
我试图创造一个性感的百分比,越接近100%,个体的平均值越接近相同的值,越低的价值,他们越不平衡。
有人做过这个吗?
下面是下面示例的PHP转换。出于某种原因,它没有用4,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);提前感谢!
发布于 2014-05-07 19:41:20
一个简单的,即使相当天真的方案,就是把你的观察结果和一个完全均匀的分布之间的绝对差异之和起来。
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类别,一个完全不均衡的传播将有一个分数
(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统计量,您可以用它对一组观测有一些给定的潜在概率分布的概率作出数学上严格的陈述。
发布于 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中实现了这一点。
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.0https://stackoverflow.com/questions/23513814
复制相似问题