Python ガウス基底関数フィッティング
線形基底関数モデル厳密解
ここまでで、ガウス基底関数モデルの定義の一部の設定が完了しました。
引き続き
ガウス基底関数モデル厳密解
def fit_gauss_func(x, t, m)
を定義します。
ここでは
W0~
W4
を求めます。
各 x に対応する値が t です。
また m はガウス関数の数です。
以下に厳密解を求める手順を示します。
- 分布の中央値の決定
ガウス曲線の分布の位置(中央値)「μ」を決定します。
m の数だけ分布の中央値を決定します。
x1 = len(x) - 1
mu = np.linspace(0, x1, m)
第一引数 start に最初の値、ここでは 0
第二引数 stop に最後の値、ここでは x1 = 30
第三引数 m に要素数、ここでは m = 4
が指定されます。
そして、それらに応じた間隔(公差)が自動的に mu として算出されます。 - ガウス関数の中心間の距離
s は隣り合ったガウス関数の中心間の距離です。
設計者が決定します。
ここでは、
s = mu[1] - mu[0]
とします。 - x の行数
x の行数 n を調べます。
n = x.shape[0] - n × m +1 の配列 PSI
n × m +1 の配列 PSI を作成します。
中身(要素)は 1 にします。
psi = np.ones((n, m+1)) - PSI の要素を書込む
PSI の要素として、各 x に対応するガウス関数計算値を書込みます。
for j in range(m):
psi[:, j] = gauss(x, mu[j], s)
- PSI 転置
でき上がった配列 psi を転置します。
軸を入れ換えます。
n × (m + 1) の配列 psi から
(m + 1) × n の配列 psi_T
を作ります。
psi_T = np.transpose(psi) - 行列の積から逆行列を求める
でき上がった配列 psi と psi_T との積を求め、 これの逆行列 b を求めます。 b = np.linalg.inv(psi_T.dot(psi))
- 逆行列から w を求める
でき上がった逆配列 b と psi_T の積を求め、これと t との積を取ると w を求めることができます。
c = b.dot(psi_T)
w = c.dot(t)
これらをまとめると以下のようになります。
#線形基底関数モデル 厳密解 ---------- def fit_gauss_func(x, t, m): x1 = len(x) - 1 mu = np.linspace(0, x1, m) # print(mu) s = mu[1] - mu[0] # print(s) n = x.shape[0] psi = np.ones((n, m+1)) for j in range(m): psi[:, j] = gauss(x, mu[j], s) psi_T = np.transpose(psi) b = np.linalg.inv(psi_T.dot(psi)) c = b.dot(psi_T) w = c.dot(t) return w, mu, s, m # np.dot(A, B) と A.dot(B) は同じ
デ-タの正規化
Python ガウス基底関数フィッティングを実行しようとするとどうしてもデ-タの正規化をしないとうまく行きません。
デ-タを前処理してスケ-ルを揃える正規化の処理が必要となります。
デ-タが約 80 前後を細かく変化するためです。
どのように正規化してもかまわないのですが、ここではデ-タの中における最大値と最小値を使って正規化します。
min-max normalization 処理を行ないます。
min(x): x の最小値
max(x): x の最大値
とすると
となります。
外れ値がない場合はとても有効な正規化方法です。
これを定義すると以下のようになります。
def min_max(xx, axis = None): # 配列の軸方向は考えない min = xx.min(axis=axis,keepdims=True) # 次元は減らさない max = xx.max(axis=axis,keepdims=True) result = (xx-min)/(max-min) return result, min, max
予測最終日取得
グラフ X 軸日付予測最終日取得関数を作成する必要があります。
これは以前説明した予測最終日取得
の内容と同じです。
cur_date8 には、# 21/03/30
cur_date4 には、# 3/30
の書式で X 軸の日付配列を取得することができます。
定義をまとめると以下のようになります。
import datetime def addBusinessDays(from_date, add_days): cur_date8 = [] # 21/03/30 cur_date4 = [] # 3/30 business_days_to_add = add_days current_date = from_date while business_days_to_add > 0: current_date += datetime.timedelta(days=1) weekday = current_date.weekday() if weekday >= 5: # sunday = 6 continue #土日は以下はスキップ # 年/月/日として文字列にする #例 21/03/30 e11 = current_date.strftime("%y/%m/%d") e22 = e11.replace("/0", "/") e33 = e22[3:] # 21/ 削除 cur_date8.append(e22) cur_date4.append(e33) business_days_to_add -= 1 return cur_date8, cur_date4
ガウス基底関数フィッティング準備/ダウンロードファイル読込
マネーパートナーズのダウンロ-ドサイトからの豪ドル/円 CSV デ-タファイルの取得方法については
マネパ CSV ダウンロードファイルまとめ
のなかで作成した CSV ダウンロ-ドファイル sc_sele_mane_go-s4.py を使用します。
このファイルを実行すると、
/public_html/manep/mane_chart_go.csv ファイル
が読み込まれます。
これを再度読み出します。
このファイルの0行目のヘッダー情報は日本語で書かかれています。
単に読込むと文字化けしますので、文字コードを cp932 を指定すると文字化けしないようです。
CSV ファイルの保存場所は絶対パスで表記する必要があります。
xl_df = pd.read_csv("/home/yamada/public_html/manep/mane_chart_go.csv", encoding="cp932")
ここまでで、ガウス基底関数フィッティング準備が完了しました。
引き続き、豪ドル/円チャ-トロ-ソク足表示のなかにガウス基底関数フィッティング表示を入れ込んでいきます。