Как построить подгонку кривой с байесовской регрессией с использованием определенных столбцов набора данных

#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, чтобы она соответствовала графику.