python

时间:2019-01-15 19:04:20

标签: python plot auc

我有两个数字列表,xs和ys:

xs = [2, 5, 4]
ys = [6, 7, 8]

并使用matplotlib库绘制它们:

import matplotlib.pyplot as plt
plt.plot(xs, ys, 'bo')

现在,我想计算绘图下的面积。我尝试了excel方法:

sum = 0
for i in range(1, len(xs)):
    y = ys[i] + ys[i - 1]
    x = xs[i] - xs[i - 1]
    sum = sum + (y/2 * x)

,但答案并非总是正确的。然后尝试这个:

from sklearn.metrics import auc
print('computed AUC using sklearn.metrics.auc: {}'.format(auc(xs,ys)))

,但不适用于未排序的xs。那么我该如何计算情节下的面积呢?

1 个答案:

答案 0 :(得分:2)

您的积分公式似乎对离散点正确。我无法理解您想要曲线下的面积的方法。顺便说一句,它是在x轴上未排序的,是从点[0]到点[1]的线下面积,然后从点[1]到点[2]的面积减去。如果是您的情况,那么它确实有效。

如果您希望它们位于所有3点正下方的区域,我将对xs进行排序。如果您想要曲线下的面积,即使考虑到它本身是双背的,我也会在for循环中采用x的绝对值。 abs()

如果您希望曲线下的面积不重复计算点[1]和点[2]之间的面积。我会写,

import matplotlib.pyplot as plt
xs = [2, 5, 4]
x_sort = sorted(xs)
ys = [6, 7, 8]
sum = 0
plt.plot(xs, ys, 'bo')
plt.show()
for i in range(1, len(xs)):
    slope = (xs[i]-xs[i-1])/(ys[i] - ys[i-1])
    delta_x = x_sort[i] - x_sort[i - 1]
    delta_y =  ys[i - 1] + (ys[i-1] + delta_x * slope)
    sum = sum + (delta_y/2 * delta_x)
print(sum)

这将采用未排序点之间的斜率并将其应用于排序后的值之间,如果按[xs,ys]对的顺序连接线,则会为您提供图形正下方的区域。

我希望这有助于回答您的问题。