機会学習初心者です。
現在Jupyter Notebookで数学の基礎の部分に取り組んでおり、ガウス関数のグラフを書こうとしています。
与えられたサンプルコード(下に記載)のとおり入力してもValueErrorが出てしまいます。
実行環境は
Python 3.7.6
notebook 6.0.3
です。
コードが悪いのか実行環境に問題があるのかを教えていただけますでしょうか。
発生している問題・エラーメッセージ
エラーメッセージ ValueError Traceback (most recent call last) <ipython-input-4-074e12a40b6e> in <module> 35 Fig = plt.figure(1, figsize=(7, 3)) 36 Fig.add_subplot(1, 2, 1) ---> 37 show_contour_gauss(mu, sigma) 38 plt.xlim(X_range0) 39 plt.ylim(X_range1) <ipython-input-4-074e12a40b6e> in show_contour_gauss(mu, sig) 9 x1 = np.linspace(X_range1[0], X_range1[1], xn) 10 xx0, xx1 = np.meshgrid(x0, x1) ---> 11 x = np.c_[np.reshape(xx0, xn * xn, 1), np.reshape(xx1, xn * xn, 1)] 12 f = gauss(x, mu, sig) 13 f = f.reshape(xn, xn) <__array_function__ internals> in reshape(*args, **kwargs) C:\Anaconda3\lib\site-packages\numpy\core\fromnumeric.py in reshape(a, newshape, order) 299 [5, 6]]) 300 """ --> 301 return _wrapfunc(a, 'reshape', newshape, order=order) 302 303 C:\Anaconda3\lib\site-packages\numpy\core\fromnumeric.py in _wrapfunc(obj, method, *args, **kwds) 59 60 try: ---> 61 return bound(*args, **kwds) 62 except TypeError: 63 # A TypeError occurs if the object does have such a method in its ValueError: Non-string object detected for the array ordering. Please pass in 'C', 'F', 'A', or 'K' instead ### 該当のソースコード ```Python 3.7.6 ###ソースコード # リスト 4-5-(1) import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import axes3d %matplotlib inline # ガウス関数 def gauss(x, mu, sigma): N, D = x.shape c1 = 1 / (2 * np.pi)**(D / 2) c2 = 1 / (np.linalg.det(sigma)**(1 / 2)) inv_sigma = np.linalg.inv(sigma) c3 = x - mu c4 = np.dot(c3, inv_sigma) c5 = np.zeros(N) for d in range(D): c5 = c5 + c4[:, d] * c3[:, d] p = c1 * c2 * np.exp(-c5 / 2) return p # リスト 4-5-(2) x = np.array([[1, 2], [2, 1], [3, 4]]) mu = np.array([1, 2]) sigma = np.array([[1, 0], [0, 1]]) print(gauss(x, mu, sigma)) **リスト(1) ~ (2)までの実行結果** [0.15915494 0.05854983 0.00291502]
リスト 4-5-(3)
X_range0=[-3, 3]
X_range1=[-3, 3]
等高線表示 --------------------------------
def show_contour_gauss(mu, sig):
xn = 40 # 等高線表示の解像度
x0 = np.linspace(X_range0[0], X_range0[1], xn)
x1 = np.linspace(X_range1[0], X_range1[1], xn)
xx0, xx1 = np.meshgrid(x0, x1)
x = np.c_[np.reshape(xx0, xn * xn, 1), np.reshape(xx1, xn * xn, 1)]
f = gauss(x, mu, sig)
f = f.reshape(xn, xn)
f = f.T
cont = plt.contour(xx0, xx1, f, 15, colors='k')
plt.grid(True)
3D 表示 ----------------------------------
def show3d_gauss(ax, mu, sig):
xn = 40 # 等高線表示の解像度
x0 = np.linspace(X_range0[0], X_range0[1], xn)
x1 = np.linspace(X_range1[0], X_range1[1], xn)
xx0, xx1 = np.meshgrid(x0, x1)
x = np.c_[np.reshape(xx0, xn * xn, 1), np.reshape(xx1, xn * xn, 1)]
f = gauss(x, mu, sig)
f = f.reshape(xn, xn)
f = f.T
ax.plot_surface(xx0, xx1, f,
rstride=2, cstride=2, alpha=0.3,
color='blue', edgecolor='black')
メイン -----------------------------------
mu = np.array([1, 0.5]) # (A)
sigma = np.array([[2, 1], [1, 1]]) # (B)
Fig = plt.figure(1, figsize=(7, 3))
Fig.add_subplot(1, 2, 1)
show_contour_gauss(mu, sigma)
plt.xlim(X_range0)
plt.ylim(X_range1)
plt.xlabel('$x_0$', fontsize=14)
plt.ylabel('$x_1$', fontsize=14)
Ax = Fig.add_subplot(1, 2, 2, projection='3d')
show3d_gauss(Ax, mu, sigma)
Ax.set_zticks([0.05, 0.10])
Ax.set_xlabel('$x_0$', fontsize=14)
Ax.set_ylabel('$x_1$', fontsize=14)
Ax.view_init(40, -100)
plt.show()
### 試したこと anacondaに入っているnumpyを1.18.1に更新 リスト4-5-(3)を実行するとエラーが出ます。 ### 補足情報(扱う数式) ガウス関数の式は **x** = [x_0, x_1] y = a * exp[-(1/2)*{(**x**-**µ**)^T}*{**Σ**^-1(**x**-**µ**)}] パラメータ **µ** = [µ_0, µ_1] **Σ** = [[σ^2_0 σ_01], [σ_01 σ^2_1]] (共分散行列) a = (1/2π)*{1/Σ^(1/2)} 以上の式における **µ** = [1, 0.5], **Σ** = [[2 1], [1 1]] の時の示すグラフの描写を目指しています
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/09 13:10