Ошибка типа: невозможно умножить последовательность на не-int типа 'numpy.float64' при попытке решить полином 2-й степени - PullRequest
1 голос
/ 28 апреля 2019

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

Ранее я задавал почти такой же вопрос, и проблем не было, поэтому я немного застрял в том, почему это не работает.Сообщение об ошибке гласит:

y1 = p [0] * x + p [1] Ошибка типа: не может умножить последовательность на не-int типа 'numpy.float64' '

Мне кажется, я понимаю, что появляется это сообщение об ошибке, потому что ему не нравится [], но это то, как я делал это раньше, так что я не знаю?Я немного поэкспериментировал с уравнением, чтобы попытаться заставить его работать, но ничто не делает его правильным.

x=(0.0,0.45,0.89,1.34,1.79,2.24,2.69,3.14,3.59,4.04,4.49,4.94,5.39,5.83,6.28) 
y=(0.36,0.30,0.311,0.09,0.51,0.55,1.10,1.11,1.45,1.74,2.30,2.52,3.26,3.69,4.12)
r,s=st.pearsonr(x,y)
print'The Pearson Correlation Coefficient of this polynomial is',r
p=np.polyfit(x,y,2)
y1=p[0]*x+p[1]
plt.plot(x,y1,'-r')
plt.plot(x,y,'o')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Polynomial')
plt.show()

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

Ответы [ 2 ]

1 голос
/ 28 апреля 2019

Есть две проблемы с вашим подходом:

  • Вы используете (и также хотите) подгонку второго порядка, но вычисляете линейную подгонку по коэффициентам.
  • Ваши значения x и y являются кортежами, которые нельзя умножить на числа с плавающей точкой. Вы можете умножить их на целые числа, но это будет повторять кортеж целое число раз. Это не то, что вы хотите.

Одним из решений является преобразование ваших значений x и y в массив NumPy, который позволяет векторизовать операцию, а затем использовать уравнение второго порядка для вычисления y1. Ниже приведен полный ответ.


import numpy as np
import matplotlib.pyplot as plt

x = np.array([0.0,0.45,0.89,1.34,1.79,2.24,2.69,3.14,3.59,4.04,4.49,4.94,5.39,5.83,6.28]) 
y = np.array([0.36,0.30,0.311,0.09,0.51,0.55,1.10,1.11,1.45,1.74,2.30,2.52,3.26,3.69,4.12])

p = np.polyfit(x,y,2)
y1 = p[0]*x**2+p[1]*x+p[2]
plt.plot(x,y1,'-r')
plt.plot(x,y,'o')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Polynomial')

enter image description here

Лучшая альтернатива - использовать poly1d для создания полинома из коэффициентов. Это позволяет избежать ручной записи всего уравнения. Затем вы можете использовать его для оценки полинома для заданных значений x как

p = np.poly1d(np.polyfit(x,y,2))
y1 = p(x)
0 голосов
/ 28 апреля 2019

Проблема в выражении p[0]*x Типы аргументов этого выражения - float и tuple (sequence) соответственно.Не существует операции умножения, соответствующей этим аргументам.Наиболее близким совпадением является умножение последовательности на целое число (что создает новую, более длинную последовательность).Это причина ошибки, которую вы видите.

Возможно, вы захотите использовать массив numpy.Умножение массива numy на число с плавающей точкой умножает каждый элемент.Пример:

x = np.array([1, 2, 3])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...