python - 计算线性百分比差异
问题描述
我有两个相关的数据集,其中一个可能略低于 0。
我正在尝试计算两者之间的“线性”百分比差异。
我已经编写了一些示例代码: perc[1] 是正确的百分比方法,但是在最后两个示例情况下,双方的百分比差异不是“线性”(即 -87 与 700 相比)-我需要它们相等或在计算中具有一定的线性度,而我猜最后三种方法是线性的。我喜欢 perc[3] 因为它只是绝对差异和放大,但有点无单位。也许 [4] 或 [5] 是这个用例最准确的,使用两者的平均值作为分母?
1, 8: [12.5, -87.5, 700.0, -700, -155.55555555555557, 155.55555555555557]
8, 1: [800.0, 700.0, -87.5, 700, 155.55555555555557, -155.55555555555557]
统计不是我的强项。谁能提供为什么我应该使用 [4] 或 [5] 的原因。我知道 0,1,2 和 3 在这里可能不是正确的选择
import numpy as np
import matplotlib.pyplot as plt
def perc_calc(x,y):
perc0=(x/y)*100 #Original one i used but is non-linear
perc1=((x-y)/(y))*100 #Proper % method but still nonlinear
perc2=((y-x)/x)*100 #Depends if use x or y
perc3=(x-y)*100 #Just amplifying the real difference
perc4=(x-y)/((x+y)/2)*100 #Difference by the mean
perc5=(y-x)/((x+y)/2)*100 #Opposite difference by the mean
return [perc0,perc1,perc2,perc3,perc4,perc5]
x=np.random.uniform(-0.005, 1, size=600)
y=np.random.uniform(0.005,1,size=600)
plt.plot(perc_calc(x,y)[3])
plt.show()
plt.plot(perc_calc(x,y)[4])
plt.show()
def example(x,y):
print(str(x)+', '+str(y)+': '+str(perc_calc(x,y)))
#Example Cases:
example(5,10)
example(-1,10)
example(1,8)
example(8,1)
解决方案
参考这篇Wikipedia article,相对百分比通常是以下形式
|x - y| / |f(x, y)|
|x - y| 中的绝对值 如果您有参考点,则可以将其删除,从而获得负百分比。如果这对你没有意义,你应该保留它。
函数 |f(x,y)| 就是通常所说的比例因子。您可以在此处选择许多选项,这取决于应用程序。
你可以只取 f(x, y) = y,就像在 (1) 中所做的那样。这通常是在比较实验值和理论值时完成的,比如在一些实验中测量之后;或者在测量相对于过去状态的变化时。但请注意,它需要一个参考点(理论值或更改完成前的值),并且它不具有您正在寻找的“线性”属性,因为您的缩放因子在交换 x 和 y 时会发生变化(1 /2 vs 1 如果我们使用 1 和 2)。这是因为,对于 2 的值,突然变为 10 意味着增加了 400%,但从 10 变为 2 意味着减少了 80%。
所以你需要一些在交换参数时不会改变的函数 f 。这在数学上称为对称函数。前面引用的文章中有很多例子。我建议使用 (|x| + |y|)/2,但试试其他的,看看更有意义。
perc6 = abs(x-y) / ((abs(x)+abs(y)) / 2) * 100
要通过绘图进行测试,请尝试固定 y 的值,例如 10,然后绘制 x 与 的散点图perc_calc(x, 10)[6]
。
推荐阅读
- python - 如何从任何行读取
- android - Android Studio 启动失败重复组件键异常
- python - 如何在 android studio 中将数据发送到我的 python 代码
- macos - Oh_My_ZSH!Mac 上的错误:“.oh-my-zsh/oh-my-zsh.sh:66: command not found: rm”
- android - com.google.protobuf.Any$1 类型被定义了多次
- php - OctoberCMS - 使用图表或记分牌报告我的预订
- azure - 动态 IP 无法使用 Azure 反向 DNS?
- node.js - 如何通过单击浏览器中的后退按钮来修复用户对授权页面的访问
- .htaccess - 在 .htaccess 中强制使用 HTTPS 并避免 302 重定向
- html - 如何将普通 CSS 应用于 Angular 组件