如何通过计算每秒每帧之间的平均方差来找到稳定性指数?

时间:2018-01-17 18:32:40

标签: python statistics

我在表格中有我的FPS数据,例如:

T:FPS

1:30

2:15

3:25

4:26

5:20

我想找到FPS 稳定性指数。 FPS的所有值的总和除以数字?它只是平均值,但不确定它是否会显示我正在寻找的数据。我不擅长统计并寻求任何帮助。我想用Python编写它,但语言并不重要,更重要的是计算逻辑。 谢谢。

1 个答案:

答案 0 :(得分:0)

我假设"稳定性指数的定义"取自以下问题:Population stability index

首先要求有2个系列:基础和目标。如果你没有它们,我找不到"稳定性指数"的定义。这可以使你的情况。相反,您可能对FPS系列的standard deviation感兴趣。

要计算列表fps的数字的stdev,您可以使用以下代码:

from math import sqrt
fps = [30, 15, 25, 26, 20]
fps_stdev = sqrt(sum(x**2 for x in fps)/len(fps)-(sum(fps)/len(fps))**2)
# fps_stdev == 5.192301994298871

计算平均值,减去平均值的平方,最后提取平方根。

编辑:以下代码应将人口稳定性指数计算为defined。您可以将binstarget更改为不同的长度和值。我建议将目标定为25到35之间的均匀分布。

import math
fps = [30, 15, 25, 26, 20, 15, 20, 30, 26, 25]
bins = [0, 25, 30, 35, 1000]
target = [0.001,0.499,0.499,0.001]
base   = [sum(1 for x in fps if low<=x<high)/len(fps)
          for low, high in zip(bins[:-1],bins[1:])]
psi = sum((a-b)*math.log((a+1e-9)/b) for a, b in zip(base, target))
# psi == 2.7065829626120728

或者在使用numpy的函数中:

import numpy as np
bins = [0, 25, 30, 35, 1000]
target = np.array([0.001,0.499,0.499,0.001])

def psi(fps):
    base = np.histogram(fps, bins=bins)[0]/len(fps)
    return np.sum((base-target)*np.log(1e-9 + base/target))

其中给出了以下结果:

psi([30, 15, 25, 26, 20, 15, 20, 30, 26, 25])  # 2.7065829626120728
psi(np.random.uniform(20,40,[1000000]))  # 3.0929707119205654
psi(np.random.uniform(24,36,[1000000]))  # 0.75734794293362917
psi(np.random.uniform(25,35,[1000000]))  # 0.041450536356554171
psi(np.random.uniform(26,34,[1000000]))  # 0.041450567333546476
psi(np.random.uniform(29,31,[1000000]))  # 0.041450706905843779
psi(np.random.uniform(29,37,[1000000]))  # 1.9470356968069937
psi(np.random.uniform(29,60,[1000000]))  # 7.0800113672962866
psi(np.random.uniform(35,60,[1000000]))  # 27.603390094813619
psi(np.random.uniform(0, 25,[1000000]))  # 27.603390094813619

请注意np.log(1e-9 + base/target):如果基本bin为空,那么1e-9会避免日志转到-inf,但上面结果的最后几行对{的任意选择非常敏感{1}}。记在心上。此外,目标箱必须> 0以避免被零除。