情報学部大学生のダラダラ日記

情報学部大学生のダラダラ日記

勉強したことをアウトプットします。だらだら読んでいただけると助かります。

SGDを使うにあたってのハイパーパラメータの設定(論文紹介③ Control Batch Size and Learning Rate to Generalize Well: Theoretical and Empirical Evidence)

概要

深層学習において、確率的勾配降下法(SGD)はOptimizerとして良い結果を出しており、SGDをより良く動かすためにハイパーパラメータの調整が必要。複数あるハイパーパラメータのうち、特にバッチサイズ(Batch Size)と学習率(Learning Rate)に着目し、どのように設定すべきかを解析的に考えた論文。数値解析の結果、バッチサイズの大きさSと学習率ηの比S/ηが小さいほどより良い結果となる。

 

papers.nips.cc

 

予測損失と経験損失

本来最小化したい損失は予測損失である。

f:id:Parco1021:20200930015555p:plain

しかし、データの分布Dがわからないため予測損失と近似することのできる経験損失を用意する。

f:id:Parco1021:20200930015658p:plain

できるだけ経験損失が予測損失と近くなるようにアルゴリズムを設定したい。以後、経験損失を最小化することを目的とする。

 

解析的証明(略)

※具体的な証明は別で記事にする…かもしれません※

経験損失と予測損失の差(≒アルゴリズムの良さ)の変数部分をIと置く。また、バッチサイズと学習率の比をk(=|S|/η)と置き、Iをkで微分すると以下になる。

f:id:Parco1021:20200930014428p:plain

パラメータ数dが十分に大きい、具体的に以下の条件を満たすと仮定すると∂I/∂kは常に正となる。

f:id:Parco1021:20200930015120p:plain

この時、変数kはS,η>0より予測損失と経験損失の差はk>0で単調増加である。よってバッチサイズと学習率の比が予測損失と経験損失の差と正の相関がある。つまりaccuracyとは負の相関があるということでありkが小さいほどより良い結果が得られると期待できる。この時、むやみにkを小さくすれば良いというわけではなく、あくまで上記のdの範囲内であることに注意。

 

実験

  • モデル…ResNet-110,VGG-19
  • データセット…CIFAR-10,CIFAR-100
  • バッチサイズ…16,32,48,64,80,96,112,128,144,160,176,192,208
  • 学習率…0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.10,0.11,0.12,0.13,0.14,0.15,0.16,0.17,0.18,0.19,0.20
  • エポック数…200

以上の実験設定でテスト誤差(accuracy)を比較。スピアマンの順位相関係数(SCC)を求める。

 

実験結果

Ⅰバッチサイズとaccuracy

表左部の学習率で固定し、バッチサイズとaccuracyでSCCを取る。SCCが全てのケースで-1.0付近なのでバッチサイズとaccuracyは負の相関がある。

f:id:Parco1021:20200930010858p:plain

 

Ⅱ 学習率とaccuracy

表左部のバッチサイズで固定し、学習率とaccuracyでSCCを取る。SCCが全てのケースで1.0付近なのでバッチサイズとaccuracyは正の相関がある。

f:id:Parco1021:20200930011151p:plain

 

Ⅲ バッチサイズと学習率の比とaccuracy

横軸にBSとLRの比(=k)、縦軸にaccuracyをとると負の相関があることがわかる。

f:id:Parco1021:20200930011353p:plain

f:id:Parco1021:20200930011406p:plain

 

まとめ

数値解析と実験結果から、バッチサイズと学習率の比が予測損失と経験損失の差と正の相関(=accuracyと負の相関)があることがわかった。よってSGDで学習率を行う時はバッチサイズを小さく、学習率を大きくすると結果が良くなると期待できる。しかし、パラメータの制約等があるためむやみに大きくor小さくすれば良いというわけではない。

便利なPythonのリスト内包表記

最近、競プロみたいな問題をPythonで解いたりしているのですが、その時にデータの入出力周りでリストをよく扱います。いたずらにfor文とappend()メソッドを用いるとコードが冗長になってしまうのでリスト内包表記を用いるのですがちゃんと調べたことがなかったので調べて備忘録としてまとめます。

 

リスト内包表記のメリット・デメリット

  • コードが短くなる
  • 実行速度が上がる
  • Pythonわかってる風になれる
  • あまりディープな表記にすると可読性が著しく下がる

シンプルなリスト内包表記

元データ

for文
data = 
for i in range(10):
    data.append(i)
print(data)
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
リスト内包表記

[式 for 変数 in イテラブルオブジェクト]といった形です。上記のfor文記法と比較するとわかりやすいと思います。

data = [i for i in range(10)]
print(data)
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
補足

上記の例ではrange()から1つずつ要素を抽出しましたが、そのままlist()関数でリスト化できます。

data = list(range(10))
print(data)
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

リストの型を変える

先ほどのリストの各要素はint型です。それをstr型に変更します。

for文
data_str = 
for i in data:
    data_str.append(str(i))
print(data_str)
#['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
リスト内包表記
data_str = [str(i) for i in data]
print(data_str)
#['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
補足

map関数を使うことで同様の処理をすることができます。

data_str = list(map(str,data))
print(data_str)
#['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

 

if文のあるリスト内包表記

if文のみ

for文
data_if = 
for i in data:
    if i == 2 or i == 8:
        data_if.append(i)
print(data_if)
#[2, 8]
リスト内包表記

[式 for 変数 in イテラブルオブジェクト if文]といった形です。

data_if = [i for i in data if i == 2 or i == 8]
print(data_if)
#[2, 8]

if-else

まず、先ほど作成したdata_strに要素を追加します。

data_str.append('G')
print(data_str)
#['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'G']
for文

int型への変更が可能であるならばint型にし、不可能ならばそのままにするプログラムです。

data_ifelse = 
for i in data_str:
    if i.isdigit():
        data_ifelse.append(int(i))
    else:
        data_ifelse.append(i)
print(data_ifelse)
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'G']
リスト内包表記

先ほどのif文と位置が異なります。

[Trueの式 if 式 else Falseの式 for 変数 in イテラブルオブジェクト]と書きます。

elif文はif-elseを組み合わせて記述することができますが、可読性が落ちてしまうので辞めた方がいいかもしれません。

data_ifelse = [int(i) if i.isdigit() else i for i in data_str]
print(data_ifelse)
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'G']

 

まとめ

今回はPythonのリスト内包表記についてまとめました。内包表記はリストだけでなく、dict型やset型にも同様に使えるので試してみてください。繰り返しになりますが、ここで挙げた以上の複雑な処理を内包表記で書くととても読みにくくなってしまうので注意が必要です。実行速度が上がるとメリットで書きましたが、そこまで大きな差はなく、これぐらいを気にするのならばリストではなくnumpy配列等を使った方がよほど早くなります。

 

 

言語処理100本ノック2020 第4章 Pythonでの解答例

前章↓↓

parco1021.hatenablog.com

 

第4章 形態素解析

まず、与えられたneko.txtをMeCabを使って形態素解析します。MeCabの導入等は別途調べてみてください。形態素解析するコマンドは以下の通りです。

mecab neko.txt --output neko.txt.macab

 

30.形態素解析結果の読み込み(31日目|9月4日)

形態素解析結果(neko.txt.mecab)を読み込むプログラムを実装せよ.ただし,各形態素は表層形(surface),基本形(base),品詞(pos),品詞細分類1(pos1)をキーとするマッピング型に格納し,1文を形態素マッピング型)のリストとして表現せよ.第4章の残りの問題では,ここで作ったプログラムを活用せよ.

まず、各行をタブ(\t)区切りで分割します。文末文字(EOS)のみである行があるため、それを除くために分割した長さが2である場合にのみ適用します。分割した後の方を次は','区切りで分割し、それぞれ求められたキーとマッピングします。

 

31.動詞(32日目|9月5日)

動詞の表層形をすべて抽出せよ.

30で作成した辞書型のデータを使います。まず、動詞の重複等が考えられるのでset()を用いて重複する要素を除きます。

 

32.動詞の原形(33日目|9月6日)

動詞の原形を全て抽出せよ.

31と同様です。

 

33.「AのB」(34日目|9月7日)

2つの名詞が「の」で連結されている名詞句を抽出せよ.

"名詞"+”の”+"名詞"となっている場所を探します。

 

34.名詞の連接(35日目|9月8日)

名詞の連接(連続して出現する名詞)を最長一致で抽出せよ.

現在参照している品詞が名詞ならばtempに追加し、次の文字を参照する。次の文字も名詞ならば再度tempに追加する。tempの長さが2以上つまり名詞が2連続以上続いているならばそれを出力します。

 

35.単語の出現頻度(36日目|9月9日)

文章中に出現する単語とその出現頻度を求め,出現頻度の高い順に並べよ.

単語と出現回数を対応させたdictを作成します。そのままカウントを開始すると','や'。'をカウントしてしまうため、posが記号のものはdictへ格納しないようにします。未登録の単語が来た場合、新たにdictへ登録し、その後登録未登録に関わらずインクリメントします。

 

36.頻度上位10語(37日目|9月10日)

出現頻度が高い10語とその出現頻度をグラフ(例えば棒グラフなど)で表示せよ.

35で出現頻度順にしたデータが用意されたのでそれを使います。棒グラフにする際、横軸のラベルを単語にします。それが当然日本語であり、そのままグラフにすると日本語は豆腐になってしまうため専用のライブラリ?をインストールします。pip install japanize_matplotlibを実行してから動かしましょう。

f:id:Parco1021:20200910221438p:plain

 

37.「猫」と共起頻度の高い上位10語(38日目|9月11日)

「猫」とよく共起する(共起頻度が高い)10語とその出現頻度をグラフ(例えば棒グラフなど)で表示せよ.

今回、何をどうするかが具体的に問題文で示されていません。自分で何を"よく共起する"か定義する必要があります。僕は"猫"の前後5単語の記号と助詞、及び助動詞を除いた品詞をそれとし、カウントしました。

 

f:id:Parco1021:20200911194504p:plain


 

38.ヒストグラム(39日目|9月12日)

単語の出現頻度のヒストグラムを描け.ただし,横軸は出現頻度を表し,1から単語の出現頻度の最大値までの線形目盛とする.縦軸はx軸で示される出現頻度となった単語の異なり数(種類数)である.

35のデータをヒストグラムにするだけで特に難しいことはないです。

f:id:Parco1021:20200912203730p:plain

 

39.Zipfの法則(40日目|9月13日)

単語の出現頻度順位を横軸,その出現頻度を縦軸として,両対数グラフをプロットせよ.

対数グラフはそれぞれのスケールをlogにすればよいのでplt.x(y)scale('log')とします。余談ですが、Zipf(ジップ)の法則は、ある膨大なテキストの要素を出現頻度順にしたとき、その順位と頻度を乗算すると定数になる法則です。つまり今回は縦軸に出現頻度、横軸に順位としているためプロットしたグラフは1次関数のような形になることが期待されます。

f:id:Parco1021:20200913214349p:plain

 以上で4章は終わりです。お疲れ様でした。

言語処理100本ノック2020 第3章 Pythonでの解答例

第2章↓↓

parco1021.hatenablog.com

 

 

第3章:正規表現

20.JSONデータの読み込み(21日目|8月25日)

Wikipedia記事のJSONファイルを読み込み,「イギリス」に関する記事本文を表示せよ.問題21-29では,ここで抽出した記事本文に対して実行せよ.

今回与えられたデータはよく見るJSONと少し形式が異なります。一行ずつ読み込む必要があるのでfor文で1行ずつ読み込みます。そのタイトルがイギリスであるテキストを出力します。

 

21.カテゴリ名を含む行を抽出(22日目|8月26日)

記事中でカテゴリ名を宣言している行を抽出せよ.

カテゴリを宣言している行は"Catedory:〇〇"という形になっています。[]は正規表現で用いられる記号なので\でエスケープします。そしてCategory:の後は任意の文字がくるので.*とします。python正規表現を用いる時はreモジュールをインポートします。findall()に正規表現と対象データと複数行にマッチさせるためにre.MULTILINEを引数として渡します。

 

22.カテゴリ名の抽出(23日目|8月27日)

記事のカテゴリ名を(行単位ではなく名前で)抽出せよ.

21で抽出したもののうち、":"以降であり、"|*"より前まで抽出したいです。前者は簡単なのですが、後者をどのようにすれば良いのかわかりませんでした。調べた結果、(?:pattern)とすることでそのpatternをマッチした場合、抽出しないことができるそうです。正規表現だけ用いる必要がないならば"|"をreplace()したりすることで実装可能です。

 

 

23.セクション構造(24日目|8月28日)

記事中に含まれるセクション名とそのレベル(例えば”== セクション名 ==”なら1)を表示せよ.

セクションのレベル?はよくわからないのですが、おそらく"=="の長さ-1がレベルなんでしょう。["=の部分","セクション名","=の部分"]のような形でリストに格納します。[^pattern]はpattern以外のものにマッチします。

 

24.ファイル参照の抽出(25日目|8月29日)

記事から参照されているメディアファイルをすべて抜き出せ.

参照されているファイルは"ファイルorFile"の後にファイル名が指定されます。そこを指定して抽出します。

 

25. テンプレートの抽出(26日目|8月30日)

記事中に含まれる「基礎情報」テンプレートのフィールド名と値を抽出し,辞書オブジェクトとして格納せよ.

基礎情報のフィールド名と値は、「|"フィールド名""任意の空白文字"="任意の空白文字""値"」となっています。なのでそれを抽出する正規表現をpatternマッチさせます。\sは任意の空白文字です。それを辞書型に保存します。

 

26.強調マークアップの除去(27日目|8月31日)

25の処理時に,テンプレートの値からMediaWikiの強調マークアップ(弱い強調,強調,強い強調のすべて)を除去してテキストに変換せよ(参考: マークアップ早見表).

指定されたマークアップ早見表を見てみると、強調には「'」が使われています。この数によって強調の度合いが変わりますが、2~5個であるため25のresultに正規表現で指定して削除します。\で'をエスケープし、{n,m}でその数を指定します。それをsub()関数で削除します。

 

27.内部リンクの削除(28日目|9月1日)

26の処理に加えて,テンプレートの値からMediaWikiの内部リンクマークアップを除去し,テキストに変換せよ(参考: マークアップ早見表).

(内部リンクは内部リンク|表示名となっているのでそれを削除すればいいのだがよくわからなかった)

 

28.MediaWikiマークアップの削除(29日目|9月2日)

27の処理に加えて,テンプレートの値からMediaWikiマークアップを可能な限り除去し,国の基本情報を整形せよ.

27で内部リンクは削除できた(?)ので残りの部分の気になるところを削除します。<br>等のhtmlタグを削除しました。

 

29.国旗画像のURLを取得する(30日目|9月3日)

テンプレートの内容を利用し,国旗画像のURLを取得せよ.(ヒント: MediaWiki APIのimageinfoを呼び出して,ファイル参照をURLに変換すればよい)

WikiAPIを使って画像urlを取得します。APIの説明は以下のページから

API:Imageinfo - MediaWiki

Pythonでのサンプルコードもあるので利用します。サンプルでpropはimageinfoが指定されているためそこからさらに画像urlを指定するにはiipopでurlを指定するだけです。結果をjsonで受け取り構造を確認してurlを出力します。

 

これで第3章は終わりです。お疲れ様でした。 

 

 

言語処理100本ノック2020 第2章 Pythonでの解答例

第1章↓↓

parco1021.hatenablog.com

第2章:UNIXコマンド

UNIXコマンドとありますが、筆者は現在WindowsにしかPythonの実行環境をそろえておらず、Linuxもさっぱり使っていないのでコマンドは省略します。他の方がやった解答を見て自分のプログラムの出力が正しいことは確認します。※

 

10.行数のカウント(11日目|8月15日)

行数をカウントせよ.確認にはwcコマンドを用いよ.

テキストファイルをpythonで読み込む方法は何通りかありますが、今回は最も(?)ポピュラーなpandasを使います。pandasで読み込み表示するだけで行数*列数も表示されるのですが、shapeを使ってそれぞれ表示してみます。行数だけでなく、ついでに列数を表示させてみました。

 

11.タブをスペースに変換(12日目|8月16日)

タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.

区切り文字をタブにして読み込んだtxtファイルを区切り文字を半角スペースにして保存します。この時、headerとindexをFalseにしておかないとインデックス番号等がついたまま保存されてしまうので注意が必要です。

元のファイルと出力されたファイルの一部

Get-Content data.txt -last 5
Benjamin M 13381 2018
Elijah M 12886 2018
Lucas M 12585 2018
Mason M 12435 2018
Logan M 12352 2018 Get-Content newdata.txt -last 5
Benjamin M 13381 2018
Elijah M 12886 2018
Lucas M 12585 2018
Mason M 12435 2018
Logan M 12352 2018

全体↓↓

github.com

12.1列目をcol1.txtに、2列目をcol2.txtに保存(13日目|8月17日)

各行の1列目だけを抜き出したものをcol1.txtに,2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.確認にはcutコマンドを用いよ.

 df[0]に1列目がdf[1]に2列目が格納されているのでそれを保存します。

 

結果

github.com

 

13.col1.txtとcol2.txtをマージ(14日目|8月18日)

12で作ったcol1.txtとcol2.txtを結合し,元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.確認にはpasteコマンドを用いよ.

pandasのconcat()関数を使います。デフォルトだと縦方向にマージしてしまうので、axis=1とすることで横方向にマージするよう指定します。

出力ファイルは上記のgithubにあります。

 

14.先頭からN行を出力(15日目|8月19日)

自然数Nをコマンドライン引数などの手段で受け取り,入力のうち先頭のN行だけを表示せよ.確認にはheadコマンドを用いよ. 

コマンドライン引数はsys.argvで受け取ります。ここで注意すべきは第一引数がargv[0]ではなくargv[1]に格納されていることです。受け取ったnはstr型なのでint型に変換し、pandasの関数head()に渡します。


15.末尾のN行を出力(16日目|8月20日)

自然数Nをコマンドライン引数などの手段で受け取り,入力のうち末尾のN行だけを表示せよ.確認にはtailコマンドを用いよ.

 14と同様です。異なる点はhead()ではなく、tail()を使います。

 

16.ファイルをN分割する(17日目|8月21日)

自然数Nをコマンドライン引数などの手段で受け取り,入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.

演算子'//'は除算の結果を切り捨てます。例えば10//3ならば3となります。

 

17.1列目の文字列の異なり(18日目|8月22日)

1列目の文字列の種類(異なる文字列の集合)を求めよ.確認にはcut, sort, uniqコマンドを用いよ.

duplicated().value_counts()は重複する場合にTrueとします。なのでFalseの数が重複しない要素の数です。例えばAnna,Bnna,Cnna,Annaだった場合、False,False,False,Trueとなります。重複しない要素を取り出すにはunique()メソッドを使います。その要素数を数えるにはlen(df.unique())でもいいのですが、nunique()によっても得られます。

 

 

18.各行を3コラム目の数値の降順にソート(19日目|8月23日)

各行を3コラム目の数値の逆順で整列せよ(注意: 各行の内容は変更せずに並び替えよ).確認にはsortコマンドを用いよ(この問題はコマンドで実行した時の結果と合わなくてもよい).

sort_values()を用います。引数にソートしたい対象のコラムを指定します。今回は3カラム目なので2を指定しました。出力は先頭の5行のみとしています。

 

19.各行の1コラム目の文字列の出現頻度を求め、出現頻度の高い順に並べる(20日目|8月24日)

各行の1列目の文字列の出現頻度を求め,その高い順に並べて表示せよ.確認にはcut, uniq, sortコマンドを用いよ.

 value_counts()メソッドを用います。value_counts()は出現回数のカウントだけでなく、デフォルトで降順にソートしてくれるため題意の出力をすることができます。ソートをしたくない場合はvalue_counts(sort=False)とし、昇順にしたい場合はvalue_counts(ascending=True)とします。

これで第2章は終わりです。

 

第3章↓↓

parco1021.hatenablog.com

言語処理100本ノック2020 第1章 Pythonでの解答例

はじめに

夏休みに入り、研究室のゼミも少なくなったりコ〇ナの影響でバイトがなくなったりして暇なので1日1個言語処理100本ノックを第3章までやりたいと思います。第3章までとしているのは、とりあえずデータの前処理を再勉強したいということと短期的な目標としたいからです。8月5日から始めるので順当にいけば9月3日に終わります。しかし、僕のことなので途中で飽きてサボってしまったり、辞めてしまったりするかもしれません。というか多分なります。1週間続けば自分としては立派だと思います。統計学入門も終わってないし…。

nlp100.github.io

毎日別の記事として投稿すると記事数がとても多くなってしまうので各章ごと(全10章)記事として保存します。各章が終わるまで同一の記事に更新していこうと思います。更新する度タイトルの〇日目も変えます。

第1章:事前準備

nlp100.github.io

00.文字列の逆順(1日目|8月5日)

文字列”stressed”の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.

2通りのやり方で解きました。1つ目はreversed()を用いて逆順にし、リスト化した後に結合する方法です。2つ目はスライシングによって直接逆順にします。a[::-1]は"最初から最後まで逆順に1つずつ抜き出す"という意味です。2つ目の方が簡単ですね。

 

01.パタトクカシーー(2日目|8月6日)

「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ. 

00と同様、スライシングで解く手法が最も楽です。たまたま今回は1,3,5,7となっているため、[::2](最初から最後まで2つおきに)とすることで実装することができましたが、1,2,4,6,9…番目を取り出せという問題でも対応することが可能なように泥臭い手法も書いておきました。

02. 「パトカー」+「タクシー」=「パタトクカシーー」(3日目|8月7日)

「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ.

 for文で複数のイテラブルオブジェクトを取得するためにzip()関数を使います。iにパトカー、jにタクシーがそれぞれ入ります。ans_1とans_2を用意しましたが、ans_1はリスト内包表記をとっているので見慣れていない方は何をやっているのかわかりにくいかな、と思ったのでans_2で少し冗長な導出をしました。どちらもやっていることは変わりません。リスト内包表記を簡単に説明すると、[式 for 変数 in リスト等]となります。ans_2にもある通り、これはfor 変数 in リスト等: リスト.append(式)と同じ意味です。

03.円周率(4日目|8月8日)

“Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.”という文を単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ. 

方針としてはまず単語ごとにリストに格納します。しかしこの時","や"."があると文字数がおかしくなるのでこれらを削除します。replace()は第1引数を第2引数に置換します。なので本プログラムのように書くと削除することが可能です。今回、2文字削除したいため2回replace()しています。削除したい文字がより多くなるのならば正規表現によって削除するやり方もあるようなのでそちらにしましょう。リストに格納した後はリストの各要素の長さ(=単語の文字数)を取得します。今回もリスト内包表記を取っています。iに_listに入っている各単語が入り、iの長さを取っています。

04.元素記号(5日目|8月9日)

“Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.”という文を単語に分解し,1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字,それ以外の単語は先頭の2文字を取り出し,取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ. 

今回は辞書型を作成します。01.のように規則的に取り出す対象が並んでいないので対象のインデックス番号のリストを作成します。 enumerate()は2つの変数に値を入れていきます。1つ目にはインデックス番号、2つ目には対象オブジェクト(リスト等)の中身です。対象の単語ならば1文字目([0])、そうでないならば2文字目まで([:2]=0,1)を取り出し辞書へ格納します。

05.n-gram(6日目|8月10日)

与えられたシーケンス(文字列やリストなど)からn-gramを作る関数を作成せよ.この関数を用い,”I am an NLPer”という文から単語bi-gram,文字bi-gramを得よ. 

n-gramとはある文字列をn個の単語や文字で区切ることを言います。ここで問題になっているbi-gramは2-gramです。関数自体は単純なもので引数として受け取ったn-gramのn個ごと文章の最初から区切っているだけです。

06.集合(7日目|8月11日)

paraparaparadise”と”paragraph”に含まれる文字bi-gramの集合を,それぞれ, XとYとして求め,XとYの和集合,積集合,差集合を求めよ.さらに,’se’というbi-gramがXおよびYに含まれるかどうかを調べよ.

まずbi-gramを作成します。05で作成した関数をimportで呼び出します。ファイル名を05.pyとしてので直接importせず、__import__()によって呼び出します。詳しくは以下に書きました。

parco1021.hatenablog.com

そのままだと重複する要素('pa'など)があるため集合として機能しません。そのためset()を用いることで重複する要素を消し、集合演算を行うことのできるようにします。その後は各集合に演算子やメソッドが用意されているのでそれを使うだけです。今回、例として両方とも使っています。'se'があるかどうかはin演算子を使い確認します。

07.テンプレートによる文生成(8日目|8月12日)

引数x, y, zを受け取り「x時のyはz」という文字列を返す関数を実装せよ.さらに,x=12, y=”気温”, z=22.4として,実行結果を確認せよ.

format()メソッドによって文字列内に変数を入れます。あとは特に説明することはないです。

08.暗号文(9日目|8月13日)

与えられた文字列の各文字を,以下の仕様で変換する関数cipherを実装せよ.

・英小文字ならば(219 - 文字コード)の文字に置換
・その他の文字はそのまま出力
この関数を用い,英語のメッセージを暗号化・復号化せよ.

問題文の219が何かわからなかったので英小文字の文字コードをまず調べます。文字コードはord()によって調べることが可能です。"a"が97、"z"が122なので97+122=219となります。つまりa→z、z→aのように暗号化、復号化をします。文字コードから文字への変換はchr()を使います。英小文字か否かの判定はislower()を使います。英小文字ならば暗号、復号化を行いそれ以外だったらそのままにします。結果を見ると大文字の"I"と"."がそのまま出力されており、復号化もできていることがわかります。

09.TypoglycemiaPermalink(10日目|8月14日)

スペースで区切られた単語列に対して,各単語の先頭と末尾の文字は残し,それ以外の文字の順序をランダムに並び替えるプログラムを作成せよ.ただし,長さが4以下の単語は並び替えないこととする.適当な英語の文(例えば”I couldn’t believe that I could actually understand what I was reading : the phenomenal power of the human mind .”)を与え,その実行結果を確認せよ.

入力を単語とする関数typo()を作ります。受け取った単語の長さが5以上ならば(元の単語の1文字目)+(真ん中をシャッフル)+(元の単語の最後)のリストを作り、join()で結合したものを返します。

これで第1章は終わりです。

第2章↓↓

parco1021.hatenablog.com

Pythonのスクリプトをimportするときにエラーが出たのでメモ

はじめに

Pythonスクリプトのimportでファイル名関係でエラーが出たのでメモ

問題

例として以下のファイルをimportしたいとします。

def test():
    a = 'test'
    return a

〇〇.pyである時、普通ならば単に

import 〇〇

とすれば良いです。しかしファイル名が

①"-"(ハイフン)を含む

②数字から始まる

のいずれかを満たすと「SyntaxError: invalid syntax」と出ます。

解決策

今回、例として0a-a.pyを呼び出します。

module = __import__('0a-a')
print(module.test()) #test

__import__()を使ってスクリプトを呼び出します。これはimport 0a-a as moduleと同じように扱うことが可能です。

さいごに

本来、このような手法を使わなくても良いようにファイル名には気を付けましょう。どうしてもハイフンが含まれているファイル名を使わなければならない時にのみ使うようにした方が良さそうです。

 

 

 

【パズドラ】星5キャラで使えるキャラを解説する

はじめに

今回は攻略や周回、ランキングダンジョンなどの面からフェス限を除く星5キャラのうち、攻略や周回、ランキングダンジョンなどで使ったことがあるor使われているのを見たことがあるキャラをピックアップし、その使い道を紹介したいと思います。超転生をしているキャラは使われていなくても簡単に紹介します。どんなキャラでも超転生等で化ける可能性があるので各1体ずつは確保すべきなのは当然なのですが、無料100連があり全てをキープしておくとボックスがいっぱいになってしまう人も少なくなかったと思います。そういった方の取捨選択の判断材料になれば幸いです。なのであくまで現時点(2020年6月辺り)での評価です。解説は筆者の独断と偏見によるものです。

○○神などの名称は以下のgame8さんのサイトを参照しています。

game8.jp

キャラと評価

西洋神

・ミネルヴァ

超転生しているがなんとも言えない性能。さらに今は火暗黒時代なのでどう足掻いても使わない。スキブ1かつ7c無しなので火の大魔女が壊れても使わないと思う。使ったことがない。

ネプチューン

毒+エンハンススキルでニムエ降臨周回で使った記憶。超転生を控えているがスキル的に超転生したところでよほど覚醒が化けないと評価は変わらない。スキルも最悪リリスで良い。いらない。

・セレス

超転生を控えている。スキルが6ターンで打てるので覚醒が化ければスキルのポンコツさはアシストで補強することができる。転生のままではまず使わない。

・ヴィーナス

f:id:Parco1021:20200528223329j:image

イラストが可愛い。7c*3、L字*2、追い打ちかつ光の攻撃タイプなのでアリスファスカで使うことができる。スキルも3Tで指延長が打てるので環境に適している。イラストが可愛い。ただ第一線で活躍しているわけではなく、代用で使われることが多い。1体は作ってもいいと思う。イラストが可愛い。

・ハーデス

グラビティでたまに使われているのを見る。消せないドロップ回復も持っており、さらに転生で暗闇耐性+を持っているので超転生したら普通に期待できる。キープすべき。

新西洋神

・ヘルメス

f:id:Parco1021:20200531200434j:image

新西洋神唯一の超転生キャラ。使われているのをあまり目にしないが、スキブ3、7c*2、無効貫通*2と単体スペックは高いと思う。水パにとりあえず入れればそれっぽい仕事をしてくれる。使える。

・その他(アレス、アルテミス、アポロン、ペルセポネ)

ヘルメスと同様の系統の超転生した場合、全員無難に強い性能になる。ただ他神を見る限り同系統の性能になる可能性は低いので何とも言えない。現性能では使わない。アルテミスのイラストに期待大。

西洋神シリーズ第3弾

・全員

キャラが揃ってない場合の属性吸収枠で使ったことがある。

和神

カグツチ

追い打ちマン。金剛夜叉明王大威徳明王がいるならいらない。どちらもいないなら周回で使う場合があるのでとっておきましょう。基本はいらないです。

・オロチ

超転生したが使わない。いらない。オワリ。

スサノオ

f:id:Parco1021:20200531200417j:image

超転生してスキブ3、暗闇+、ドラゴン悪魔キラーがついた。バランスタイプなのでどんなキラーも潜在でつけることができる。スキルも3ターン半減&ヘイストなので無難に強い。とりあえず入れて強いキャラ。作りましょう。

・アマテラス

f:id:Parco1021:20200528223334j:image

イラストが可愛い。スキルもステータスも覚醒もかなり回復に寄っている。PTの回復力が低い時、回復力を補うために入れられているのを見る。作っておきましょう、イラストが可愛いので。

・ヨミ

元祖指キャラ。闇メタ環境はよく見た。今は全く使われていない。元祖回復キャラのアマテラスが超転生でああなったので超転生したら指お化けになるかもしれない。指お化けになっても使われるかと聞かれると使われないかもしれない。ただ性能は尖がる可能性が高いのでキープしてもいいかもしれない。基本いらない。自分は個人的に好きなキャラ。

書いている途中で超転生がきた。やはり指お化けになってお邪魔+も貰えた。思っていたより使える性能なので作ろう。

新和

イザナギ

さんたーんでえんはんすがうてる!!

インド神

・シヴァ

火の大魔女に合わせて超転生が来た場合、そのタイミングと性能に合わせられそう。勘だけど。

ラクシュミー

アマテラスと同様回復に性能がよっている。しかしアマテラスよりも回復性能は低い。しかしマシン、ドラゴン、悪魔の3種キラーがあり超覚醒で7cをつけられるため火力も一定期待できるが使われているのを見たことがない。

パールヴァティー

無効貫通*2、超追撃*3とかなり尖っているが、現環境で超追撃はほぼ使われていないかつ無効貫通を組まないと火力が出ないので使われていない。使っているのはYouTuberぐらい。

・インドラ

f:id:Parco1021:20200531200348j:image

つよい。スキルは回復力エンハ、激減+ヘイストと環境に適しておりさらに毒耐性+、スキブ4と覚醒も強い。さらに光攻撃タイプなのでファスカのサブに入れやすい。作りましょう。

ヴリトラ

超転生待ち。だと思ったらきた。

スキブや列強も多く、スキルも全体ブレス。どこか周回で使うと思う。作ろう。

新インド神

ガネーシャ(超究極)

サレーネ茂茂難民。

北欧神

フレイヤ

木闇エンハ+回復力エンハは強い。覚醒は列強化に寄っており現環境で木の列は使わない。しかし超覚醒でお邪魔耐性+がつけられるので全てが惜しい。悪くはないので作っていいかも。

・トール

スキブ5にもできるが、他の覚醒スキルが微妙。無効貫通3(スキブ3)にして無効貫通特化型としても7cが無いため無効貫通を組まないと火力が出ない。エンハンスはアリスでいいしなぁ…。一応光の攻撃タイプ。スキルも合わせて実質スキブ6なので変身パにはよさそう。

 

エジプト神

・ホルス

f:id:Parco1021:20200531200303j:image

スキルターンが短い上にスキブも十分あり、後述するがかなりランダン適正が高いためランダンでめちゃくちゃ使う。転生、超転生どちらも使うが、転生の方がランダン適正が高いので1体しかいない場合は転生で止めておきましょう。

転生/超転生 属性 ガドブレ スキブ L字 封印 2way
転生 火/水 3 2 1
超転生 火/光 3 1 2 ×

ランダンにおいて重要な要素をピックアップして表にまとめました。

①ランダンにおいて水属性が不足することがある。

②封印耐性が不足する時がある

③超転生にはない2wayでポイント稼ぎができる

以上の3点から転生ホルスの方がランダンにおいて優秀。当然超転生ホルスの方が攻略においては優秀だがそもそも攻略において使用されていないため1体しか持っていない場合は転生にしておくべき。

・バステト

スキルターンが短いため、周回編成やランダンで使用したいスキルをアシストされて使われているのを見る。リーダースキルも使いやすい。なんか無難にちょこちょこ使う。

・ラー

f:id:Parco1021:20200531200247j:image

サンバーストナックル!!ポチポチで無限に使うので5体出たら5体取っておくべき。

・アヌビス

f:id:Parco1021:20200531200232j:image

ランダンマジックリン杯の時によく高火力リーダーとして使われる。スキルも軽くて良い。作るべき。

新エジプト神

・セト

転生して7c*3になった。火が弱いので使われていないが火の大魔女次第ではワンチャンある…かも?

・ネフティス

極連の周回で使った。列強化とターンの短い列変換が偉い。

天使

・ラファエル

超転生したがなんともいえない性能におちついた。

・ルシファー

f:id:Parco1021:20200531200139j:image

50%以下強化*3、スキブ3で周回編成でよく使う。他にも単体ブレスで使ったりした。作りましょう。

新天使

・リュエル

今は使われていないが、毒耐性+、スキブ4とスペックは高い。木属性が弱いだけでワンチャンある。

・アリエル

f:id:Parco1021:20200531200118j:image

お邪魔耐性+、スキブ4、光攻撃タイプ。強い。リュエルと違って光属性は強い上にファスカのサブにも入れられる。スキルターンも短いので傘等継承させるもよし、4Tに一回光ドロップを4個生成させるもよしで普通に強い。

・ルミエル

暗闇耐性+、スキブ4、無効貫通*2で強いと思うが使われているのを見たことがない。が、闇属性が強いのでどこかで使うポン入れしても強いと思う。

悪魔

アスタロト

オールアスタロトで裂界攻略してるのを見たのでポテンシャルはあると思う。過激派オタクが多いキャラなのでとっておきましょう。

・堕ルシ

f:id:Parco1021:20200531200104j:image

スキブ4の神キラー*2でさらに潜在で神キラーも振れるのでランダンや周回でしばしば使う。スキルも軽めなので継承で陣打てるのも◎。数体持っていて良い。

四神

・レイラン

7c*3で普通に火力は出るが、無効貫通がないので単色パに入れるかと言われると怪しい。武器は強い。

・カリン

スキブ4。武器は強い。

・メイメイ

7c*2、ドラゴン悪魔キラー。本体を使うかと聞かれたら微妙。武器は強い。

・サクヤ

本体は微妙。武器も他の四神と違いバインド耐性がないことに注意。

・ハク

f:id:Parco1021:20200531200034j:image

2wayお化け。周回で使えそう。武器は強い。

英雄神

超転生がそろそろきそう。それだけ。

三国神

呂布

f:id:Parco1021:20200531200014j:image

リーダースキルがMAX24倍出る火力お化け。50%以下*3で本体も火力が出るため周回でよく使われる。極連も周回できる。

新三国神

貂蝉

f:id:Parco1021:20200531195930j:image

暗闇耐性、スキブ4おまけにL字でまず覚醒が強い。さらにスキルも2ターンで溜まり、覚醒無効2ターン回復、操作延長と普通に強い。2ターンで溜まるので傘との相性も良い。最強星5なので育成しましょう。

戦国神

毛利元就

バランスキラー*2であり、潜在でもバランスキラーが触れる。ランダンや周回で使う可能性がある。使ったことないけど。

明智光秀

回復キラー*2であり、潜在でも回復キラーを振ることができる。YouTuberで使っているのを見たことがないが、自分はちょこちょこランダンで使う。

新戦国神

はい。

星機神

はい。

新星機神

はい。

明王

金剛夜叉明王大威徳明王

f:id:Parco1021:20200531195920j:image

f:id:Parco1021:20200531195914j:image

マルチブースト*2の200倍追い打ちとマルチであれば最大ダメージの追い打ちをすることができる。どちらも使う可能性があるので両方確保。

ケルト

・ブリギッド

マシンキラー*3なのでランダンで使うかも。使ったことないけど。

・ルー

元祖吸収無効キャラ。今は使わないけど吸収無効いないなら取っておこう。

メソポタミア

ギルガメッシュ

ルーと同じ

忍者

全員武器化すると3種耐性の1つ*2耐性武器となるため武器が少ない人は武器を確保。

ライダー

はい。

パズドラZ

・アヴァロンドレイク

f:id:Parco1021:20200531195909j:image

木・光の二色陣で主に継承させてランダンで何度も使った。確保しよう。

ヴァルキリー

各色ヴァルキリーはドット進化することで攻撃キラー*3と各耐性+をつけることができきる。攻撃キラーを3つ付けられるキャラはヴァルキリーを除くと数体しかいない。さらに7cと無効貫通がついているのはヴァルキリーシリーズだけ。ランダンなど、いつ使うことになってもおかしくないから取っておく。

勇士

・ショーテル、クレイモア、正宗、コピス、ツヴァイハンター

全員キラー武器になる上スキルも唯一性があるものなので取っておく。

幻獣ライダー

はい。

宝石姫

・カラット

f:id:Parco1021:20200531195856j:image

最強エンハンス。コレは通常ガチャでしか出ないので所謂"カラット難民"が続出している。

・その他(シルク、カメオ、ファセット、シーン)

それぞれエンハンス武器になるので1体はとっておく。

伝説の英雄

はい。

 

おわりに

とりあえず、このページにおいて解説しているキャラはとっておきましょう。特に画像付きのキャラは使用頻度がまあまあ高いのでとっておくだけでなく、最終進化の状態までしておくと良いです。異論は受け付けます。コメントなどで御意見、御質問お待ちしています。適宜訂正していきたいと思いますので宜しくお願い致します。

統計学入門(基礎統計学Ⅰ)第8章演習問題

第8章

8.1

確率変数X_1,X_2,...X_nは独立で、ベルヌーイ分布[tex: Bi(1,p)に従っている。中心極限定理から、

 P(L≦X_1+X_2+...+X_n≦U)-0.95

となる L,Uを定め、 n=700,p=0.4のときのL,Uの値を求めよ。

ベルヌーイ分布の期待値、分散は6章のものを使用します。

平均で引いて標準偏差で割る標準正規化を施すと平均0,分散1の標準正規分布に従うため、正規分布表を使用することができます。

f:id:Parco1021:20200524002855j:image

 

8.2<ランダムウォーク>

確率変数X_1,X_2,...,X_nは独立で、確率分布

P(X_i=1)=p,P(X_i=-1)=q (i=1,2,...n)

に従っている。ただし、q=1-p

(1)nが大きいとき、 S_n=X_1+X_2+...+X_nの近似的確率分布を求めよ

 

f:id:Parco1021:20200524002900j:image

 

8.3

昨シーズンを2割8分の打率で終わった打者が、今シーズンもこの確率でヒットを打つものとし、450打席であるとすると、3割バッターになれる確率はどれくらいか、またこのバッターが、確率0.2以上で3割バッターになろうとすると、打率はどのぐらいでなければならないか。

 

f:id:Parco1021:20200524002904j:image

このような結果になるのは面白いです。

 

 

統計学入門(基礎統計学Ⅰ)第7章演習問題後半

第7章後半

前半↓↓

parco1021.hatenablog.com

7.6<2次元正規確率変数の生成>

X,Yは独立で、ともに標準正規分布N(0,1)に従う確率変数とする。

(1)定数cを適当に選んでX,cX+Yの相関係数が0.5となるようにせよ

(2)同じく、ρとなるようにせよ

(3)X,Yから、与えられた2次元正規分布 N( (0,0),(σ_1^2,σ_2^2,σ_1σ_2ρ)) に従う確率変数U,Vを作れ

(3)は(2)を利用して解きます。(2)を利用せずにU=aU'+b,V=cV'+dとおいても解けますが、せっかくなので(2)を使いましょう。

f:id:Parco1021:20200523034538j:image

 

7.7<システムの直列と並列>

 システム S_1,S_2の寿命X_1,X_2 は確率変数であって独立で、指数分布 Ex(λ) に従っている。

(1) S_1,S_2が並列に結合されている全体システムの寿命Yの確率分布を求めよ

(2)同じく、直列の場合はどうか

答案に書いてある通りなのですが、並列システムは全てのシステムがダウンした時にそのシステムがダウンし、直列システムはどれか1つでもシステムがダウンするとそのシステムがダウンします。ゆえに(並列システム)=Max(各システム)、(直列システム)=Min(各システム)となります。

f:id:Parco1021:20200523034655j:image

 

7.8<極値統計学>

確率変数 X_1,X_2,...,X_nは独立で、同一の確率分布に従っている。その密度関数をf(x),累積分布関数をF(x)とする。最大値、最小値

U=Max(X_1,X_2,...,X_n), V=Min(X_1,X_2,...,X_n)

のそれぞれの累積分布関数および密度関数を

(1)f(x)が[0,1]上の一様分布の場合

(2)f(x)が指数分布Ex(λ)の場合

(3)f(x)が一般の連続分布の場合

のそれぞれの場合に対して求めよ。

7.7と同じ解き方をします。

f:id:Parco1021:20200523034557j:image

 

7.9<たたみこみの計算>

たたみこみの直接計算によって、二項分布、ポアソン分布、正規部ぬの再生性を証明せよ。すなわち、 X,Yが独立で

(1)pが等しい二項分布に従うならば、X_1+X_2も二項分布に従う

(2)ポアソン分布に従うならば、X_1+X_2ポアソン分布に従う

(3)正規分布に従うなら、X_1+X_2正規分布に従う

ことを証明せよ 

(1)において、ヴァンデルモンドの畳み込みを使用しています。これについては本記事では触れないので以下のサイトを参照してください。

mathtrain.jp

(3)の最後はガウス積分を用いても良いのですが、筆者は正規分布積分(=1)として考えています。本質的にはどちらも変わりません。計算量がとても多いですが頑張りましょう。

f:id:Parco1021:20200523034604j:image

f:id:Parco1021:20200523034608j:image

f:id:Parco1021:20200523034621j:image

 

 

 

統計学入門(基礎統計学Ⅰ)第7章演習問題前半

第7章前半

7.1<線形演算と分散>

次の分散の式を証明せよ

(1){\displaystyle V(X+Y)=V(X)+V(Y)+2Cov(X,Y) }

(2){\displaystyle V(aX+bY)=a^2V(X)+b^2V(Y)+2abCov(X,Y) }

{\displaystyle Cov(X,Y)=E(XY)-E(X)E(Y) }を用いて証明します。

(2)は{\displaystyle V(aX)=a^2V(X) }であることに注意してください。

f:id:Parco1021:20200518034510j:image

 

7.2<ポートフォリオ>

(1){\displaystyle E(R_ρ),V(R_ρ) }を求めよ

(2){\displaystyle V(R_ρ) }の最小値を求めよ

(3)省略

通常通り期待値と分散を求めます。そして(2)ではその求めた分散をxについての関数として考えることで微分して最小値を求めます。

ここで注意すべきなのは分散の関数が下に凸であることと、最小値をとるxの値が相関係数と分散によって変わってしまうことです。本当に下に凸であるか確かめてみてください。

f:id:Parco1021:20200518034520j:image

f:id:Parco1021:20200518034529j:image

 

7.3<独立と無相関> 

2つのつぼA,Bの中に3個のボールを投げ入れる。つぼAの中に入ったボールの数をX,ボールの入っているツボの数をYとするとき、X,Yの同時確率分布を求めてXはYとは無相関であるが、独立でないことを示せ。

XとYが無相関⇔Cov(X,Y)=0であることと、XとYが独立でない⇔P(X,y)≠P(X)P(Y)であることを目標にして解いていきます。 

f:id:Parco1021:20200518034557j:image

7.4<秤量問題> 

2つの物体A,Bの重さma,mbを測りたい。A,Bそれぞれを片側に乗せて測る方法(Ⅰ)と一方にA,B両方を載せて重さの和を測り、天秤の両方に乗せて差を測りそこから算出する方法(Ⅱ)がある。どちらがより優れた測定方法か答えよ。ただし、天秤の測定誤差の分散はつねに{\displaystyle σ^2 }である。

 

f:id:Parco1021:20200518034602j:image

7.5<相関係数の線形不変性>

U=aX+b,V=cY+d(ac>0)のとき、

{\displaystyle ρ_{UV}=ρ_{XY} }を証明せよ

f:id:Parco1021:20200518034606j:image

 

 

 

【参考書感想】実践GAN ~敵対的生成ネットワークによる深層学習~ (Compass Booksシリーズ)

はじめに

今回は実践GANという参考書の感想を書いていきます。

 

 

概要

2020年2月26日に初版が発行されたばかりの新しい本です。原著は海外のものであり、それを日本語訳した参考書となっています。情報は2020年1月時点のものであると書かれています。

内容についてはタイトルにもある通りGAN周りの題材のみ扱っています。Python,Kerasを用いてソースコードは書かれており、数学的な解説はほとんどありません。

GANについて基礎から応用まで扱われています。どのような内容かは目次を見てください。

次は対象者です。Pythonの経験が2年程度、機械学習についての知識があること、線形代数などの大学数学の基礎ができていることが挙げられていましたが、これについては後々感想にて書きます。

目次

Part 1 GANと生成モデル入門

  • 1章 はじめてのGAN
  • 2章 オートエンコーダを用いた生成モデル
  • 3章 はじめてのGAN:手書き文字の生成
  • 4章 深層畳み込みGAN: DCGAN

Part 2 GANの発展的な話題

  • 5章 訓練とよくある課題: GANをうまく動かすために
  • 6章 プログレッシブなGAN
  • 7章 半教師あり学習
  • 8章 条件付きGAN
  • 9章 CycleGAN

Part 3 ここからどこへ進むべきか

  • 10章 敵対的サンプル
  • 11章 GANの実用的な応用
  • 12章 将来に向けて

感想

まず、訳本であるため多少は仕方がないのですがとても読みにくい印象を受けました。英語のような言い回しがそのまま訳されて記述されていました。Google翻訳かな?って感じです。

対象読者について上で述べましたが、あそこまでの知識を必要としないと思います。ソースコードは記されているのですが、最低限動く程度のものであるためそもそも動かす必要がありません。また、数学的な解説はとても少なく、線形代数学の知識も要しません。しかしさすがに機械学習の知識(損失関数が何か、誤差逆伝播法とはどのようなものか)などがわからない場合は本書を読むのは苦しいと思います。よってPythonのコーディング力や数学の知識は必要ありません(そもそも機械学習の知識にはそれらが含まれているような気もしますが…)。

内容についてです。本書は250ページほどある厚い本ですが、扱うテーマが多いです。ゆえに1つ1つの内容は浅いものとなっています。そのため特定のテーマについて深く知るためには追加調査が必要です。

最新のものと謳われていますが、あまり2019年あたりのものはなかってのでそこは注意してください。

 

総括です。これからGANを勉強しよう!って方は買っても良いと思います。読み進めていく中で自分の興味ある題材は別途Qiitaとかの記事を読み深く理解する、といった読み方がおすすめです。色々なGANのモデルを知ることができるので理解のための教科書というよりもこんなものがあるということを知るキッカケとなる本であると捉えたほうがいいです。4000円する上に読みにくい、得られる対価を考えるとあまり勧められませんが…。

 

 
 

統計学入門(基礎統計学Ⅰ)第6章演習問題後半

 

前回↓↓

parco1021.hatenablog.com

第6章後半

6.6<記憶喪失性と瞬間故障率>

(1)確率変数Xが指数分布に従う時、

{\displaystyle P(X>a+b|X>a)=P(X>b) }

を示せ。またこの意味は何か

(2)指数分布{\displaystyle Ex(λ) }の密度関数をf(x),累積分布関数をF(x)とする。関数

{\displaystyle λ(x)=\frac{f(x)}{1-F(x)} }は定数となり、λとなることを示せ。

(1)aというシステムが動いている状態でaもb双方のシステムが動いている確率は、システムbが動いている確率と等しいといった内容である。

つまり現在の動作(システムb)は、過去の動作(システムa)に関わらないといえる。

(2)は関数を代入するだけ。

 

f:id:Parco1021:20200507223707j:image

 

6.7<正規分布のパーセント点>

正規分布表を見るだけなので省略

 

6.8<確率分布のモード> 

ベータ分布のモードを求めよ 

確率分布のモード、つまり最頻値は確率密度関数f(x)の値の最大値をとるxを求めよと言い換えることができる。ゆえに高校数学でやったように確率密度関数微分した。

 

f:id:Parco1021:20200507223722j:image

厳密にはf(x)の増減表を書くべきなんでしょうか…。でも確率密度関数は負の値取らないからいらない気もします。 

 

6.9<ワイプル分布> 

ワイプル分布の累積分布関数を求めよ

積分布関数を求めたいので、ワイプル分布の密度関数

{\displaystyle f(x)=(bx^{b-1}/a^b)exp{(-(x/a)^b)} (x≥0)}をxについて積分すればよい。

 

f:id:Parco1021:20200507223736j:image

6.10<正規分布、指数分布の尖度>

モーメント母関数の展開式から、正規分布、指数分布の尖度を求めよ

方針としてはモーメント母関数をまずは求めます。次にそれをマクローリン展開し、恒等式を解くことで尖度を求めるために必要な各μをもとめる、といったものです。

 

f:id:Parco1021:20200507223747j:image

f:id:Parco1021:20200507223755j:image

 問題文にはただの正規分布としか書かれていなかっらので面倒だなって思っていたのですが、解答を見ると標準正規分布でよさそうです。

 

 

 

 

 

統計学入門(基礎統計学Ⅰ)第6章演習問題前半

はじめに

5章までTexを使って記述していたためとても時間がかかってしまいました。自分で解いたものを再度書き直すことは効率が悪いため今回からは解いたものを写真で撮り、貼り付けます。自分自身解答しながら書いているため字が読みにくいこととスキャナーを持っていないため直撮りとなってしまいそもそも見にくくなる可能性があります。ご了承ください。ここが読みにくい等ありましたら、ブログ下部お問い合わせフォームまたはコメントでお聞きください。

第6章

6.1<二項、ポアソン分布の分散>

二項分布、ポアソン分布のおのおのに対し、分散の式を証明せよ 

どちらも基本方針は

{\displaystyle V(X)=E(X^2)-E(X)^2 }

から求めることとしています。また、前提条件として期待値{\displaystyle E(X) }は得られているものとします。

解答の①はそれぞれ二項分布、ポアソン分布の確率密度関数を示しているのでそのΣをとると1になることに注意してください。

f:id:Parco1021:20200428182452j:image

f:id:Parco1021:20200428182501j:image

 

6.2<急患用ベッド数>

ある病院において常に4人の空きベッドを確保している。ここへ収容される急患数Xがλ=2.5のポアソン分布に従う時、ベッドが不足する確率を求めよ 

{\displaystyle P_0(2.5) }に従い、ベッドが不足する、つまり急患が5人以上となる確率{\displaystyle P(X≥5)=1-P(X≦4) }を求めます。

f:id:Parco1021:20200428191506j:image

 

6.3<負の二項分布> 

負の二項分布を導出せよ 

f:id:Parco1021:20200428191527j:image

 

6.4<Odd man out> 

(1) コインの表、裏の確率をそれぞれp,q(=1-p)とする。これらのコインn個を同時に投げる時、ちょうど1個だけが他のn-1個と異なった結果となる確率Pを求めよ。なお、n≥3とする。

(2) n人いて、各自コイン1枚を同時に投げる操作を繰り返し、ちょうど1人だけが他のn-1人と異なる結果となるまでの繰り返し数の期待値を求めよ。

(2)は1回成功するまでの確率分布であるため幾何分布となる。その期待値である{\displaystyle \frac{1}{p} }を用いる。

 

f:id:Parco1021:20200428191605j:image

 

6.5<密度関数の規格化定数>

f(x)が確率密度関数となるように定数cを求めよ。また、この確率分布の期待値、分散、歪度、尖度を求めよ。

f(x)は解答用紙に書いてある通りです。今回は確率密度関数が偶関数であったためそれぞれ導出するのが簡単でした。

 

f:id:Parco1021:20200428191616j:image

 

続き↓↓

 

parco1021.hatenablog.com

 

 

 

統計学入門(基礎統計学Ⅰ)第5章演習問題後半

前半↓↓

parco1021.hatenablog.com

第5章後半

5.5

正n面体で1,2,...nの乱数を発生させる。乱数の期待値と分散を求めよ。

ただし正n面体は4,6,8,12,20を表す。 

密度関数は1~nが一様に並んでいるため{\displaystyle f(k)=\frac{1}{n} }となる。

ゆえに期待値は{\displaystyle E(X)=\sum_{k=0}^n k*\frac{1}{n}=\frac{n(n+1)}{2}*\frac{1}{n}=\frac{n+1}{2} } 

また、同様に

{\displaystyle E(X^2)=\sum_{k=0}^n k^2*\frac{1}{n}=\frac{(n+1)(2n+1)}{6} }

よって分散は

{\displaystyle V(X)=\frac{(n+1)(2n+1)}{6}-\frac{(n+1)^2}{4}=\frac{n^2-1}{12} }

5.6<一様分布の平方変換>

確率変数Xが[0,1]上の一様分布に従うとき、{\displaystyle X^2 }の累積分布関数、密度関数、期待値、分散を求めよ 

積分布関数は省略します。密度関数を積分するだけで累積分布関数が求まるので。

{\displaystyle y=g(X)=x^2 }から、{\displaystyle x=\sqrt{y}(x≥0) }より

{\displaystyle \frac{dx}{dy}=\frac{1}{2\sqrt{y}} }

よって密度関数h(y)は

{\displaystyle h(y)=f(g^{-1}(y))\frac{dx}{dy} }

xの密度関数は{\displaystyle f(x)=1 }より

{\displaystyle h(y)=1*\frac{1}{2\sqrt{y}}=\frac{1}{2\sqrt{y}} }

次は期待値です。

{\displaystyle E(y)=E(g(x))=\int_0^1 yh(y)dy\\=\int_0^1g(x)f(x)dx=\frac{1}{3}}

分散は

{\displaystyle V(y)=V(g(x))=\int_0^1(y-E(y))h(y)dy\\=\int_0^1(g(x)-E(y))^2f(x)dx=\frac{4}{45} }

5.7<正規分布の平方変換>

正規分布Xがμ=0.σ=1に従うとき、{\displaystyle X^2 }の累積分布関数、密度関数、期待値、分散

基本的に先ほどと同様なので大幅に省略して書きます。

{\displaystyle f(x)=\frac{1}{\sqrt{2π}}\exp{-\frac{x^2}{2}} }

{\displaystyle y=g(x)=x^2 }

{\displaystyle x=±\sqrt{y} }

今回の正規分布Xはx=0において対象であるため、x≥0(x=+√y)とし、2倍する。

{\displaystyle h(y)=2*\frac{e^{-\frac{y}{2}}}{\sqrt{2π}}*\frac{1}{2\sqrt{y}}=\frac{e^{-\frac{y}{2}}}{\sqrt{2πy}} }

すみません、さすがにTEXを書くにも読むにも疲れたので期待値と分散は省略します。ガウス積分を用いるので注意してください。

5.8

積分布関数は{\displaystyle F(x)=P(X≦x)で定義されるが、G(x)=P(X<x)) }で定義される場合どこが異なるか、2項分布の例で示せ。

A.左連続となる。

数式的な証明は筆者はできないが、≦であった場合、限りなくlim[x→x0]F(x)とF(x0)が異なることは離散型確率分布の累積分布関数を考えればわかるであろう。しかしこれを<とすることでx0へはそもそも定義されない。ゆえに左連続といえるのではと解釈した。

ここは自信がないためまた理解できたら記述する。

https://mathtrain.jp/sayuulimit

http://user.numazu-ct.ac.jp/~hmatsu/14resume06.pdf

スポンサーリンク