Линия наилучшего соответствия для нелинейной регрессии [дубликат]

Вот простой иллюстративный пример того, как свойства двойного подчеркивания могут влиять на унаследованный класс. Итак, со следующей настройкой:

class parent(object):
    __default = "parent"
    def __init__(self, name=None):
        self.default = name or self.__default

    @property
    def default(self):
        return self.__default

    @default.setter
    def default(self, value):
        self.__default = value


class child(parent):
    __default = "child"

, если вы затем создадите дочерний экземпляр в REPL python, вы увидите ниже

child_a = child()
child_a.default            # 'parent'
child_a._child__default    # 'child'
child_a._parent__default   # 'parent'

child_b = child("orphan")
## this will show 
child_b.default            # 'orphan'
child_a._child__default    # 'child'
child_a._parent__default   # 'orphan'

Это может быть очевидно для некоторых, но он поймал меня на страже в гораздо более сложной среде

34
задан dingo_d 5 July 2012 в 22:25
поделиться

7 ответов

Перед тем, как прочитать этот ответ, имейте в виду, что есть еще один ответ ниже, от Романа Х, который использует numpy.cumsum и МНОГО БОЛЬШИХ ФАКТОРОВ, чем этот.


Наилучший Один из распространенных способов применения среднего / скользящего среднего (или любой другой функции скользящего окна) к сигналу с помощью numpy.convolve().

def movingaverage(interval, window_size):
    window = numpy.ones(int(window_size))/float(window_size)
    return numpy.convolve(interval, window, 'same')

Здесь интервал является вашим x массив, а window_size - количество рассматриваемых образцов. Окно будет центрировано по каждому образцу, поэтому для вычисления среднего значения выборки берут образцы до и после текущего образца. Ваш код станет:

plot(x,y)
xlim(0,1000)

x_av = movingaverage(interval, r)
plot(x_av, y)

xlabel("Months since Jan 1749.")
ylabel("No. of Sun spots")
show()

Надеюсь, это поможет!

69
ответ дан heltonbiker 21 August 2018 в 21:50
поделиться
  • 1
    Здесь я получаю сообщение об ошибке: Traceback (последний последний вызов): File & quot; C: / Users / ***** / Desktop / sunspots_plot.py & quot ;, строка 18, в & lt; module & gt; x_av = movingaverage (x, 5) Файл «C: / Users / ***** / Desktop / sunspots_plot.py», строка 8, в окне moveaverage = numpy.ones (int (window_size)) / float (window_size) NameError: глобальное имя 'numpy' не определено – dingo_d 5 July 2012 в 21:57
  • 2
    Ну, это означает, что вы не импортировали numpy. Фактически, вы импортировали из него только некоторые функции: linspace и loadtxt. Вы должны добавить ones и convolve к этому: o) – heltonbiker 5 July 2012 в 22:04
  • 3
    Я отредактировал мой код, и теперь у меня есть изображение, но среднее значение находится только на последней части графика, должен ли я вручную изменить интервал, чтобы отсортировать это? – dingo_d 5 July 2012 в 22:09
  • 4
    Проблема в том, что convolve чрезвычайно медленная. Ниже вы можете найти гораздо более быстрое решение на основе numpy.cumsum () . – Roman Kh 21 December 2015 в 03:13
  • 5
    Я нахожу, что это решение работает очень хорошо, но не работает по краям данных. Он добавляет ложные низкие значения. – Lee 9 August 2016 в 15:58

Скользящее среднее - это свертка, а numpy будет быстрее, чем большинство операций чистого python. Это даст вам 10-точечную скользящую среднюю.

import numpy as np
smoothed = np.convolve(data, np.ones(10)/10)

Я также настоятельно рекомендую использовать большой пакет pandas, если вы работаете с данными таймсеристов. Есть несколько хороших операций скользящей средней, построенных в .

22
ответ дан Andy Hayden 21 August 2018 в 21:50
поделиться
  • 1
    Я получаю сообщение об ошибке: Traceback (последний последний вызов): файл «C: / Users / ***** / Desktop / sunspots_plot.py», строка 7, в & lt; module & gt; smoothed = np.convolve (данные, np.ones (10) / (10)) Файл C: \ Python26 \ lib \ site-packages\numpy \ core\numeric.py & quot ;, строка 787, в convolve return multiarray. корреляция (a, v [:: - 1], режим) ValueError: объект слишком глубокий для желаемого массива – dingo_d 5 July 2012 в 21:49
  • 2
    – reptilicus 6 July 2012 в 15:55
  • 3
  • 4
    @reptilicus, это, кажется, классно, но похоже, что это не улучшает аналогичную проблему, которая у меня есть, и я был бы признателен, если бы вы могли взглянуть на это. [Д0] stackoverflow.com/questions/45839123/… – Desta Haileselassie Hagos 23 August 2017 в 12:01

Я думаю, что-то вроде:

aves = [sum(data[i:i+6]) for i in range(0, len(data), 5)]

Но мне всегда нужно дважды проверять, что индексы делают то, что я ожидаю. Диапазон, который вы хотите (0, 5, 10, ...) и данные [0: 6], предоставят вам данные [0] ... данные [5]

ETA: oops, и вы Конечно, хотите аве, а не суммировать. Так что, фактически, используя ваш код и формулу:

r = 5
x = data[:,0]
y1 = data[:,1]
y2 = [ave(y1[i-r:i+r]) for i in range(r, len(y1), 2*r)]
y = [y1, y2]
0
ответ дан dreadsci 21 August 2018 в 21:50
поделиться
  • 1
    С этим я получаю кучу массивов, и у меня возникают ошибки, когда я пытаюсь построить их: \ – dingo_d 5 July 2012 в 21:36
  • 2
    Извините, не исправил опечатку, должен быть y1 [i-r: i + r] вместо данных – dreadsci 5 July 2012 в 21:41
  • 3
    И вообще, y1 имеет len (y1) точки, а y2 имеет len (y1) / 2r точки, поэтому ... вы хотите добавить их отдельно к графику. Пойдите с свернутыми решениями вместо этого! – dreadsci 5 July 2012 в 21:46
  • 4
    Опять же, для y2 я получаю, что они [массив [число, число], массив [число, число] ...]: \ Мне нужно получить числа для построения: \ – dingo_d 5 July 2012 в 21:58

Функция Moving Average без функции numpy:

from __future__ import division  # must be on first line of script

class Solution:
    def Moving_Avg(self,A):
        m = A[0]
        B = []
        B.append(m)
        for i in range(1,len(A)):
            m = (m * i + A[i])/(i+1)
            B.append(m)
        return B
1
ответ дан eestrada 21 August 2018 в 21:50
поделиться
  • 1
    Извините, что добавить первую строку: из future . В противном случае вывод будет int вместо float – Armanda_An 23 December 2015 в 23:09
  • 2
    @Arnanda_An. Вы можете заставить float-деление в Python 2 использовать десятичную точку в 1: m = (m * i + A[i])/(i+1.) – Bennett Brown 2 August 2017 в 14:38

Существует проблема с принятым ответом. Я думаю, что здесь нужно использовать «valid» вместо «same» здесь return numpy.convolve(interval, window, 'same').

В качестве примера попробуйте MA этого набора данных = [1,5,7,2,6,7,8,2,2,7,8,3,7,3,7,3,15,6] - результат должен быть [4.2,5.4,6.0,5.0,5.0,5.2,5.4,4.4,5.4,5.6,5.6,4.6,7.0,6.8], но с «одинаковым» дает неверный вывод [2.6,3.0,4.2,5.4,6.0,5.0,5.0,5.2,5.4,4.4,5.4,5.6,5.6, 4.6,7.0,6.8,6.2,4.8]

кода Rusty, чтобы попробовать это: -

result=[]
dataset=[1,5,7,2,6,7,8,2,2,7,8,3,7,3,7,3,15,6]
window_size=5
for index in xrange(len(dataset)):
    if index <=len(dataset)-window_size :
        tmp=(dataset[index]+ dataset[index+1]+ dataset[index+2]+ dataset[index+3]+ dataset[index+4])/5.0
        result.append(tmp)
    else:
      pass

result==movingaverage(y, window_size) 

Попробуйте это с действительным & amp; то же самое и посмотреть, имеет ли смысл математика.

См. также:: http://sentdex.com/sentiment-analysisbig-data-and-python-tutorials-algorithmic-trading/how-to-chart-stocks-and-forex- делать-своего собственного финансово-графиков / вычислить-простой-скользящего среднего-сма-питон /

4
ответ дан ekta 21 August 2018 в 21:50
поделиться
  • 1
    Не пробовал это, но я загляну в него, прошло какое-то время, так как я закодирован на Python. – dingo_d 29 October 2014 в 08:07
  • 2
    @dingo_d Почему бы вам не попробовать это с помощью ржавого кода (и образец данных (как простой список), я опубликовал? Для некоторых ленивых людей (например, я был первым) - это маскирует факт что скользящее среднее неверно. Вероятно, вам стоит рассмотреть вопрос об изменении исходного ответа. Я попробовал его только вчера, и двойная проверка спасла меня от плохого представления отчета до уровня Cxo. Все, что вам нужно сделать, - попытаться выполнить одно и то же скользящее среднее раз с «действительный» и другое время с «одинаковым» - и как только вы убедитесь, что дайте мне немного любви (ака-голос) – ekta 29 October 2014 в 08:16
  • 3
    Я сейчас работаю, поэтому у меня нет доступа к Python, но когда я дома, я попробую :) – dingo_d 29 October 2014 в 08:25
  • 4
    Мне жаль, что я не вернулся к вам, я не мог заставить Python работать на моем компьютере, поэтому я забыл об этом. Я установил его снова, и я попытался поместить 'valid' в convolve и получил ошибку ValueError: x and y must have same first dimension. Я проверил длину моего массива, и они были такими же. Я даже сделал x = numpy.array(data[:,0]) y = numpy.array(data[:,1]), но у меня все еще была такая же ошибка. – dingo_d 29 August 2015 в 13:07

Поскольку numpy.convolve довольно медленный, тем, кто нуждается в быстродействующем решении, может быть проще понять подход cumsum . Вот код:

cumsum_vec = numpy.cumsum(numpy.insert(data, 0, 0)) 
ma_vec = (cumsum_vec[window_width:] - cumsum_vec[:-window_width]) / window_width

, где data содержит ваши данные, а ma_vec будет содержать скользящие средние window_width длина

В среднем, cumsum примерно в 30-40 раз быстрее, чем свертывает .

37
ответ дан Roman Kh 21 August 2018 в 21:50
поделиться
  • 1
    Я думаю, что если бы сегодня я должен был выполнить автономную скользящую среднюю, я бы использовал ваше решение с самого начала, а не свернулось. На самом деле я удивлен, что этот ответ не получил намного больше оборотов ... – heltonbiker 9 August 2016 в 17:13
  • 2
    где параметр «шаг»? – Petr Fedosov 11 August 2016 в 17:03
  • 3
    @ roman-kh, я был бы признателен, если бы вы могли взглянуть на это и поблагодарить. [Д0] stackoverflow.com/questions/45839123/… – Desta Haileselassie Hagos 23 August 2017 в 12:17
ravgs = [sum(data[i:i+5])/5. for i in range(len(data)-4)]

Это не самый эффективный подход, но он даст вам ответ, и я не знаю, будет ли ваше окно 5 баллов или 10. Если его 10, замените каждый 5 на 10 и 4 на 9.

4
ответ дан sizzzzlerz 21 August 2018 в 21:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: