Parts_of_Code
Python 版
行頭に # があれば,その行は実行しない
ヘッダー(numpy と matplotlib を使う.わからなければ,おまじないと思えばよい)
code:header
import numpy as np
import matplotlib.pyplot as plt
乱数の生成
code:random_number_generator
seed = 20220720 # any nunmber
rng = np.random.default_rng(seed) # 乱数の種を設定
# rng = np.random.default_rng() # 種を固定せず.
mu = 0 # 平均
sigma = 1.0 # 標準偏差
N = 1000
s = rng.normal(mu, sigma, N) # 正規分布: 平均mu, 標準偏差sigma, N個のデータを生成
# s = rng.uniform(0, 1, N) # 一様分布, 0 から 1まで (1を含まない) , N個のデータを生成
# s = rng.uniform() # 一様分布にしたがう乱数を1つ生成
print(s) # 確認
配列の生成
code:np_array
# x = np.zeros(3)
# y = np.ones((3, 4)) # たて 3 x よこ 4
N=100
x = np.full(N,0) # x0からxN-1 を生成, 値 0 で初期化 S = np.full( (N,2), 0) # 2次元配列の生成.S00 から SN-11 まで. # z = np.ones((3, 4)) # 配列の添字として使うには int 型にしておく必要がある
# print(z.dtype) # float64
# z = z.astype(int) # int64
繰り返し for 文の例
code:for
for i in range(5): # 0 1 2 3 4
print(i)
降順を生成する for 文の例
code:for2
for i in range(5,2,-1): # 5 4 3
print(i)
if文の例
code:if
import numpy as np
rng = np.random.default_rng()
x = rng.integers(0, 100)
if x > 50:
print("%d is larger than 50" %(x) )
elif x<50: # elif とは else if のこと
print("%d is less than 50" %(x) )
else:
print("x=50 !")
遷移行列
code:transition
P = np.array(0.99, 0.01],[0.03,0.97)
logP = np.log(P)
print(P) # 0.99 0.01] [0.03 0.97
print(logP) # -0.01005034 -4.60517019] [-3.5065579 -0.03045921
違いを測る
code:distance
import numpy as np
rng = np.random.default_rng()
N = 10
x = rng.integers(0, 2, N)
y = rng.integers(0, 2, N)
d = sum( abs(x-y) )
print(x)
print(y)
print(d)
結果の表示.プロット
code:plot
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng()
N = 200
x = rng.integers(0, 2, N)
n = rng.normal(0, 0.7, N)
y = x+n
z = rng.integers(0, 2, N)
fig=plt.figure(0)
t = range(N)
plt.plot(t, x, 'b', label='$x$')
plt.plot(t, y, '.g', label='$y$') # g は緑色, . は点
plt.plot(t, z+3, 'r', label='$z$')
plt.title('TITLE HERE')
plt.xlabel('$t$', fontsize=14, color='black') # X 軸
plt.ylabel('$x$, $y$') # Y 軸
plt.legend(loc='lower left',title_fontsize=12) # 描画
plt.show() # 描画
fig.savefig('fig_hmm214.pdf')
https://gyazo.com/8541540356dc8163ddaf7ed26c7fa6e0https://gyazo.com/4bf6d315db56bb5032fb802be6e2ff9e
まずは全体の流れを日本語で書いてみる
code:000
import numpy as np
import matplotlib.pyplot as plt
# 問題作成 (200 個の観測データを生成)
# 復元
# 結果の表示
テスト用(バグがないことを保証するわけではない)
code:testing
import numpy as np
N = 200
m = 20 # m test cases
ys = np.zeros( (m, N) ) # ys は y の m=20例
zs = np.zeros( (m, N) ) # z should be xmap when your code works correctly.
xmap = np.zeros( N )
# テストデータ読み込み
i = 0
for line in open("r20190702_20_test_cases", "r"):
continue
data = line.split() # 文字列を空白文字を区切りに分割
for a in range(0,m):
i=i+1
# データ読み込み終了
ys = np.array(ys)
zs = np.array(zs,dtype='int')
# zski k番目のテストケース. k=0,...,m-1, i=0,...,199 k = 0
#
#
# この部分に 『xmap を計算するコード』 を書く
#
#
d = sum( abs(xmap-z) )
if d != 0:
print(d,":" , "not passed")
else:
print("passed",k,"-th test case")
スライシングの例
code:slicing
import numpy as np
x = np.array( 1, 2, 3, 4], [5, 6, 7, 8 ) # 2 x 4 (たて x よこ) 行列
print (x0,1:3) # 2 3 x の0行目 要素1番から3(を含まず)まで https://gyazo.com/3f0502734cfa85f859a78a29fee8876d
https://gyazo.com/c4c1ad3e0af0b77fe2065aefd4f2f899