Как сопоставить отрицательные данные с линейной регрессией? - PullRequest
0 голосов
/ 10 февраля 2019

Я хочу уместить мои данные и извлечь их откосы.Я использую линейную регрессию.Мои данные представляют собой набор значений смещения часов, которые содержат отрицательные значения.Это мой код:

from scipy import stats
import scipy
import matplotlib.pyplot as plt
plt.style.use('ggplot')
x= [1549808191, 1549808192, 1549808196, 1549808201, 1549808202, 1549808206, 1549808207, 1549808214, 1549808215, 1549808221, 1549808226, 1549808267, 1549808272, 1549808290, 1549808304, 1549808315, 1549808324, 1549808332, 1549808355, 1549808395, 1549808396]
y= ['7', '0', '0', '0', '-2', '4', '-3', '2', '0', '-1', '0', '-2', '-1', '-1','2', '-2', '1', '0', '0', '-1', '-2']
print(x)
print(y)
plt.plot(x,y,'o-')
plt.show()
slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(x, y)
print(slope)

enter image description here Тем не менее, это дает мне эту ошибку:

    ret = umr_sum(arr, axis, dtype, out, keepdims)
TypeError: cannot perform reduce with flexible type

Итак, как решить эту ошибку, пожалуйста?Является ли линейная регрессия лучшим способом извлечения подходящих параметров с такими данными?

Ответы [ 4 ]

0 голосов
/ 10 февраля 2019

Проблема, похоже, исходит от scipy.stats.linregress(x, y), где вы выполняете подбор, потому что ваши значения y являются строками.Вы можете преобразовать их в целочисленный тип, используя map, и все будет работать как положено

# import commands here 
plt.style.use('ggplot')
x= [1549808191, 1549808192, 1549808196, 1549808201, 1549808202, 1549808206, 1549808207, 1549808214, 1549808215, 1549808221, 1549808226, 1549808267, 1549808272, 1549808290, 1549808304, 1549808315, 1549808324, 1549808332, 1549808355, 1549808395, 1549808396]
y= ['7', '0', '0', '0', '-2', '4', '-3', '2', '0', '-1', '0', '-2', '-1', '-1','2', '-2', '1', '0', '0', '-1', '-2']

plt.plot(x,y,'o-')
plt.show()
slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(x, list(map(int, y)))
print("The slope is %s" %slope)

# The slope is -0.009607415773244879

enter image description here

0 голосов
/ 10 февраля 2019

Измените y на список чисел: y = [7, 0, 0, 0, -2, ...]

Таким образом, это работает

from scipy import stats
import scipy
import matplotlib.pyplot as plt
plt.style.use('ggplot')
x= [1549808191, 1549808192, 1549808196, 1549808201, 1549808202, 1549808206, 1549808207, 1549808214, 1549808215, 1549808221, 1549808226, 1549808267, 1549808272, 1549808290, 1549808304, 1549808315, 1549808324, 1549808332, 1549808355, 1549808395, 1549808396]
y= [1549808191, 1549808192, 1549808196, 1549808201, 1549808202, 1549808206, 1549808207, 1549808214, 1549808215, 1549808221, 1549808226, 1549808267, 1549808272, 1549808290, 1549808304, 1549808315, 1549808324, 1549808332, 1549808355, 1549808395, 1549808396]
print(y)
plt.plot(x,y,'o-')
plt.show()
slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(x, y)
print(slope)

Возвращает 1

0 голосов
/ 10 февраля 2019

Проблема и решение


Как сказано в других ответах, проблема в том, что значения Y являются строками.Частично это работает для вас, потому что matplotlib автоматически меняет ваши Y-строки на числа.Однако библиотека scipy этого не делает.Поэтому вам нужно преобразовать свой список в числа.Смотри ниже

from scipy import stats
import scipy
import matplotlib.pyplot as plt
plt.style.use('ggplot')
x= [1549808191, 1549808192, 1549808196, 1549808201, 1549808202, 1549808206, 1549808207, 1549808214, 1549808215, 1549808221, 1549808226, 1549808267, 1549808272, 1549808290, 1549808304, 1549808315, 1549808324, 1549808332, 1549808355, 1549808395, 1549808396]
y= ['7', '0', '0', '0', '-2', '4', '-3', '2', '0', '-1', '0', '-2', '-1', '-1','2', '-2', '1', '0', '0', '-1', '-2']
y = [float(i) for i in y]
print(x)
print(y)
plt.plot(x,y,'o-')
plt.show()
slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(x, y)
print(slope)
0 голосов
/ 10 февраля 2019

Похоже, у вас есть список строк.Вам нужно, чтобы ваш y имел тип integer или float для регрессии.

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