1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

最適化の前に3次元のグラフの書き方

Last updated at Posted at 2020-08-30

##DEAPにある最適化アルゴリズムのグラフの書き方です。

最適化の前に3次元のグラフの書き方です。

まず、どんな3次元のグラフが描きたいかと言うと、DEAPという遺伝的アルゴリズムのライブラリーにある評価関数です。
多目的最適化を検討したいので、どうしても3次元のグラフ描いた方がわかりやすそうなので、まずは3次元のグラフの書き方です。

最適化の評価関数はこの辺を参照してください。
DEAP 1.3.1ドキュメント
だれでも分かる多目的最適化問題超入門

三次元のグラフを描くためには、まず、X1、x2の2つの軸で、メッシュ状に点をつくる。
その点に、z軸の値を計算する。
x1、x2、Zの値をAxes3Dで3次元のグラフを描きます。

###1)メッシュ状の点を作る。
1:numpyarange関数で、等間隔の数値を作る。
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次元の散布図を描いてみると、次のようになりました。
scatter_Figure 2020-08-30 161126.png

ちゃんとメッシュになっています。
次に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でプロットすると、次のようなグラフになります。
x1_z_Figure 2020-08-30 162742.png

###2)3次元のグラフを作る

4:3次元のグラフを描きます。
from mpl_toolkits.mplot3d import Axes3Dで3次元のグラフを描くライブラリーをインポートします。
ax.plot_wireframe(X1, X2, Z)で、3次元のグラフになります。

plot_surface:面で表示されます。
surfaceFigure 2020-08-30 163457.png

plot_wireframe:ワイヤーフレームで表示されます。
wireflameFigure 2020-08-30 163108.png

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()
1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?