最尤推定

最尤推定法: ある自由パラメーターが与えられた時に、モデルが実データを予測する確率を最大化するような自由パラメーターを求める方法
→ 観測結果が偶然偏ってしまった場合や、適用する確率分布仮定を誤ると、見当違いな推定結果が導かれる

よって、回数を増やさないと、信用度が上がらない
性善説に立っているようですね。

最尤推定とは、パラーメータθに関する尤度関数L(θ)を最大化するθを求める
θを求めるには、一階級微分するが、対数尤度関数log[e]L(θ)を取る

公式
d/dθ*log[e]L(θ) = 0

最尤推定は、過去データから将来を予想する時に用いられることが多い
まぁ、データ量が上がれば精度も上がるということでしょう。

相関係数

nikkeiとdowの相関を見て見ましょう。

nikkei
2019/10/4 21,316 21,410 21,276 21,410
2019/10/3 21,422 21,437 21,277 21,341
2019/10/2 21,744 21,795 21,725 21,778
2019/10/1 21,831 21,938 21,811 21,885
2019/9/30 21,793 21,811 21,666 21,755

dow
2019年10月04日 26,573.72 26,271.70 26,590.74 26,271.70 224.49M 1.42%
2019年10月03日 26,201.04 26,039.02 26,205.20 25,743.46 249.02M 0.47%
2019年10月02日 26,078.62 26,425.86 26,438.04 25,974.12 312.73M -1.86%
2019年10月01日 26,573.04 26,962.54 27,046.21 26,562.22 272.18M -1.28%
2019年09月30日 26,916.83 26,852.33 26,998.86 26,852.33 228.48M 0.36%

import numpy as np
import pandas as pd

nikkei = [21410,21341,21778,21885,21755]
dow = [26573.72,26201.04,26078.62,26573.04,26916.83]
s1 = pd.Series(nikkei)
s2 = pd.Series(dow)
print(s1.corr(s2))

[vagrant@localhost python]$ python app.py
0.24461988452298797

あれ、思ったより全然相関してない??
dowに反応して日経が動く傾向とすれば、nikkeiを1日ずらせばいいのかな。

平均、分散、標準偏差

普通にやっても詰まらないので、日経平均の平均を取りましょう

日付、始値、高値、安値、終値

2019/10/4	21,316	21,410	21,276	21,410
2019/10/3	21,422	21,437	21,277	21,341
2019/10/2	21,744	21,795	21,725	21,778
2019/10/1	21,831	21,938	21,811	21,885
2019/9/30	21,793	21,811	21,666	21,755
nikkei = [21410,21341,21778,21885,21755]
print(sum(nikkei)/len(nikkei))

[vagrant@localhost python]$ python app.py
21633.8

分散は

import numpy as np

nikkei = [21410,21341,21778,21885,21755]
print(np.var(nikkei))

[vagrant@localhost python]$ python app.py
46880.56

標準偏差は、print(np.std(nikkei))とします。

[vagrant@localhost python]$ python app.py
216.5191908353622

あああ、今週は動きましたねーーーー

期待値

期待値 E(X) は、
E(X) = Σ P(X)X

a = [(-3, 0.977),(24, 0.008), (60, 0.008), (71, 0.006), (99, 0.001)]

print(sum(x * p for x, p in a))

[vagrant@localhost python]$ python app.py
-1.734

そういえば、株やFXの自動売買って、期待値を出して瞬時に注文出してるんでしたっけ??

結合確率

複数の事象が同時に起きる確率
simultaneous probability もしくは joint probability という。
P(X, Y)と表記

P(A∩B) = P(A,B) = P(A)P(B)

事象Bが起きた時に事象Aが発生する条件付き確率は
P(A|B) = P(A∩B)/P(B)

機械学習モデルの正確性を表現するには、適合率(Precision), 再現率(Recall)、F値などの指標が使われる

scikit learn
Model evaluation: quantifying the quality of predictions

混合行列(confusion matrix)とは
クラス分類問題の結果を「実際のクラス」と「予想したクラス」を軸にまとめたもの
– TP(Treu Positive)
– TN(True Negative)
– FP(False Positive)
– FN(False Negative)
陽性(Positive)と陰性(Negative)は自分で決められる

from sklearn.metrics import confusion_matrix

y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [1, 0, 1, 1, 1, 0, 0, 0, 1, 1]

cm = confusion_matrix(y_true, y_pred)
print(cm)

[vagrant@localhost python]$ python app.py
[[1 4]
[3 2]]

なるほど、陽性、陰性は0,1の二進数で表すのね。
TN, FP, FN, TPはそのまま、flatten()で取り出せば良い。

で、正解率(accuracy)は、全てのサンプルのうち、正解したサンプル
$$
\text{accuracy} = \frac{TP + TN}{TP + TN + FP + FN}
$$

from sklearn.metrics import accuracy_score

y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [1, 0, 1, 1, 1, 0, 0, 0, 1, 1]

print(accuracy_score(y_true, y_pred))

[vagrant@localhost python]$ python app.py
0.3

陽性と予想したうち、正解したのを適合率
pricision_scoreで示す
TP / TP+FP
再現率(recall)は実際に陽性のサンプルのうち正解したサンプルの割合
TP / TP+FN

F1値は、適合率と再現率の平均調和

つまり、予想に対して正解が高ければ、F1値は1に近づくし、モデルとして優れているということか。。

ロジスティック分布と正規分布

ロジスティック分布:連続確率分布の一つで、その累積分布関数がロジスティック関数であるもの?
パラメーターmu:平均
sigma:スケールパラメータ

import numpy as np 
import matplotlib.pyplot as plt 

sigma = 1.0
mu = 0

x = np.arange(-5., 5., 0.001)
y = np.exp(-(x-mu)/sigma) / (sigma*(1+np.exp(-(x-mu)/sigma))**2)
plt.plot(x,y)


正規分布と見た目は全く一緒だけど、ロジスティック分布は正規分布より裾野が長く、異なるようです。
– 密度関数は平均から離れても下がりにくい

あれ、でも正規分布の特徴である平均値、最頻値、中央値は一致してるのかな。

パレート分布

パレート分布とは所得者の分布??

import numpy as np 
import matplotlib.pyplot as plt 
a, m = 6., 2.
s = (np.random.pareto(a, 1000) + 1) * m
count, bins, _ = plt.hist(s, 100, density=True)

fit = a * m ** a / bins ** (a + 1)
plt.plot(bins, max(count) * fit / max(fit), linewidth=2, color='r')

差も然りか。。

指数分布とは?

事象が連続して独立に一定の発生率で起こる過程
-> ランダムなイベントの発生間隔を表す分布
 e.g. 地震が起きる間隔、電球の寿命

f(x) = 1/μ e ^-x/μ (x>0)

import numpy as np 
import math
import matplotlib.pyplot as plt 

x = np.arange(-3,3.1,0.1)
y_2 = 2**x
y_3 = 3**x
y_e = math.e**x
y_0_5 = 0.5**x

plt.plot(x,y_2,label="a=2")
plt.plot(x,y_3,label="a=3")
plt.plot(x,y_e,label="a=e")
plt.plot(x,y_0_5,label="a=0.5")
plt.legend()
plt.savefig("01")

正規分布

正規分布:平均値の周辺にデータが集積するデータ分布
平均が50、対象が1000、標準偏差が10とする
確率密度を狭めていく

import numpy as np 
import matplotlib.pyplot as plt 

x = np.random.normal(50, 10, 1000)

plt.hist(x, bins=20)
plt.savefig("01")

plt.hist(x, bins=50)
plt.savefig("02")

plt.hist(x, bins=100)
plt.savefig("03")

まあ、正常なデータでしょうね。

確率変数

変数Xが確率Pで得られる確率は、P(X)
Xが飛び飛びの場合は、離散型確率変数
続くものは、連続型確率変数(身長、体重、経過時間など)
-> 正規分布、指数分布、スチューデントのt分布、パレート分布、ロジスティック分布などがある。

P(X) = f(x)

ヒストグラムはplt.hist(x)

import numpy as np 
import matplotlib.pyplot as plt 

x = np.random.normal(40, 10, 1000)

plt.hist(x)

離散確率分布は、ベル・カーブ=正規分布と呼ばれる釣鐘型に近づく。