Как построить прогнозные данные регрессии на трехмерном контурном графике? - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь представить прогнозные средние данные из регрессии гауссовского процесса в трехмерный контур. Я следил за построением трехмерного контура из изображения с использованием экстента с Matplotlib и Пример кода mplot3d: contour3d_demo3.py потоков. Вот мой код:

import numpy as np
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
from matplotlib import cm

x_train = np.array([[0,0],[2,2],[3,3]])
y_train = np.array([[200,321,417]])

xvalues = np.array([0,1,2,3])
yvalues = np.array([0,1,2,3])

a,b = np.meshgrid(xvalues,yvalues)
positions = np.vstack([a.ravel(), b.ravel()])
x_test = (np.array(positions)).T

kernel = C(1.0, (1e-3, 1e3)) * RBF(10)

gp = GaussianProcessRegressor(kernel=kernel)

gp.fit(x_train, y_train)

y_pred_test = gp.predict(x_test)

fig = plt.figure()
ax = fig.add_subplot(projection = '3d')
x=y=np.arange(0,3,1)
X, Y = np.meshgrid(x,y)
Z = y_pred_test
cset = ax.contour(X, Y, Z, cmap=cm.coolwarm)
ax.clabel(cset, fontsize=9, inline=1)
plt.show()

После запуска приведенного выше кода на консоли появляется следующая ошибка:

enter image description here

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

enter image description here

Что не так с моим кодом?

Спасибо!

1 Ответ

0 голосов
/ 11 мая 2018

Конкретная ошибка, о которой вы упомянули, связана с вашим y_train, который может быть опечаткой.Это должно быть:

y_train_: в виде массива, shape = (n_samples, [n_output_dims])

Согласно вашему x_train, у вас есть 3 образца.Таким образом, ваша y_train должна иметь форму (3, 1), а не (1, 3).

У вас также есть другие ошибки в части построения:

  1. add_subplot должна иметь позицию передprojection = '3d'.
  2. Z должен иметь ту же форму, что и X и Y для контурного графика.
  3. Из-за 2 ваши x и y должны совпадатьxvalues и yvalues.

В совокупности вам может потребоваться внести следующие изменения:

...

y_train = np.array([200,321,417])

...

ax = fig.add_subplot(111, projection = '3d')
x=y=np.arange(0,4,1)
...
Z = y_pred_test.reshape(X.shape)

...

Просто упомянуть две вещи:

  1. График, который вы получите после этих изменений, не будет соответствовать показанной вами цифре.Фигура в вашем вопросе - это поверхностный график, а не контурный график.Вы можете использовать ax.plot_surface, чтобы получить этот тип графика.

  2. Я думаю, вы уже знаете это.Но на всякий случай, ваш график не будет таким же гладким, как ваш примерный график, так как ваш np.meshgrid редкий.

...