Jupyter NotebookでPandoc wasn't foundとなった時

問題

JupyterにはファイルをLaTeX、またはPDFとして出力する機能があるが、新しい環境で試したらエラーになってしまった。 f:id:babaye:20210504090003p:plain

nbconvert failed: Pandoc wasn't found.
Please check that pandoc is installed:
https://pandoc.org/installing.html

解決方法

PandocをインストールしてPCを再起動する

詳細

  1. https://pandoc.org/installing.html にアクセス
  2. Windowsの場合「Download the latest installer for Windows (64-bit)」をクリックf:id:babaye:20210504090907p:plain
  3. ダウンロードされたインストーラーを開き、指示に従ってインストールする
  4. PCを再起動

もし上記の方法でうまく行かなければ、

pip install pandoc

も試してみてほしい。

PCを再起動するところで詰まったのと、日本語の記事が見つからないので記事にした

FastTextでmost_similar(類似単語検索)、"東京"-"日本"+"アメリカ"をしたい

TL; DL

most similar(=類似単語検索)はget_nearest_neighborsで、「"東京"-"日本"+"アメリカ"」(=単語の足し算, 引き算)はget_analogiesで実装できる

なぜこの記事を書いたか

Facebookの訓練済みFastTextモデルではmost_similarが使えない

また、gensimでFacebookの訓練済みベクトルを読み込もうとすると、以下のようなエラーが出てしまう

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe3 in position 0: unexpected end of data

gensimで読み込み直すこと無く、そのままFastTextで類似単語検索などを行いたい

コード

import fasttext
import fasttext.util
# 日本語版FastTextの訓練済みベクトルダウンロード
fasttext.util.download_model('ja', if_exists='ignore') # 10分以上かかる
ft = fasttext.load_model('cc.ja.300.bin')

# 類似単語検索
ft.get_nearest_neighbors('日本')
"""
 => [(0.683641791343689, '国内'),
 (0.6735708117485046, '米国'),
 (0.6710543036460876, 'アメリカ'),
 (0.6430486440658569, '欧米'),,,
"""

# 単語の足し算, 引き算
ft.get_analogies("東京", "日本", "アメリカ")
"""
[(0.6167652606964111, 'ニューヨーク'),
 (0.5732213854789734, 'ロサンゼルス'),
 (0.5674026608467102, 'フィラデルフィア'),
 (0.5639261603355408, 'フロリダ'),,,
"""

Deriving covariance and variances of coefficients <slope and intercept> of Simple Linear Regression <Var(beta), Cov(beta0, beta1)>

Suppose a simple linear regression model:

 Y_i = \beta _0 + \beta _ 1 X_i + \varepsilon _ i

This post will explain how to obtain the following formulae:

 \displaystyle Var ( \hat{\beta _ 0} ) = \sigma ^ 2 \left ( \frac{1}{n} + \frac{\bar{x}_{n}^{2}}{s^{2}_{x}} \right )

 \displaystyle Var( \hat{\beta _ 1}) = \frac{\sigma ^2}{s^{2}_{x}}

 \displaystyle Cov( \hat{\beta _ 0},  \hat{\beta _ 1}) = -\frac{\bar{x}_n \sigma^{2}}{s^{2}_{x}}

 \displaystyle Var( \hat{\beta _ 1}).

\begin{align} \displaystyle Var( \hat{\beta _ 1}) &= Var \left ( \frac{ \sum ^{n}_{i=1} (X_i - \bar{X} ) Y_i }{s^{2}_{x}} \right ) \\ &= \frac{1}{s^{4}_{x}} Var ( \sum ^{n}_{i = 1} (X_i - \bar{X} ) (\beta _{0} + \beta _{1} X_{i} + \varepsilon _{i}))\\ &= \frac{1}{s^{4}_{x}} Var ( \sum ^{n}_{i = 1} (X_i - \bar{X} ) \varepsilon _{i})\\ &= \frac{1}{s^{4}_{x}} \sum ^{n}_{i = 1} Var ( (X_i - \bar{X} ) \varepsilon _{i})\\ &= \frac{1}{s^{4}_{x}} \sum ^{n}_{i = 1} (X_i - \bar{X} ) Var (\varepsilon _{i})\\ &= \frac{1}{s^{4}_{x}} \sum ^{n}_{i = 1} (X_i - \bar{X} ) σ^{2}\\ &= \frac{ σ^{2}}{s^{4}_{x}} \sum ^{n}_{i = 1} (X_i - \bar{X} )\\ &= \frac{ σ^{2}}{s^{4}_{x}} s^{2}_{x}\\ &= \frac{ σ^{2}}{s^{2}_{x}} \end{align}

  • Line 1→2:  Y_i = \beta _0 + \beta _ 1 X_i + \varepsilon _ i
  • Line 2→3: We consider  \beta _0 + \beta _ 1 X_i as constant, and Var(A+constant) = Var(A)
  • Line 3→4: We assume homoscedasticity

 \displaystyle Var ( \hat{\beta _ 0} )

\begin{align} \displaystyle Var ( \hat{\beta _ 0} ) &= Var(\bar{Y} - \beta_{1} \bar{X} )\\ &= Var( \bar{Y} ) + \bar{X}^{2} Var(β_{1} ) - 2 \bar{X} C o v ( \bar{Y}, \hat{β} _{1} )\\ &= A + B + C \end{align} We consider each term of left hand side (= A, B, C) one by one.

A

\begin{align} \displaystyle Var( \bar{Y} ) &= Var( \frac{1}{n} \sum ^ {n} _{i=1} Y_{i} )\\ &= \frac{1}{n^{2}} n Var(Y_{i} )\\ &= \frac{σ^{2}}{n} \\ \end{align}

B

\begin{align} \displaystyle \bar{X}^{2} Var(β_{1} ) = \bar{X}^{2} \frac{ σ^{2}}{s^{2}_{x}} \end{align}

↑From previous result

C

\begin{align} \displaystyle C o v ( \bar{Y}, \hat{\beta}_{1} ) &= C o v ( \frac{1}{n} \sum_{i=1}^{n} Y_{i}, \frac{\sum_{j=1}^{n} x_{j}-\bar{x} Y_{j}}{s_{x}^{2}} ) \\ &= \frac{1}{n} \frac{1}{s_{x}^{2}} C o v ( \sum_{i=1}^{n} Y_{i}, \sum_{j=1}^{n} (X_{j}-\bar{X} ) Y_{j} \\ &=\frac{1}{n s_{x}^{2}} \sum_{i=1}^{n} ( X_{i}-\bar{X} ) \sum_{j=1}^{n} C o v ( Y_{i}, Y_{j} ) \\ &=\frac{1}{n s_{x}^{2}} \sum_{i=1}^{n} ( X_{i}-\bar{X} ) σ^{2} \\ &=\frac{σ^{2}}{n s_{x}^{2}} \sum_{i=1}^{n} ( X_{i}-\bar{X} ) \\ &=0 \end{align}

A + B + C

Therefore,

\begin{align} \displaystyle V a r ( \hat{β }_ {0} ) &= \frac{σ^{2}}{n} + \bar{X}^{2} \frac{ σ^{2}}{s^{2}_{x}} + 0 \\ &= σ^{2} ( \frac{1}{n} + \frac{ \bar{X} ^{2} }{s^{2}_{x} } ) \end{align}

 \displaystyle Cov( \hat{\beta _ 0},  \hat{\beta _ 1})

\begin{align} C o v ( β_{1}, \hat{β}_{1} ) &=\mathbb{E} ( ( \hat{\beta}-\bar{\hat{β}}_{0} ) ( \hat{β}_{1}-\bar{\hat{β}}_{1} ) ) \\ &=\mathbb{E} ( ( \hat{β}_{0} - β_{0} ) ( \hat{β}_{1}-β_{1} ) ) \\ &=\mathbb{E} ( ( \sum_{i=1}^{n} ( \frac{1}{n} - \frac{\bar{X}(X_{i} - \bar{X} ) } {\hat{s}^{2}_{x} }) ε_{i} \sum ^ {n} _{i=1} ( \frac{X_{i}-\bar{X}}{s_{x}^{2}} ) ε_{i} ) ) \\ &=\mathbb{E} ( \varepsilon_{i}^{2} ) \sum_{i=1}^{n} ( - ( \frac{1}{n} - \frac{ \bar{X} ( X_{i}- \bar{X} ) }{s_{x}^{2}} ) \frac{X_{i}-\bar{X}}{s_{x}^{2}} ) \\ &=σ^{2} ( - \frac{\bar{X}}{ ( s_{x}^{2} ) ^{2}} \sum_{i=1}^{n} ( X_{i}-\bar{X} ) ^{2} ) \\ &=σ^{2} ( - \frac{\bar{X}}{ ( s_{x}^{2} ) ^{2}} s_{x}^{2} ) \\ &=-\frac{σ^{2} \bar{X}}{s_{x}^{2}} \end{align}

【統計系】海外有名大学院の合格率・必要GRE等

この記事は何か

「統計/ファイナンス系の海外大学院に出願したいけど、どのレベル感の大学に出願すればいいかわからない」という人向けに、各大学の受験難易度に関する統計をまとめたもの。

日本の大学受験のように大学の偏差値と自分の偏差値がわからないのが海外大学院受験。この記事を参考に出願先を検討してみてほしい。

f:id:babaye:20200520113715j:plain
https://www.flickr.com/photos/bjaglin/4679648780

【統計系】合格率等まとめ

大学・プログラム名 合格率 GRE V 平均 GRE Q 平均 平均 GPA 世界順位*1
NYU - Data Analytics & Business Computing 32% 158 167 3.59 29
Duke - Master's in Statistical Science 20% 160 169 3.7 20
UCLA - Master of Applied Statistics 19% NA NA NA 17
Chicago - Master of Science in Statistics 10〜20% NA ↑167 NA 9
UCBerkeley - Master in Statistics*2 14% 157.5 168.5 3.8 13
Carnegie Mellon -Master's of Statistical Practice 12% ↑151 ↑167 NA 27
UCLA - Master of Science in Statistics 8% NA NA NA 17
Princeton - Master in Finance 7% NA 167 NA 6

注意

  • 当たり前だが、平均スコアに届かなくても合格する人は合格する。日本人はレアなため、多少スコアが足りなくても、エッセイがしっかり書けていれば大目に見てもらえる気がする
  • 海外は同じ大学内でも学部ごとにランキングが大きく異る。よって日本と違い大学ランキングが当てにならない。世界大学ランキングは「なんとなくの知名度」くらいに受け止め、応募の際は学部ごとのランキングをチェックしていただきたい。(例:日本では東大と慶応に合格したら、学部に関わらず東大に進学すると思うが、アメリカでは「ハーバードに受かってもシカゴ大学に進学」ということがありえる)
  • 平均スコアを出さず、「most admitted MSP students have GRE Verbal scores above the 50th percentile, GRE Math scores above the 90th percentile, and GRE Analytic Writing scores above 3.5.*3」のように、目安の足切り点を設定している大学も「GRE V/Q 平均」の列に並べている。正確なスコアは各大学のWebサイトを参考にしていただきたい

補足:ファイナンス系合格率等まとめ

大学・プログラム名 合格率 GRE V 平均 GRE Q 平均 平均 GPA 世界順位*4
Cambridge - MPhil in Finance and Economics 30% NA NA NA 3
NYU - Quantitative Finance 31% 155 168 3.59 29

numpy.arrayやリストで以上以下を条件指定し配列を取り出す [python]

結論

配列[(配列>=数) & (配列<=数)]

を使う

やりたいこと

例えば、

l = np.array([0,1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1,0])

があったとき、3以上7未満のように、複数条件で要素を取り出したい。

l = np.array([0,1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1,0])
# l2 = 何らかの動作
print(l2)  # => [3 4 5 6 6 5 4 3]

方法

上の例のようにリストlから3以上7未満の要素を取り出したい場合:

l[(l >= 3) & (l < 7)]  # => [3 4 5 6 6 5 4 3]

説明

何も考えず

l[3<=l<7]

とやると、

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-194-aa9d3443d177> in <module>
----> 1 l[3<=l<7]

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

だったり

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

のように帰ってくる。

これは、3<=l<7の部分が、「3以上かつ7以下の部分」を取ってきてほしいのか、「3以上または7以下の部分」を取ってきてほしいのか混乱してしまっているためにエラーが起きる

この問題を解決するために、まず2つの条件を&でまとめ、TrueとFalseだけの配列を作る↓

[(l >= 3) & (l < 7)]
 # => array([False, False, False,  True,  True,  True,  True, False, False,
       False, False, False,  True,  True,  True,  True, False, False,
       False])

つぎに、これを元々の配列lに当てはめ、必要な結果を得る

l[(l >= 3) & (l < 7)]
# => [3 4 5 6 6 5 4 3]

※ np.allを使ってもうまく行かない例↓

np.all(l, ((l >= 3) & (l < 7)))
# => TypeError: only integer scalar arrays can be converted to a scalar index

ホークス過程(Hawkes Process)の説明とPythonでのシミュレーション

ホークス過程とは

イベントが起こった直後に、再びそのイベントが起こりやすい現象をモデル化する時に便利なモデル

例えば、大きな地震が起こったときは、直後に余震が起こりやすい

ほかにも、くしゃみをした時は、そのあと連続でくしゃみが続きやすい

ここで、以下の3つの特徴を持つintensity (=強度関数)というものを考える

  1. intensityが大きいほど次のイベントがすぐ起こりやすい
  2. またintensityは時間とともに減っていく
  3. イベントが起こるとintensityが上昇する

このように考えると、イベント発生と、intensityの変化は以下のように図示できる

f:id:babaye:20191017204947j:plain
Rizoiu, et al. (2017)

イベント(地震)が起きるとintensityが上昇し、なにもないときは緩やかに下降しているのが確認できるだろう(一番下のグラフ)

ホークス過程の数式

intensityをλとして表す

指数関数に従ってintensityが減衰すると仮定するのが最もシンプルでよく使われている

 \displaystyle λ(t)=ρ +α \sum_{t_{k} \lt t} exp^{- β (t-t_{k} ) }

ただし、ρはbase intensityと呼ばれ、平時にイベントが起こる確率

αはイベントが起こったときにどれくらいintensityが上昇するかを表すパラメータ

βはintensityの減少の早さを示すパラメータ

αとβの設定の仕方次第でintensityが発散してしまうので注意

ここでの \sumでは、過去(つまり t_k \lt t)に起きたすべての各イベントによるintensityの影響を足している

たとえば、計測開始から2秒後と5秒後にイベントが起こったとすると、(6秒の地点のintensity)=(base intensityのρ) + (1秒前に起こったイベントによる増加分たくさん) + (4秒前に起こったイベントによる増加分すこし)   である

コード

import numpy as np
import matplotlib.pyplot as plt

# hyperparameters
mu = 0.1
alpha = 1.5
beta = 30

# 
neuton_iter_num = 200
num_datapoints = 15

# step1
U = np.random.uniform(0, 1)
# step2
t1 = -np.log(U)/mu
t = [t1]


for k in range(num_datapoints):
    # step3
    U = np.random.uniform(0, 1)
    
    # step 4
    if k == 0:
        Sk = 1

    u = t[k] - np.log(U)/mu  # initial value of iteration
    for _ in range(neuton_iter_num):
        fu  = np.log(U) + mu*(u-t[k])  + alpha/beta*Sk*(1-np.exp(-beta*(u-t[k])))
        fu_dash = mu+alpha*Sk*np.exp(-beta*(u-t[k]))
        u -= fu/fu_dash

    # step 5
    t.append(u)
    Sk = np.exp(-beta*(t[k+1]-t[k]))*Sk + 1  # find S(k+1)

t = np.array(t)/max(t)

# plt.figure(figsize=(20, 10), dpi=50)
# plt.scatter(t, np.ones(len(t)), facecolors='none', edgecolors='red')
# plt.show()


# intensity
time = np.linspace(0,1,10000)
increase = list(map(lambda x: alpha*np.exp(-beta * x), time))
intensity = np.zeros(10000*2)
for timepoints in t:
    yuko = np.append(np.append(np.zeros(len(time[time<timepoints])), increase), np.zeros(len(time[time>=timepoints])))    
    intensity += yuko


# plt.figure(figsize=(20, 10), dpi=50)
# plt.plot(time, intensity[:10000])
# plt.show()



fig, ax1 = plt.subplots(figsize=(20, 5))
ax2 = ax1.twinx()
ax1.scatter(t, np.ones(len(t)), facecolors='none', edgecolors='red', marker='*', s=150)
ax2.plot(time, intensity[:10000], c='b', lw=1)
plt.show()

出力結果:

f:id:babaye:20191017214323p:plain
上記コードの出力結果

参考文献

P-Spline(Penalized Smoothing Splines)をRで実装し、なめらかな曲線をグラフに載せる

Penalized Smoothing Splines (通称P-spline, pspline)をRで走らせてみた

コード例

公式*1からのコピペ

# パッケージのインストールと読み込み
install.packages("pspline")
library(pspline)

# データの読み込み
data(cars)
attach(cars)

# 元になるデータをプロット
plot(speed, dist, main = "data(cars) & smoothing splines")

# df=10でP-Splineを描画(赤色)
lines(sm.spline(speed, dist, df=10), lty=1, col = "red")

# df=100でP-Splineを描画(緑色)
lines(sm.spline(speed, dist, df=100), lty=1, col = "green")

# 凡例の追加
legend("topleft", legend = c('df=10', 'df=100'), col = c("red", "green"),  lty=c(1, 1))

f:id:babaye:20191005120623p:plain

以上から、dfが大きいと、よりギザギザしたものになることが確認できる(バイアスバリアンストレードオフ

人工データ

 \displaystyle y = \sin (x) - \cos (x/2 - 5)*1.5 + 0.3*\sin (x * 10)
x = (1:50)/3
y = sin(x) - cos(x/2 - 5)*1.5 + 0.3*sin(x*10)
plot(x, y)
lines(sm.spline(x, y, df=5), lty=1, col = "red")
lines(sm.spline(x, y, df=10), lty=1, col = "green")
legend("bottomleft", legend = c('df=5', 'df=10'), col = c("red", "green"),  lty=c(1, 1))

f:id:babaye:20191005130526p:plain

応用

株式の取引間隔のデータに応用すれば、以下のように日中季節性を取り出すことも出来る

使用したのは日本の某銘柄の某日の一日の全取引履歴(前場後場をつなげている)

f:id:babaye:20191005122716p:plain x軸は時間(取引開始〜取引終了)
y軸は取引間隔

それぞれの点は各取引がいつ行われたかと、その取引が前回の取引からどのくらい時間が経っているかを示している

相場が開いた直後、閉まる直前は取引間隔が短くなっている。また、グラフ中心の昼休憩の周辺でも取引感覚が短くなっているのが確認できる

P-Splineで日中季節性をとらえることができた

理論

いまここで、

 \displaystyle y _ j =x\left(t _ j \right)+\varepsilon _ j , \;  j=1, \ldots, n

を考える。ただし、x\left(t _ j \right)は後から予想して引く曲線、y _ jは観測点であるとする

さて、x\left(t _ j \right)をどんな曲線にすればいいか決めるにはどうしたらよいか

まず思いつくのは誤差二乗和だろう

 \displaystyle S S E(x | y)=\sum_ j \left(y_ j -x\left(t_ j \right)\right) ^ 2

もうひとつ、良い曲線を定義するために、グラフを用いながら考えてみる f:id:babaye:20191005130129p:plain ↑のような観測点があったら、引きたい曲線は以下のようになるだろう f:id:babaye:20191005130251p:plain ただ、以下のように曲線を引くことも出来る f:id:babaye:20191005130400p:plain このギザギザ度をペナルティーとしたのがP-Splineである

ペナルティーは、

 \displaystyle \sum _ {i=1} ^ N \left(y-\alpha-f(x ; \beta) +\sum _ {p=1} ^ P f\left(z _ {i p} \right)  \right) ^ 2 +\lambda \int \left(f ^ {\prime \prime} (x) \right) ^ 2 dx

と定義できる。

参考文献・リンク