#author("2019-11-08T05:10:52+00:00","","") #mynavi(機械学習) #setlinebreak(on); #html(<script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML"></script>) * 目次 [#zec6bbe3] #contents - 関連 -- [[pandas入門]] -- [[numpy入門]] -- [[matplotlibでグラフ作成]] -- [[PyTorch入門]] -- [[TensorFlow入門]] -- [[R言語入門]] -- [[統計学の基礎知識]] - 参考 -- https://tutorials.chainer.org/ja/03_Basic_Math_for_Machine_Learning.html#%E7%9B%AE%E7%9A%84%E9%96%A2%E6%95%B0 * 微分 [#m6b109c1] #html(<div style="padding-left: 10px;">) ** 常備分 [#me111516] #html(<div style="padding-left: 10px;">) #html(</div>) ** 偏微分 [#l5ac6af5] #html(<div style="padding-left: 10px;">) #html(</div>) #html(</div>) * 線形回帰 ( Linear regression ) [#r9dd04b0] #html(<div style="padding-left: 10px;">) // http://gihyo.jp/dev/serial/01/machine-learning/0008 //** 線形代数 [#k5522922] //#html(<div style="padding-left: 10px;">) //#TODO //#html(</div>) ** 最小2乗法 (単回帰) [#s28b03a5] #html(<div style="padding-left: 10px;">) 予測値と実際の値の差異が最小になるようにして線形モデルを導き出す方法。 線形モデル式を Y = 傾き * X + Y切片 とした場合、傾き(係数) を θ1、Y切片(定数項) を θ0 で表現すると、 #html(){{ <div style="margin-bottom: 10px"> <math> <mo>y = </mo> <msub><mo>θ</mo><mi>1</mi></msub> <mo>x</mo> <mo>+</mo> <msub><mo>θ</mo><mi>0</mi></msub> </math> <math> <msub> <mi> θ</mi> <mi>1</mi> </msub> <mo>=</mo> <mfrac> <mo>共分散(x,y)</mo> <msup> <mo>分散(x)</mo> <mi>2</mi> </msup> </mfrac> </math> <math> <msub> <mo> θ</mo> <mi>0</mi> </msub> <mo>=</mo> <mo>y - </mo> <msub> <mi>θ</mi> <mi>1</mi> </msub> <mo>x</mo> </math> となる。(単回帰) </div> }} #html(){{ <div style="padding-bottom: 10px;"> <math> <mo>共分散(x,y) : </mo> <msub> <mo>S</mo> <mi>xy</mi> </msub> <mo>=</mo> <mfrac><mi>1</mi><mo>n</mo></mfrac> <munderover> <mi>∑</mi> <mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow> <mi>n</mi> </munderover> <mrow> <mo>(</mo> <msub><mi>x</mi><mi>i</mi></msub> <mo>-</mo> <mover><mi>x</mi><mo>-</mo></mover> <mo>)</mo> </mrow> <mrow> <mo>(</mo> <msub><mi>y</mi><mi>i</mi></msub> <mo>-</mo> <mover><mi>y</mi><mo>-</mo></mover> <mo>)</mo> </mrow> </math> <math> <mo> 分散(x) : </mo> <msup> <mo>S</mo> <mi>2</mi> </msup> <mo>=</mo> <mfrac><mi>1</mi><mo>n</mo></mfrac> <munderover> <mi>∑</mi> <mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow> <mi>n</mi> </munderover> <msup> <mrow> <mo>(</mo> <msub><mi>x</mi><mi>i</mi></msub> <mo>-</mo> <mover><mi>x</mi><mo>-</mo></mover> <mo>)</mo> </mrow> <mi>2</mi> </msup> </math> なので、以下のコードで 回帰直線を求める事が出来る。 </div> }} #mycode2(){{ import numpy as np import matplotlib import pandas as pd data = pd.read_csv('./data/sample.csv') x = data['X'] y = data['Y'] n = len(x) # データの個数 mean_x = np.mean(x) # xの平均値 mean_y = np.mean(y) # yの平均値 #xとyの共分散 covariance = (1 / n) * sum([(x[i] - mean_x) * (y[i] - mean_y) for i in range(n)]) #xの分散 variance = (1 / n) * sum([(x[i] - mean_x) ** 2 for i in range(n)]) # θ1、θ0 を求める t1 = covariance / variance t0 = mean_y - (t1 * mean_x) # np.polyfit を使えば1行で書ける #t1, t0 = np.polyfit(x, y, 1) # 第3引数は次数 # 回帰直線を求める y_pred = t1*x + t0 # 描画 plt.scatter(x, y, color="red") plt.plot(x, y_pred) plt.grid(True) plt.show() }} #html(</div>) ** 勾配降下法(最急降下法) [#c0d3ebb9] #html(<div style="padding-left: 10px;">) 学習回数と学習率を指定して、何度も計算(最適化)を行って誤差が最小となる値を求める方法。 ※関数の最小値を探索する連続最適化問題の勾配法のアルゴリズムの一つ。( wikipedia より) #html(){{ <div> <math> <msub> <mo>θ</mo> <mo>0</mo> </msub> <mo>:=</mo> <msub> <mo>θ</mo> <mo>0</mo> </msub> <mo>-</mo> <mo>α</mo> <mfrac><mi>1</mi><mo>m</mo></mfrac> <munderover> <mi>∑</mi> <mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow> <mi>m</mi> </munderover> <mrow> <mo>(</mo><mover><mi>y</mi><mo>^</mo></mover> <mo>-</mo> <msub><mi>y</mi><mi>i</mi></msub><mo>)</mo> </mrow> </math> </div> }} #html(){{ <div> <math> <msub> <mo>θ</mo> <mo>1</mo> </msub> <mo>:=</mo> <msub> <mo>θ</mo> <mo>1</mo> </msub> <mo>-</mo> <mo>α</mo> <mfrac><mi>1</mi><mo>m</mo></mfrac> <munderover> <mi>∑</mi> <mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow> <mi>m</mi> </munderover> <mrow> <mo>(</mo><mover><mi>y</mi><mo>^</mo></mover> <mo>-</mo> <msub><mi>y</mi><mi>i</mi></msub><mo>)</mo> <mo>・</mo> <msub><mi>x</mi><mi>i</mi></msub> </mrow> </math> </div> }} 上記の数式を python で実装してみる。 ※以下では計算(最適化)毎のコスト算出用に目的関数も定義している。 ※ここでは、θ0,θ1 の 初期値は 0 とした。 #mycode2(){{ def cost_func(x, y, t0, t1): """目的関数(RMSEを採用).""" m = len(x) return (np.sqrt(sum([(y[j] - (t1 * x[j] + t0)) ** 2 for j in range(m)]) / m)) def gradient_descent(x, y, alpha, iter_num): """最急降下法.""" m = len(x) t0 = 0.0 t1 = 0.0 costs = np.zeros(iter_num) for i in range(iter_num): # θ0, θ1 の計算 及び 更新 h = t0 + t1 * x t0 = t0 - alpha * np.sum(h - y) / m t1 = t1 - alpha * np.sum((h - y) * x) / m costs[i] = cost_func(x, y, t0, t1) #costs[i] = np.sqrt(sum([(y[j] - (t1 * x[j] + t0)) ** 2 for j in range(m)]) / m) return (t0, t1, costs) }} 上記で作成した関数を用いて回帰直線 及び 最適化毎のコスト(誤差)をプロットしてみる。 #mycode2(){{ # パラメータ設定 alpha = 0.01 # 学習率 iter_num = 100 # 学習回数 # サンプルデータ x1 = np.array(range(1, 10), dtype=np.float64) y1 = np.array([x1[i] + random.randrange(0, 3) for i in range(len(x1))], dtype=np.float64) # 最急降下法 t0, t1, costs = gradient_descent(x1, y1, alpha, iter_num) fig = plt.figure(figsize=(10, 5)) # データのプロット ax1 = fig.add_subplot(1, 2, 1) ax1.plot(a.T[0], a.T[1],"b." ) ax1.set_xlabel('data x') ax1.set_ylabel('data y') ax1.scatter(x1, y1, c='r') # 散布図(実際の値) ax1.grid(True) ax1.plot(x1, x1 * t1 + t0, '-') # 回帰直線 # コスト遷移状況をプロット ax2 = fig.add_subplot(1, 2, 2) ax2.set_xlabel('iterations') ax2.set_ylabel('cost') ax2.plot(range(costs.size), costs, "-b", linewidth=2 ) ax2.grid(True) plt.show() # t1(係数)とt0(定数項)を確認 print(f"t0: {t0}, t1: {t1}") print("cost(最終): {}".format(costs[len(costs)-1])) }} 結果 #ref(gradient_descent_sample1.png) #html(</div>) //** 最尤推定 [#k98022ba] //#html(<div style="padding-left: 10px;">) //#html(</div>) // パラメータ導出 // 最小二乗法と最尤推定について #html(</div>) // 回帰分析 END * 目的関数 [#i5907b87] #html(<div style="padding-left: 10px;">) 予測値を評価する為の指標は、目的関数により定義される。 ※予測と実績の誤差(コスト)を評価する為の関数。 ** 平均二乗誤差 / 二乗平均平方根誤差 ( RMSE ) [#pa6dc0fa] #html(<div style="padding-left: 10px;">) 回帰モデルの誤差を評価する指標の一つ。 https://tutorials.chainer.org/ja/03_Basic_Math_for_Machine_Learning.html#%E7%9B%AE%E7%9A%84%E9%96%A2%E6%95%B0 #html(){{ <div style="padding-bottom: 10px;"> <math> <mo>RMSE</mo> <mo>=</mo> <msqrt> <mfrac><mi>1</mi><mo>n</mo></mfrac> <munderover> <mi>∑</mi> <mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow> <mi>n</mi> </munderover> <msup> <mrow> <mo>(</mo> <msub><mi>y</mi><mi>i</mi></msub> <mo>-</mo> <mover><msub><mi>y</mi><mi>i</mi></msub><mo>^</mo></mover> <mo>)</mo> </mrow> <mi>2</mi> </msup> </msqrt> </math> </div> }} 回帰直線(予測値)を y_pred とした場合、以下で求める事ができる。 #mycode2(){{ rmse = np.sqrt(sum([(y[i] - y_pred[i]) ** 2 for i in range(n)]) / n) }} #html(</div>) ** XXXXX [#uc08e935] #html(<div style="padding-left: 10px;">) #html(){{ <div> <math> <mrow> <mo>j</mo> <mo>(</mo> <msub> <mo>θ</mo> <mo>0</mo> </msub> <mo>,</mo> <msub> <mo>θ</mo> <mo>1</mo> </msub> <mo>)</mo> <mo>=</mo> </mrow> <mfrac><mi>1</mi><mo>2n</mo></mfrac> <munderover> <mi>∑</mi> <mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow> <mi>n</mi> </munderover> <msup> <mrow> <mo>(</mo> <mover><mi>y</mi><mo>^</mo></mover> <mo>-</mo> <msub><mi>y</mi><mi>i</mi></msub> <mo>)</mo> </mrow> <mi>2</mi> </msup> </math> </div> }} #html(</div>) #html(</div>) * 確率と統計 [#d0e3df79] #html(<div style="padding-left: 10px;">) ** 確率変数・確率分布 [#pc75af50] #html(<div style="padding-left: 10px;">) #html(</div>) ** 結合確率・条件付き確率 [#e2471822] #html(<div style="padding-left: 10px;">) #html(</div>) ** 期待値 [#c84a1cce] #html(<div style="padding-left: 10px;">) #html(</div>) ** 平均・分散・共分散 [#n261c0c8] #html(<div style="padding-left: 10px;">) #html(</div>) ** 相関係数 [#t9bc8825] #html(<div style="padding-left: 10px;">) #html(</div>) #html(</div>) * 頻度分析 [#i535681c] #html(<div style="padding-left: 10px;">) ** 観測頻度と相対頻度 [#z1c313ad] ** 標準化頻度 [#eda634f5] ※観測頻度 - 平均値 / 標準偏差 ** TF-IDF [#dcb2e767] 各テキストの特徴的な単語を抽出する為の技法 TF(単語の観測度) * IDF(その単語が出現するテキストの数でテキストの総数を割った値の対数) #html(</div>) * 数理モデル [#y3a84c10] #html(<div style="padding-left: 10px;">) ** ランダムフォレスト [#l984fed8] 決定木による複数の弱学習器を統合させて汎化能力を向上させる、アンサンブル学習アルゴリズムである。 おもに分類(判別)・回帰(予測)の用途で使用される ** サポートベクターマシン [#r02b5f3c] サポートベクターマシン(英: support vector machine, SVM)は、教師あり学習を用いるパターン認識モデルの一つである。分類や回帰へ適用できる。 ** ナイーブベイズ分類器 [#h61ab40e] #TODO ** アダブースト [#b08c5429] ランダムよりも少し精度がいいような弱い識別機を組みわせて、強い識別機を作成しようとする機械学習モデル ** k近傍法 [#w473aee6] k近傍法(ケイきんぼうほう、英: k-nearest neighbor algorithm, k-NN)は、特徴空間における最も近い訓練例に基づいた分類の手法であり、パターン認識でよく使われる。 最近傍探索問題の一つ。k近傍法は、インスタンスに基づく学習の一種であり、怠惰学習 (lazy learning) の一種。 その関数は局所的な近似に過ぎず、全ての計算は分類時まで後回しにされる。また、回帰分析にも使われる。 k近傍法は、ほぼあらゆる機械学習アルゴリズムの中で最も単純。 ** k平均法 [#c97e977b] #TODO ** ニューラルネットワーク [#yef2af0b] 脳機能に見られるいくつかの特性に類似した数理的モデル ニューラルネットワークはシナプスの結合によりネットワークを形成した人工ニューロン(ノード)が、学習によってシナプスの結合強度を変化させ、問題解決能力を持つようなモデル全般を指す ** マルコフ連鎖 [#v6d0db5a] #TODO #html(</div>) * その他/用語など [#cbcd59c4] #html(<div style="padding-left: 10px;">) ** 偏差 [#c3eaa1b1] #html(<div style="padding-left: 10px;">) 値と平均値の差。 #html(</div>) ** Σ(シグマ) [#sbf832de] #html(<div style="padding-left: 10px;">) #html(</div>) ** マスク配列 [#b32fc7d9] #html(<div style="padding-left: 10px;">) #html(</div>) ** 行列とベクトル [#jc2b5322] #html(<div style="padding-left: 10px;">) #html(</div>) ** 正則化 [#c8f48358] #html(<div style="padding-left: 10px;">) ※過学習の回避 #html(</div>) ** ドロップアウト法 [#j65ed75d] #html(<div style="padding-left: 10px;">) ※過学習の回避 #html(</div>) ** 順伝播 [#r3902506] #html(<div style="padding-left: 10px;">) #html(</div>) ** 損失関数 [#fcb884f7] #html(<div style="padding-left: 10px;">) #html(</div>) **誤差逆伝播法 [#s64adb92] #html(<div style="padding-left: 10px;">) #html(</div>) ** 指数関数と対数関数 [#nacecf0f] #html(<div style="padding-left: 10px;">) #html(</div>) ** シグモイド関数 [#qf4dcfb5] #html(<div style="padding-left: 10px;">) #html(</div>) ** ReLU関数 [#d167c797] #html(<div style="padding-left: 10px;">) #html(</div>) ** 乗法公式 [#sd341db5] #html(<div style="padding-left: 10px;">) #html(){{ <div> <math> <mo>(x+a)(x+b)</mo> <mo>=</mo> <msup><mo>x</mo><mo>2</mo></msup> <mo>+</mo> <mo>(a+b)x</mo> <mo>+</mo> <mo>ab</mo> </math> </div> <div> <math> <mo>(a+b)(a-b)</mo> <mo>=</mo> <msup><mo>a</mo><mo>2</mo></msup> <mo>-</mo> <msup><mo>b</mo><mo>2</mo></msup> </math> </div> <div> <math> <msup><mo>(a+b)</mo><mo>2</mo></msup> <mo>=</mo> <msup><mo>a</mo><mo>2</mo></msup> <mo>+</mo> <mo>2ab</mo> <mo>+</mo> <msup><mo>b</mo><mo>2</mo></msup> </math> </div> <div> <math> <msup><mo>(a-b)</mo><mo>2</mo></msup> <mo>=</mo> <msup><mo>a</mo><mo>2</mo></msup> <mo>-</mo> <mo>2ab</mo> <mo>+</mo> <msup><mo>b</mo><mo>2</mo></msup> </math> </div> <div> <math> <mo>(ax+b)(cx+d)</mo> <mo>=</mo> <mo>ac</mo> <msup><mo>x</mo><mo>2</mo></msup> <mo>+</mo> <mo>(ad+bc)x</mo> <mo>+</mo> <mo>bd</mo> </math> </div> }} #html(</div>) #html(</div>)