2020/4/13 投稿
0. この記事の対象者
- pythonを触ったことがあり,実行環境が整っている人
- pyTorchをある程度触ったことがある人
- pyTorchによるtorch.var()を使っている人
1. はじめに
昨今では機械学習に対してpython言語による研究が主である.
なぜならpythonにはデータ分析や計算を高速で行うためのライブラリ(moduleと呼ばれる)がたくさん存在するからだ.
その中でも今回はpyTorchと呼ばれるmoduleを使用し,その中のtorch.var()について話をしていく.
結論から言うとtorch.var()による計算は分散ではなく不偏分散(標本分散)となっている.
実は多くの統計的なライブラリではvarianceは不偏分散を指しているらしい(私は知らなかったけど統計屋さんは当たり前にそう思ってるのだろう).
この話を実際にプログラムを通じて紹介していく.
ただしこの記事は自身のメモのようなもので,あくまで参考程度にしてほしいということと,簡潔に言うために間違った表現や言い回しをしている場合があるかもしれないが,そこはどうかご了承していただきたい.
2. 事前知識
事前知識としてpythonのnumpyとpyTorchをある程度使えるようにしていただきたい.
この記事ではこれらが当たり前に使える体で話を進めていく.
参考として下記LinkにpyTorchのTensor型についての記事を参照していおく.
3. torch.var()を使ってみる
まずプログラムを書く前に,当たり前ではあるが平均$\mu$,分散$\sigma^2$,不偏分散$s^2$についての式を示す.
\mu = \frac{1}{n}\sum_i^n x_i\\
\sigma^2 = \frac{1}{n}\sum_i^n (x_i-\mu)^2\\
s^2 = \frac{1}{n-1}\sum_i^n (x_i-\mu)^2
ここで$x$は入力サンプル,$n$はサンプル数である.
サンプルとなるデータを以下のように定義した.
a = torch.tensor([1.,2.,3.,4.,5.])
print(a)
------'''以下出力結果'''--------
tensor([1., 2., 3., 4., 5.])
さてまずは普通に分散を求めてみると
mu = torch.mean(a)
var = torch.mean((a - mu)**2)
print(var)
------'''以下出力結果'''--------
tensor(2.)
ここでtorch.mean()は入力した全要素の平均を求める.
このように分散は2.0であることがわかった.
では,pytorchのtorch.var()を使ってみる.
var = torch.var(a)
print(var)
------'''以下出力結果'''--------
tensor(2.5000)
と値が変わっている.
この答えがtorch.var()が分散を求めていない理由である.
実はtorch.var()は入力した全要素の不偏分散(標本分散)を求めているのである.
4. torch.var()を使うときの注意
実際にtorch.var()を使う時の注意だが,分散を予期している場合はこれを使うのを避けるべきかというと必ずしもそうとは言えない.
というのも式から見てわかる通りサンプル数が非常に多い場合はどちらもだいたい同じ値になるからである(nが1000なら1000で割る分散と999で割る不偏分散はほぼ一緒).
今回の私の例のように少ないサンプル数でやる場合は注意が必要ということである.
5. ひとこと
今回はtorch.var()に関することをまとめてみた.
もしかしたら当たり前なことをつらつら述べているだけかもしれないが私は驚きだったので記事として書かせていただいた.
それから分散と不偏分散周りのしっかりした意味合いとかは自身の知識が乏しいため表現ミスなどは温かい目で指摘していただきたい.
読みづらい点も多かったと思うが読んでいただきありがとうございます.