2015-11-07 3 views
2

Я пытаюсь вычислить текущее среднее, среднее и std большого массива. Я знаю, как рассчитать текущее среднее значение ниже:Запуск или скользящее среднее, среднее и стандартное отклонение

def running_mean(x, N): 
    cumsum = np.cumsum(np.insert(x, 0, 0)) 
    return (cumsum[N:] - cumsum[:-N])/float(N) 

Это работает очень эффективно. Но я не совсем понимаю, почему (cumsum[N:] - cumsum[:-N])/float(N) может дать среднее значение (я заимствовал у кого-то еще).

Я попытался добавить еще одно возвращаемое предложение для вычисления медианы, но оно не делает то, что я хочу.

return (cumsum[N:] - cumsum[:-N])/float(N), np.median(cumsum[N:] - cumsum[:-N]) 

Кто-нибудь предлагает мне какой-то намек на решение этой проблемы? Большое спасибо.

Huanian Чжан

+0

Ваша цель - понять, что происходит, или вы просто хотите использовать эти функции? В последнем случае вы можете найти многие из них, предопределенные в 'pandas' - см. Http://pandas.pydata.org/pandas-docs/stable/comput.html#moving-rolling-statistics-moments – cel

+0

' median' - это нечетная статистика. Это просто среднее значение или среднее значение для двух средних значений. Это требует сортировки значений, что-то совершенно отличное от их суммирования. – hpaulj

ответ

5

Это cumsum трюк специфичен для нахождения sum или average значения и не думаю, что вы можете продлить его просто получить median и std значения. Один из подходов к выполнению общей операции ufunc в скользящем/запущенном окне в массиве 1D состоял бы в создании серии 1D скользящих оконных индексов, уложенных в виде 2D-массива, а затем применяют ufunc вдоль оси укладки. Для получения этих индексов вы можете использовать broadcasting.

Таким образом, для выполнения работает средняя, ​​она будет выглядеть следующим образом -

idx = np.arange(N) + np.arange(len(x)-N+1)[:,None] 
out = np.mean(x[idx],axis=1) 

Для запуска median и std, просто замените np.mean с np.median и np.std соответственно.

+0

Я пробовал ваш метод, хотя я не совсем понимаю, как вы делали разворот/бег. Но это дает некоторую ошибку. Я помещаю эти два предложения под определение моего run_mean и возвращаюсь, но он говорит: «TypeError: только целые массивы с одним элементом могут быть преобразованы в индекс». Не могли бы вы объяснить это мне? Большое спасибо. –

+0

@HuanianZhang Позвольте мне спросить вас - это 'x' 1D NumPy массив и' N' скаляр? – Divakar

+0

Вероятно, мой x - это только список, мне нужно перенести в массив 1D numpy. Большое спасибо. –

-1

Для оценки среднего и стандартного отклонения заданного набора выборок существуют инкрементные алгоритмы (std, mean), которые помогут вам снизить вычислительную нагрузку и сделать это онлайн-оценку. При вычислении медианы применяется сортировка. Вы можете приблизиться к медианной. Пусть x (t) - ваши данные в данный момент времени t, m (t), медиана времени t, m (t-1), медианное значение для e небольшое число, например. е = 0,001, чем

m(t) = m(t-1) + e, if m(t-1) < x(t)

m(t) = m(t-1) - e, if m(t-1) > x(t)

m(t) = m(t), else

Если у вас есть хороший щёток догадка срединного м (0) это хорошо работает. e следует выбирать в зависимости от диапазона значений и количества ожидаемых образцов. Например. если x = [-4 2 7,5 2], e = 0,05 было бы хорошо, если x = [1000, 3153, -586, -29], e = 10.

Смежные вопросы