#python #matplotlib #curve-fitting #bayesian #polynomials
#python #matplotlib #подгонка кривой #байесовская #полиномы
Вопрос:
Чтобы построить байесовскую регрессию, я следую методу, найденному по адресу: «https://scikit-learn.org/stable/auto_examples/linear_model/plot_bayesian_ridge_curvefit.html «
Я не могу сопоставить данные по осям x, y с моими столбцами, а затем передать их тому def Func(x)
, который должен генерировать функции графика графика. Выходной терминал выдает:
Traceback (most recent call last):
File "/home/...../......./....py", line 26, in <module>
y_train = func(x_train) ['Low'] ##.(scale=0.1, size=size)
File "/home/....../....../......py", line 10, in func
def func(x): return (np.sin(2*np.pi*x))
TypeError: can't multiply sequence by non-int of type 'float'
В показанном коде я пытаюсь использовать данные из столбцов / таблиц для построения подогнанной байесовской регрессии; в то время как в примере «scikit» используются случайные сгенерированные числа, я не думал, что это будет большой проблемой.
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import pandas_datareader as pdr
from sklearn.linear_model import BayesianRidge
import matplotlib.dates as mdates
import datetime as dt
def func(x): return (np.sin(2*np.pi*x))
rng = pdr.get_data_yahoo('GM', start='3/14/2009', end='4/14/2016')
# Reset Index And Convert Dates Into Numerical Format
rng['Ticks'] = range(0,len(rng.index.values))
rng = rng.reset_index()
# Restructure Data Into OHLC Format
rng = rng[['High', 'Low', 'Ticks']]
print(rng.head(25))
# #############################################################################
# Generate sinusoidal data with noise
size = 25
rng = rng[['High', 'Low', 'Ticks']]
x_train = ['Ticks']##(0., 1., size) ##rng.uniform(0., 1., size)
y_train = func(x_train) ['Low'] ##.(scale=0.1, size=size)
x_test = np.linspace(0., 1., 100)
# #############################################################################
# Fit by cubic polynomial
n_order = 3
X_train = np.vander(x_train, n_order 1, increasing=True)
X_test = np.vander(x_test, n_order 1, increasing=True)
# #############################################################################
# Plot the true and predicted curves with log marginal likelihood (L)
reg = BayesianRidge(tol=1e-6, fit_intercept=False, compute_score=True)
fig, axes = plt.subplots(1, 2, figsize=(8, 4))
for i, ax in enumerate(axes):
# Bayesian ridge regression with different initial value pairs
if i == 0:
init = [1 / np.var(y_train), 1.] # Default values
elif i == 1:
init = [1., 1e-3]
reg.set_params(alpha_init=init[0], lambda_init=init[1])
reg.fit(X_train, y_train)
ymean, ystd = reg.predict(X_test, return_std=True)
ax.plot(x_test, func(x_test), color="blue", label="sin($2\pi x$)")
ax.scatter(x_train, y_train, s=50, alpha=0.5, label="observation")
ax.plot(x_test, ymean, color="red", label="predict mean")
ax.fill_between(x_test, ymean-ystd, ymean ystd,
color="pink", alpha=0.5, label="predict std")
ax.set_ylim(-1.3, 1.3)
ax.legend()
title = "$\alpha$_init$={:.2f},\ \lambda$_init$={}$".format(
init[0], init[1])
if i == 0:
title = " (Default)"
ax.set_title(title, fontsize=12)
text = "$\alpha={:.1f}$n$\lambda={:.3f}$n$L={:.1f}$".format(
reg.alpha_, reg.lambda_, reg.scores_[-1])
ax.text(0.05, -1.0, text, fontsize=12)
plt.tight_layout()
plt.show()
Комментарии:
1.
x_train = rng['Ticks']
иy_train = func(x_train) rng['Low']
если вы измените график таким образом, график выведет, что вы просто не смогли получить данные.2. Внесение изменений, упомянутых выше, вернуло эту трассировку.
Traceback (most recent call last): File "/home/inmachine/Python Progs/Bayesian2.py", line 26, in <module> y_train = func(x_train) rng['Low'] ##.(scale=0.1, size=size) File "/home/inmachine/Python Progs/Bayesian2.py", line 10, in func def func(x): return (np.sin(2*np.pi*x)) TypeError: can't multiply sequence by non-int of type 'float'
3. Ошибка, которую мы могли видеть при отладке
x_train=['Ticks']
. Это назначение списка. Я изменил это в коде, который я вернул в комментариях, и график был создан. Должен ли я опубликовать ответ один раз, хотя я могу удалить его позже?4. Это было бы высоко оценено; и наиболее полезно, поскольку я внес изменения, но это привело к обратному отслеживанию. Python 3.XXXX. Я буду следить за сообщением
Ответ №1:
попробуйте это:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import pandas_datareader as pdr
from sklearn.linear_model import BayesianRidge
import matplotlib.dates as mdates
import datetime as dt
def func(x): return (np.sin(2*np.pi*x))
rng = pdr.get_data_yahoo('GM', start='3/14/2009', end='4/14/2016')
# Reset Index And Convert Dates Into Numerical Format
rng['Ticks'] = range(0,len(rng.index.values))
rng = rng.reset_index()
# Restructure Data Into OHLC Format
rng = rng[['High', 'Low', 'Ticks']]
# print(rng.head(25))
# #############################################################################
# Generate sinusoidal data with noise
size = 25
rng = rng[['High', 'Low', 'Ticks']]
x_train = rng['Ticks']##(0., 1., size) ##rng.uniform(0., 1., size)
y_train = func(x_train) rng['Low'] ##.(scale=0.1, size=size)
x_test = np.linspace(min(x_train), max(x_train), 100)
# #############################################################################
# Fit by cubic polynomial
n_order = 3
X_train = np.vander(x_train, n_order 1, increasing=True)
X_test = np.vander(x_test, n_order 1, increasing=True)
# #############################################################################
# Plot the true and predicted curves with log marginal likelihood (L)
reg = BayesianRidge(tol=1e-6, fit_intercept=False, compute_score=True)
fig, axes = plt.subplots(1, 2, figsize=(8, 4))
for i, ax in enumerate(axes):
# Bayesian ridge regression with different initial value pairs
if i == 0:
init = [1 / np.var(y_train), 1.] # Default values
elif i == 1:
init = [1., 1e-3]
reg.set_params(alpha_init=init[0], lambda_init=init[1])
reg.fit(X_train, y_train)
ymean, ystd = reg.predict(X_test, return_std=True)
ax.plot(x_test, func(x_test), color="blue", label="sin($2\pi x$)")
ax.scatter(x_train, y_train, s=50, alpha=0.5, label="observation")
ax.plot(x_test, ymean, color="red", label="predict mean")
ax.fill_between(x_test, ymean-ystd, ymean ystd,
color="pink", alpha=0.5, label="predict std")
ax.set_ylim(-50, 50)
ax.legend()
title = "$\alpha$_init$={:.2f},\ \lambda$_init$={}$".format(
init[0], init[1])
if i == 0:
title = " (Default)"
ax.set_title(title, fontsize=12)
text = "$\alpha={:.1f}$n$\lambda={:.3f}$n$L={:.1f}$".format(
reg.alpha_, reg.lambda_, reg.scores_[-1])
ax.text(0.05, -1.0, text, fontsize=12)
plt.tight_layout()
plt.show()
Комментарии:
1. Размер ваших данных отличается от данных, указанных в комментариях. Например, если вы измените его на
ax.set_ylim(-50, 50)
, будет отображаться диаграмма рассеяния, но вы должны снова проверить диапазон оси y.2.
x_test = np.linspace(min(x_train), max(x_train), 100)
Ось x также необходимо исправить, а код и графики обновить.3. Свечи Plotly были бы хорошей ссылкой для этого ; Я не уверен насчет 3D.
4. Я не знаком с байесовской регрессией, но в категории AI есть официальный образец. Удачи!
5. 1.. 1 За ваше время и помощь. Что вы можете предложить, чтобы получить x_test / синюю линию в 0, чтобы она соответствовала графику.