目次

微分

常備分

偏微分

線形回帰 ( Linear regression )

最小2乗法(LSM) (単回帰)

予測値と実際の値の差異が最小になるようにして線形モデルを導き出す方法。

線形モデル式を Y = 傾き * X + Y切片 とした場合、傾き(係数) を θ1、Y切片(定数項) を θ0 で表現すると、

y = θ1 x + θ0  θ 1 = 共分散(x,y) 分散(x) 2  θ 0 = y - θ 1 x  となる。(単回帰)
共分散(x,y) : S xy = 1n i=1 n ( xi - x- ) ( yi - y- )  分散(x) : S 2 = 1n i=1 n ( xi - x- ) 2 なので、以下のコードで 回帰直線を求める事が出来る。
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()

勾配降下法(最急降下法)

学習回数と学習率を指定して、何度も計算(最適化)を行って誤差が最小となる値を求める方法。
※関数の最小値を探索する連続最適化問題の勾配法のアルゴリズムの一つ。( wikipedia より)

θ0 := θ0 - α ∂θ1 J(θ0,θ1)
θ1 := θ1 - α ∂θ1 J(θ0,θ1)
偏微分を計算すると
θ 0 := θ 0 - α 1m i=1 m (y^ - yi)
θ 1 := θ 1 - α 1m i=1 m (y^ - yi) xi

上記の数式を python で実装してみる。
※以下では計算(最適化)毎のコスト算出用に目的関数も定義している。
※ここでは、θ0,θ1 の 初期値は 0 とした。

def cost_func(x, y, t0, t1):
    """目的関数."""
    m = x.size
    # return (np.sqrt(sum([(y[j] - (t1 * x[j] + t0)) ** 2 for j in range(m)]) / m))  # RMSEの場合
    return 1 / (2*m) * sum([((t1 * x[i] + t0) -  y[i]) ** 2 for i in range(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)

上記で作成した関数を用いて回帰直線 及び 最適化毎のコスト(誤差)をプロットしてみる。

# パラメータ設定
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.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]))

結果

gradient_descent_sample1.png

重回帰分析

重回帰モデル式(特徴量 x が2つの時)

y^ = w1 x1 + w2 x2 + w0 x0  ※行列計算用に x0 = 1 とする

特徴量の行列をX、パラメータの行列をWとした場合、

y^ = X * W
W := W - α 1m XT (XW-y)
コスト関数は
j(W) = 12m i=1m ( y^ - yi ) 2 = 12m (XW-y) T (XW-y)

※ 関連: numpyを使用した重回帰分析

正規化

重回帰分析等を行う際、特徴量の範囲が異なる時は特徴量のスケールを調整する(正規化)を行う。

z-socre Normalization (標準化)

平均が0、標準偏差が1となるように調整する。

x1 = x1-xmean std

※ std: 標準偏差

min-max normalization

最大値が1最小値が0となるように調整する。

x1 = x1-xmean xmax-xmin

目的関数

予測値を評価する為の指標は、目的関数により定義される。
※予測と実績の誤差(コスト)を評価する為の関数。

平均二乗誤差(MSE) / 二乗平均平方根誤差 ( RMSE )

回帰モデルの誤差を評価する指標の一つ。
https://tutorials.chainer.org/ja/03_Basic_Math_for_Machine_Learning.html#%E7%9B%AE%E7%9A%84%E9%96%A2%E6%95%B0

目標値=yi 予測値=yi^ とした場合。


平均二乗誤差(MSE)
L = 1n i=1 n ( yi - yi^ ) 2
二乗平均平方根誤差(RMSE)
RMSE = 1n i=1 n ( yi - yi^ ) 2

回帰直線(予測値)を y_pred とした場合、以下で求める事ができる。

rmse = np.sqrt(sum([(y[i] - y_pred[i]) ** 2 for i in range(n)]) / n)

交差エントロピー

分類モデルの誤差を評価する指標の一つ。

コスト関数

単回帰
j ( θ 0 , θ 1 ) = 12m i=1 m ( y^ - yi ) 2
重回帰
j(W) = 12m i=1m ( y^ - yi ) 2 = 12m (XW-y) T (XW-y)  ※ 特徴量の行列をX、パラメータの行列をWとした場合

確率と統計

確率変数・確率分布

結合確率・条件付き確率

期待値

平均・分散・共分散

相関係数

頻度分析

観測頻度と相対頻度

標準化頻度

※観測頻度 - 平均値 / 標準偏差

TF-IDF

各テキストの特徴的な単語を抽出する為の技法
TF(単語の観測度) * IDF(その単語が出現するテキストの数でテキストの総数を割った値の対数)

数理モデル

ランダムフォレスト

決定木による複数の弱学習器を統合させて汎化能力を向上させる、アンサンブル学習アルゴリズムである。 おもに分類(判別)・回帰(予測)の用途で使用される

サポートベクターマシン

サポートベクターマシン(英: support vector machine, SVM)は、教師あり学習を用いるパターン認識モデルの一つである。分類や回帰へ適用できる。

ナイーブベイズ分類器

TODO:

アダブースト

ランダムよりも少し精度がいいような弱い識別機を組みわせて、強い識別機を作成しようとする機械学習モデル

k近傍法

k近傍法(ケイきんぼうほう、英: k-nearest neighbor algorithm, k-NN)は、特徴空間における最も近い訓練例に基づいた分類の手法であり、パターン認識でよく使われる。
最近傍探索問題の一つ。k近傍法は、インスタンスに基づく学習の一種であり、怠惰学習 (lazy learning) の一種。
その関数は局所的な近似に過ぎず、全ての計算は分類時まで後回しにされる。また、回帰分析にも使われる。
k近傍法は、ほぼあらゆる機械学習アルゴリズムの中で最も単純。

k平均法

TODO:

ニューラルネットワーク

脳機能に見られるいくつかの特性に類似した数理的モデル
ニューラルネットワークはシナプスの結合によりネットワークを形成した人工ニューロン(ノード)が、学習によってシナプスの結合強度を変化させ、問題解決能力を持つようなモデル全般を指す

マルコフ連鎖

TODO:

その他/用語など

偏差

値と平均値の差。

Σ(シグマ)

マスク配列

行列とベクトル

正則化

※過学習の回避

ドロップアウト法

※過学習の回避

順伝播

損失関数

誤差逆伝播法

指数関数と対数関数

シグモイド関数

ReLU関数 ( 正規化線形関数 )

乗法公式

(x+a)(x+b) = x2 + (a+b)x + ab
(a+b)(a-b) = a2 - b2
(a+b)2 = a2 + 2ab + b2
(a-b)2 = a2 - 2ab + b2
(ax+b)(cx+d) = ac x2 + (ad+bc)x + bd

添付ファイル: filegradient_descent_sample1.png 7件 [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-11-06 (水) 20:25:40 (15d)