matplotlib.pyplot, ошибка функции разброса с использованием оси - PullRequest
0 голосов
/ 26 мая 2020

(работает в Jupyter Notebooks)

Итак, когда я использую приведенный ниже код, я могу построить поверхность без ошибок:

# batch gradient descent setup
xInitialValue = 1.8
yInitialValue = 1.0
xyValuesArray = gradientDescent(xInitialValue, yInitialValue, xPartialDerivative, yPartialDerivative)


# plot gradient descent algorithm


# fig is a figure object (container) that holds data to represent the chart
fig = pyplot.figure(figsize = [15, 10])


# axis is a variable that holds the axis for 3D representation
# gca = get current axis
# axis -> x, y and z
axis = fig.gca(projection = '3d')
axis.plot_surface(xAxisValues,
                  yAxisValues,
                  costFunction(xAxisValues, yAxisValues),
                  cmap = colorMap.coolwarm,
                  alpha = 0.4)


# set the axis labels
axis.set_xlabel('x', fontsize = 21)
axis.set_ylabel('y', fontsize = 21)
axis.set_zlabel('z = costFunction(x, y)', fontsize = 21)


# show
pyplot.show()


Однако, когда я пытаюсь построить несколько точек на той же диаграмме, я получаю сообщение об ошибке:

# batch gradient descent setup
xInitialValue = 1.8
yInitialValue = 1.0
xyValuesArray = gradientDescent(xInitialValue, yInitialValue, xPartialDerivative, yPartialDerivative)


# plot gradient descent algorithm


# fig is a figure object (container) that holds data to represent the chart
fig = pyplot.figure(figsize = [15, 10])


# axis is a variable that holds the axis for 3D representation
# gca = get current axis
# axis -> x, y and z
axis = fig.gca(projection = '3d')
axis.plot_surface(xAxisValues,
                  yAxisValues,
                  costFunction(xAxisValues, yAxisValues),
                  cmap = colorMap.coolwarm,
                  alpha = 0.4)
axis.scatter(xyValuesArray[:, 0],
             xyValuesArray[:, 1],
             costFunction(xyValuesArray[:, 0], xyValuesArray[:, 1]),
             s=50,
             color='red')


# set the axis labels
axis.set_xlabel('x', fontsize = 21)
axis.set_ylabel('y', fontsize = 21)
axis.set_zlabel('z = costFunction(x, y)', fontsize = 21)


# show
pyplot.show()


Ошибка следующая:

ValueError: Invalid RGBA argument: masked_array(data=[1.0, 0.0, 0.0, 1.0],
             mask=False,
       fill_value='?',
            dtype=object)

<Figure size 1080x720 with 1 Axes>


Что я делаю не так?

Заранее спасибо!

Если требуется больше контекста, я был бы рад предоставить это :)

1 Ответ

0 голосов
/ 28 мая 2020

Покопавшись в Stack Overflow, я нашел ответ, который решил мою проблему: в этой ссылке .

По-видимому, в моей среде есть проблема (Ubuntu 18.04) , в результате чего типы данных, числа с плавающей запятой, внутри моего xyValuesArray отличаются от значений, возвращаемых из моей costFunction (в конечном итоге они являются разными типами с плавающей запятой).

xyValuesArray - это numpy .array, а значения внутри он вычисляется через sympy, используя diff (), а затем evalf (). CostFunction возвращает "нормальные" python данные. Я добавил эти модули в тег, так как проблема может быть там; Если у кого-то есть лучшее объяснение проблемы, я бы с удовольствием его прочитал :)

Если я добавлю следующие строки кода, сделав тип данных float одинаковым в трех разных списках, тогда все будет хорошо в мире:

# format data, so that the data type inside all three different is the same
x = [float(i) for i in xyValuesArray[:, 0]]
y = [float(i) for i in xyValuesArray[:, 1]]
z = [float(i) for i in costFunction(xyValuesArray[:, 0], xyValuesArray[:, 1])]


# scatter function
axis.scatter(x, y, z, s=50, color='red')


Моя удивительная диаграмма:

chart.png

...