Как рассчитать градиент массива - PullRequest
0 голосов
/ 19 июня 2019

У меня есть несколько массивов в numpy, которые я построил, и я хочу посмотреть, какой из этих графиков в целом увеличивается или уменьшается.Я знаю, что numpy имеет встроенную функцию градиента, но это дает ее для каждой точки.Может ли вычисление среднего значения полученного градиентного массива дать мне точное представление о том, уменьшаются или увеличиваются мои графики?

например

Вот некоторые из моих массивов:

n1=[6.2, 5.0, 6.6, 5.7, 8.3, 8.5, 7.9, 6.7, 8.0, 8.3, 8.6, 8.3]

n2=[13.8, 10.4, 9.4, 12.4, 12.8, 10.9, 11.0, 11.0, 11.7, 14.5, 13.8, 14.2]

В настоящее время я делаю это:

m_n1=np.mean(np.gradient(n1))
m_n2=np.mean(np.gradient(n2))

Что дает:

m_n1 как 0,1125

и m_n2 как -0,092

Можно ли сказать, что график для n1 положительный, а график для n2 отрицательный?

1 Ответ

0 голосов
/ 12 июля 2019

Получение среднего значения градиентов не является надежным способом определения трендов в ваших данных.Если вы представляете свои данные в виде графика, наблюдается явная тенденция к росту, и, как вы указали, среднее значение градиентов будет отрицательным для второго случая.Используя приведенный ниже пример, мы можем построить данные, посмотреть на тенденции и изменчивость градиентов.

Вы можете видеть, что использование линии тренда является более надежным способом определения того, увеличиваются или уменьшаются ваши данные, учитывая, что линия тренда фактически представляет ваши данные.С другой стороны, градиенты усиливают изменчивость шкалы суб-тренда и теперь включают положительные и отрицательные числа, которые будут смещаться в среднем.

enter image description here

import numpy as np
from matplotlib import peplos as plt

#Define the example data
n1=np.array([6.2, 5.0, 6.6, 5.7, 8.3, 8.5, 7.9, 6.7, 8.0, 8.3, 8.6, 8.3])
n2=np.array([13.8, 10.4, 9.4, 12.4, 12.8, 10.9, 11.0, 11.0, 11.7, 14.5, 13.8, 14.2])

#arbitrary time dimension, assume fixed delta 
tim = np.arange(0,len(n1))

#get linear trend lines
m1, b1 = np.polyfit(tim, n1, 1)
m2, b2 = np.polyfit(tim, n2, 1)


fig=plt.figure(figsize=(12,6))

ax1=plt.subplot(121)
ax1.plot(tim,n1,c='C0',lw=2,label='n1')
ax1.plot(tim,n2,c='C1',lw=2,label='n2')
ax1.plot(tim,m1*tim+b1,ls='dotted',c='C0',lw=2,label='n1 slope=%1.2f'%m1)
ax1.plot(tim,m2*tim+b2,ls='dotted',c='C1',lw=2,label='n2 slope=%1.2f'%m2)
ax1.legend()


ax2=plt.subplot(122)
ax2.plot(tim,np.gradient(n1),c='C0',lw=2,label='n1 gradient mean=%1.2f'%np.mean(np.gradient(n1)))
ax2.plot(tim,np.gradient(n2),c='C1',lw=2,label='n2 gradient mean=%1.2f'%np.mean(np.gradient(n2)))
ax2.axhline(0,c='black')
ax2.legend()

plt.show()
...