##DEAPにある最適化アルゴリズムのグラフの書き方です。
最適化の前に3次元のグラフの書き方です。
まず、どんな3次元のグラフが描きたいかと言うと、DEAPという遺伝的アルゴリズムのライブラリーにある評価関数です。
多目的最適化を検討したいので、どうしても3次元のグラフ描いた方がわかりやすそうなので、まずは3次元のグラフの書き方です。
最適化の評価関数はこの辺を参照してください。
DEAP 1.3.1ドキュメント
だれでも分かる多目的最適化問題超入門
三次元のグラフを描くためには、まず、X1、x2の2つの軸で、メッシュ状に点をつくる。
その点に、z軸の値を計算する。
x1、x2、Zの値をAxes3Dで3次元のグラフを描きます。
###1)メッシュ状の点を作る。
1:numpy
のarange
関数で、等間隔の数値を作る。
np.arange(-30,30,1)
a-30から30まで、1ずつ間を空けた数値ができます。
2:meshgrid(a,b)
で一次元配列のa,bの交点に格子点が得られ、それをX1,X2に入れます。
#メッシュの作り方
import numpy as np
a = np.arange(-30,30,1)
b = np.arange(-30,30,1)
print(a)
#[-30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13
# -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5
# 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
# 24 25 26 27 28 29]
print(b)
#[-30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13
# -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5
# 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
# 24 25 26 27 28 29]
X1, x2 = np.meshgrid(a, b)
print(X1)
#[[-30 -29 -28 ... 27 28 29]
# [-30 -29 -28 ... 27 28 29]
# [-30 -29 -28 ... 27 28 29]
# ...
# [-30 -29 -28 ... 27 28 29]
# [-30 -29 -28 ... 27 28 29]
# [-30 -29 -28 ... 27 28 29]]
print(X2)
#[[-30 -29 -28 ... 27 28 29]
# [-30 -29 -28 ... 27 28 29]
# [-30 -29 -28 ... 27 28 29]
# ...
# [-30 -29 -28 ... 27 28 29]
# [-30 -29 -28 ... 27 28 29]
# [-30 -29 -28 ... 27 28 29]]
import matplotlib.pyplot as plt
plt.scatter(X1,X2,s=1)
plt.show()
確認のために、X1,X2の2次元の散布図を描いてみると、次のようになりました。
ちゃんとメッシュになっています。
次にZ軸の値を計算して、3次元のグラフを作ります。
3:Zは、Ackley関数なるものを計算しました。
数式
{f(x_{1}, x_{2})=20-20\exp \biggl( -0.2\sqrt{\frac{1}{n}\sum_{i=1}^{n}x_{i}^2} \biggr) +e-\exp \biggl(\frac{1}{n}\sum_{i=1}^{n}\cos(2\pi x_{i}) \biggr)
}
とりあず、X1,Zでプロットすると、次のようなグラフになります。
###2)3次元のグラフを作る
4:3次元のグラフを描きます。
from mpl_toolkits.mplot3d import Axes3D
で3次元のグラフを描くライブラリーをインポートします。
ax.plot_wireframe(X1, X2, Z)
で、3次元のグラフになります。
plot_wireframe
:ワイヤーフレームで表示されます。
Z =20 - 20 * np.exp(-0.2 * np.sqrt((X1 ** 2 + X2 ** 2) / 2)) + np.exp(1) - np.exp((np.cos(2 * np.pi * X1) + np.cos(2 * np.pi * X2)) / 2)
plt.scatter(X1,Z,s=1)
plt.show()
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)
#ワイヤーフレームで表示
ax.plot_wireframe(X1, X2, Z)
#面で表示
#ax.plot_surface(X1, X2, Z, rstride=1, cstride=1, cmap='hsv')
plt.show()