tdualのブログ 2021-07-12T22:11:16+09:00 tdualdir Hatena::Blog hatenablog://blog/10328749687179368134 1億円を調達したのに、しくじった無能経営者のワイ hatenablog://entry/26006613786136364 2021-07-12T22:11:16+09:00 2021-07-12T22:11:16+09:00 株式会社MatrixFlow 代表取締役 tdualです。調子に乗っているこの記事から色々状況も変わりました。 tdual.hatenablog.com 1番のイベントは、昨年の10月末に初調達でプレシリーズAで1億円の調達をした事です。prtimes.jp 1億円あればいろんなことが出来るはずですが、色々ミスったので自戒を込めて記事を残します。 ミス① 動きが遅い あらゆることにはタイムラグがあります。 いきなり必要な人材の確保は出来ないし、何かの施策をするにも芽吹くには時間がかかります。 弊社は人材の確保は、調達が決まりそうな段階から動き出してまあまあ良かったです。 採用面談は無料なのでバ… <p>株式会社MatrixFlow <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C2%E5%C9%BD%BC%E8%C4%F9%CC%F2">代表取締役</a> tdualです。</p><p>調子に乗っているこの記事から色々状況も変わりました。<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Ftdual.hatenablog.com%2Fentry%2F2020%2F07%2F03%2F234157" title="くそだったワイが起業してやったこと。むしろやってない奴はやばい。 - tdualのブログ" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://tdual.hatenablog.com/entry/2020/07/03/234157">tdual.hatenablog.com</a></cite></p><br /> <br /> <p>1番のイベントは、昨年の10月末に初調達でプレシリーズAで1億円の調達をした事です。</p><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fprtimes.jp%2Fmain%2Fhtml%2Frd%2Fp%2F000000022.000041251.html" title="ビジネスのためのAI活用プラットフォーム「MatrixFlow」を提供する株式会社MatrixFlow、1億円の資金調達を実施" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://prtimes.jp/main/html/rd/p/000000022.000041251.html">prtimes.jp</a></cite></p><br /> <p>1億円あればいろんなことが出来るはずですが、色々ミスったので自戒を込めて記事を残します。<br /> <br /> </p> <div class="section"> <h3>ミス① 動きが遅い</h3> <p>あらゆることにはタイムラグがあります。<br /> いきなり必要な人材の確保は出来ないし、何かの施策をするにも芽吹くには時間がかかります。<br /> 弊社は人材の確保は、調達が決まりそうな段階から動き出してまあまあ良かったです。<br /> 採用面談は無料なのでバンバンやりました。</p><p>問題は、広告宣伝でした。<br /> 調達するまで、弊社はあまり<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A1%BC%A5%B1%A5%C6%A5%A3%A5%F3%A5%B0">マーケティング</a>・営業をちゃんとやってなかったので、<br /> 広告宣伝の意義が良くわかっていませんでした。<br /> 今だから分かるけど、「じゃあどうやってリードをとってくるの?」って話です。<br /> 広告は結構お金が掛かります。でも、営業を効率的に動かすためには必要不可欠です。<br /> なので、資金調達が決まりそうになったら広告宣伝費に突っ込む準備をしましょう。<br /> <br /> </p> </div> <div class="section"> <h3>ミス② 手放せないタスク</h3> <p>もうさっさといろんな事を人に任せるべきでした。<br /> ちょっと複雑で面白くもないタスクなので新しく入った人に任せるのが申し訳なくて自分でやってしまってました。<br /> しかし、このシリーズの経営者の仕事は、組織醸成、<a class="keyword" href="http://d.hatena.ne.jp/keyword/PMF">PMF</a>のための動き、次の調達の準備です。<br /> 調達しても結局ズルズル些細なタスクを背負って上記のことにフルコミット出来てませんでした。<br /> とりあえず、どんなに嫌な仕事でも社員に振るべきです。<br /> <br /> </p> </div> <div class="section"> <h3>ミス③ <a class="keyword" href="http://d.hatena.ne.jp/keyword/PMF">PMF</a>は簡単じゃない</h3> <p>舐めてました。<br /> 一つの企業で使ってもえば、同じ業界で横展開するなんてのは経営者のよくある妄想です。<br /> また、当たり前ですけど、営業の立ち上がりにも時間がかかります。<br /> そもそも<a class="keyword" href="http://d.hatena.ne.jp/keyword/PMF">PMF</a>ってどういう状況なんだよって感じですよね。<br /> 逆説的ですけど、それが実感できてない段階で<a class="keyword" href="http://d.hatena.ne.jp/keyword/PMF">PMF</a>できてないってことなんだと思います。<br /> サービスを売る事の難しさを痛感する日々です。<br /> <br /> </p> </div> <div class="section"> <h3>ミス④ 嫉妬と自己嫌悪</h3> <p>このシリーズになれば、経営者仲間も出来ると思います。<br /> 彼、彼女らの<a class="keyword" href="http://d.hatena.ne.jp/keyword/facebook">facebook</a>を見てるとキラキラしてて、<br /> 無能な自分はなんで停滞してるのに、彼、彼女らはなんて前進してるんだって思います。<br /> しかし、見えてるものは氷山の一角で彼、彼女らも同じ様な苦悩はしてます。(<a class="keyword" href="http://d.hatena.ne.jp/keyword/facebook">facebook</a>には良い事しかあげないよなぁ!)<br /> また、ビジネスモデルによっても成長のスピードは違うので、他のスタートアップは気にしても仕方ないです。<br /> そんな知り合いの会社を気にしてる暇があるなら、競合を気にしましょう。<br /> <br /> <br /> </p> </div> <div class="section"> <h3>おわり</h3> <p>しくじったけど死んではないのでこれからも全力で頑張ります!</p><br /> <p>経営者仲間との交流も求めているので気軽に連絡ください!!<br /> これから起業する人もワイが出来る範囲でアド<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>できるのでご相談ください。</p><br /> <br /> <p>↓今すぐフォローすべきキラキラ アカウント<p><a class="twitter-follow-button" href="https://twitter.com/tdualdir?ref_src=twsrc^tfw" data-show-count="false">Follow @tdualdir</a></p></p><br /> <p>↓今すぐ登録すべきキラキラAIサービス<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.matrixflow.net%2Fmatrixflow" title="ビジネスのためのAI活用プラットフォーム" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.matrixflow.net/matrixflow">www.matrixflow.net</a></cite></p><br /> <p>じゃあの。</p> </div> tdualdir 事業のわかるITエンジニアはどこにいるのか。 hatenablog://entry/26006613656524191 2020-11-24T21:10:39+09:00 2020-11-24T21:10:39+09:00 ワイ。 <p>ワイ。</p> tdualdir 形態素解析器比較 Sudachi vs Mecab+Neologd hatenablog://entry/26006613597791425 2020-07-13T16:21:51+09:00 2020-07-14T06:45:58+09:00 ブレインパッドさんのpodcast「白金鉱業.FM」の聞いてたらSudachiの開発の話を聞いて興味が出たので触ってみました。 shirokane-kougyou.fm (「白金鉱業.FM」はデータ分析現場の生の声が聴けるのでなかなか面白いです。) Sudachiとは 使ってみる 比較 データセット 使用したモジュール トークナイザー トークナイザー使用例 辞書の統計的フィルター ベクトル化 分類器 結果 Sudachi(モードA) Sudachi(モードB) Sudachi(モードC) Mecab+Neologd 速度について その他 品詞の付与について 終わりに Sudachiとは ワーク… <p>ブレインパッドさんの<a class="keyword" href="http://d.hatena.ne.jp/keyword/podcast">podcast</a>「白金鉱業.FM」の聞いてたらSudachiの開発の話を聞いて興味が出たので触ってみました。<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fshirokane-kougyou.fm%2F" title="白金鉱業.FM" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://shirokane-kougyou.fm/">shirokane-kougyou.fm</a></cite><br /> (「白金鉱業.FM」はデータ分析現場の生の声が聴けるのでなかなか面白いです。)</p> <ul class="table-of-contents"> <li><a href="#Sudachiとは">Sudachiとは</a></li> <li><a href="#使ってみる">使ってみる</a></li> <li><a href="#比較">比較</a><ul> <li><a href="#データセット">データセット</a></li> <li><a href="#使用したモジュール">使用したモジュール</a></li> <li><a href="#トークナイザー">トークナイザー</a></li> <li><a href="#トークナイザー使用例">トークナイザー使用例</a></li> <li><a href="#辞書の統計的フィルター">辞書の統計的フィルター</a></li> <li><a href="#ベクトル化">ベクトル化</a></li> <li><a href="#分類器">分類器</a></li> </ul> </li> <li><a href="#結果">結果</a><ul> <li><a href="#SudachiモードA">Sudachi(モードA)</a></li> <li><a href="#SudachiモードB">Sudachi(モードB)</a></li> <li><a href="#SudachiモードC">Sudachi(モードC)</a></li> <li><a href="#MecabNeologd">Mecab+Neologd</a></li> </ul> </li> <li><a href="#速度について">速度について</a></li> <li><a href="#その他">その他</a><ul> <li><a href="#品詞の付与について">品詞の付与について</a></li> </ul> </li> <li><a href="#終わりに">終わりに</a></li> </ul> <div class="section"> <h3 id="Sudachiとは">Sudachiとは</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EF%A1%BC%A5%AF%A5%B9%A5%A2%A5%D7%A5%EA%A5%B1%A1%BC%A5%B7%A5%E7%A5%F3%A5%BA">ワークスアプリケーションズ</a>徳島<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%CD%B9%A9%C3%CE%C7%BD">人工知能</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/NLP">NLP</a>研究所で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>開発されている<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B7%C1%C2%D6%C1%C7%B2%F2%C0%CF">形態素解析</a>器です。<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.worksap.co.jp%2Fabout%2Fcsr%2Fnlp%2F" title="徳島人工知能NLP研究所|ERP:大手企業向けERPパッケージ「HUE」 / ワークスアプリケーションズ" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.worksap.co.jp/about/csr/nlp/">www.worksap.co.jp</a></cite></p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B7%C1%C2%D6%C1%C7%B2%F2%C0%CF">形態素解析</a>器とは日本語を単語に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%AC%A4%AB%A4%C1%BD%F1%A4%AD">分かち書き</a>したり、品詞を特定する機能を有するもので、日本語の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%AB%C1%B3%B8%C0%B8%EC%BD%E8%CD%FD">自然言語処理</a>では必須です。<br /> 同じ様なものには<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mecab">Mecab</a>やJuman++などがあります。<br /> Sudachiの強みは辞書にあるらしく、長年研究してる専門家が辞書のメンテナンスをしているそうです。<br /> また、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%AC%A4%AB%A4%C1%BD%F1%A4%AD">分かち書き</a>の方法(モード)が複数あり、切る長さを選ぶことが出来ます。</p> </div> <div class="section"> <h3 id="使ってみる">使ってみる</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>のモジュールはここにあります。<br /> <a href="https://github.com/WorksApplications/SudachiPy">https://github.com/WorksApplications/SudachiPy</a></p><p>まずはインストールします。</p> <pre class="code bash" data-lang="bash" data-unlink>pip install sudachipy # 本体のインストール pip install sudachidict_core #辞書のインストール</pre><p>インポートしてそれぞれモードで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%AC%A4%AB%A4%C1%BD%F1%A4%AD">分かち書き</a>してみる。</p> <pre class="code Python" data-lang="Python" data-unlink>from sudachipy import tokenizer from sudachipy import dictionary tokenizer_obj = dictionary.Dictionary().create()</pre><p><br /> モードA</p> <pre class="code Python" data-lang="Python" data-unlink>mode = tokenizer.Tokenizer.SplitMode.A [ ( m.surface(), m.dictionary_form(), m.reading_form(), m.part_of_speech() ) for m in tokenizer_obj.tokenize(&#34;国家公務員&#34;, mode)]</pre><p>出力:</p> <pre class="code bash" data-lang="bash" data-unlink>[(&#39;国家&#39;, &#39;国家&#39;, &#39;コッカ&#39;, [&#39;名詞&#39;, &#39;普通名詞&#39;, &#39;一般&#39;, &#39;*&#39;, &#39;*&#39;, &#39;*&#39;]), (&#39;公務&#39;, &#39;公務&#39;, &#39;コウム&#39;, [&#39;名詞&#39;, &#39;普通名詞&#39;, &#39;一般&#39;, &#39;*&#39;, &#39;*&#39;, &#39;*&#39;]), (&#39;員&#39;, &#39;員&#39;, &#39;イン&#39;, [&#39;接尾辞&#39;, &#39;名詞的&#39;, &#39;一般&#39;, &#39;*&#39;, &#39;*&#39;, &#39;*&#39;])]</pre><p><br /> モードB</p> <pre class="code Python" data-lang="Python" data-unlink>mode = tokenizer.Tokenizer.SplitMode.B [ ( m.surface(), m.dictionary_form(), m.reading_form(), m.part_of_speech() ) for m in tokenizer_obj.tokenize(&#34;国家公務員&#34;, mode)]</pre><p>出力:</p> <pre class="code bash" data-lang="bash" data-unlink>[(&#39;国家&#39;, &#39;国家&#39;, &#39;コッカ&#39;, [&#39;名詞&#39;, &#39;普通名詞&#39;, &#39;一般&#39;, &#39;*&#39;, &#39;*&#39;, &#39;*&#39;]), (&#39;公務員&#39;, &#39;公務員&#39;, &#39;コウムイン&#39;, [&#39;名詞&#39;, &#39;普通名詞&#39;, &#39;一般&#39;, &#39;*&#39;, &#39;*&#39;, &#39;*&#39;])]</pre><p><br /> モードC</p> <pre class="code Python" data-lang="Python" data-unlink>mode = tokenizer.Tokenizer.SplitMode.C [ ( m.surface(), m.dictionary_form(), m.reading_form(), m.part_of_speech() ) for m in tokenizer_obj.tokenize(&#34;国家公務員&#34;, mode)]</pre><p>出力:</p> <pre class="code bash" data-lang="bash" data-unlink>[(&#39;国家公務員&#39;, &#39;国家公務員&#39;, &#39;コッカコウムイン&#39;, [&#39;名詞&#39;, &#39;普通名詞&#39;, &#39;一般&#39;, &#39;*&#39;, &#39;*&#39;, &#39;*&#39;])]</pre><p>モードAは細かく分解するのに対してモードCはあまり分解しない様です。<br /> モジュールとしての使い勝手としてもよさそうです。</p><p>また正規化もしてくれます。</p> <pre class="code Python" data-lang="Python" data-unlink>tokenizer_obj.tokenize(&#34;SUMMER&#34;, mode)[0].normalized_form()</pre><p>出力:</p> <pre class="code bash" data-lang="bash" data-unlink>&#39;サマー&#39;</pre><p>すばらしい。<br /> <br /> </p> </div> <div class="section"> <h3 id="比較">比較</h3> <p>ニュース記事分類のタスクで性能を比較してみます。<br /> 具体的にはSudachiと<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mecab">Mecab</a>+Neologdで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%AC%A4%AB%A4%C1%BD%F1%A4%AD">分かち書き</a>したものをそれぞれtf-idfでベクトル化してロジスティック回帰で分類してみます。</p> <div class="section"> <h4 id="データセット">デー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%BB%A5%C3%A5%C8">タセット</a></h4> <p>デー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%BB%A5%C3%A5%C8">タセット</a>にはお馴染み(?)の<a class="keyword" href="http://d.hatena.ne.jp/keyword/livedoor">livedoor</a> ニュース<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A1%BC%A5%D1%A5%B9">コーパス</a>を使います。<br /> <a href="https://www.rondhuit.com/download.html#ldcc">https://www.rondhuit.com/download.html#ldcc</a></p><p>9種類の記事があり全部で7376記事あります。</p> </div> <div class="section"> <h4 id="使用したモジュール">使用したモジュール</h4> <p>この辺のモジュールを使いました。</p> <pre class="code Python" data-lang="Python" data-unlink>import re import math import resource import numpy as np from urllib import request from pathlib import Path import MeCab import neologdn import gensim from gensim import corpora from gensim.corpora import Dictionary import matplotlib.pyplot as plt from sklearn.metrics import confusion_matrix from sklearn.model_selection import train_test_split from sklearn.metrics import recall_score, precision_score, accuracy_score from sklearn.linear_model import LogisticRegression from sudachipy import tokenizer from sudachipy import dictionary</pre> </div> <div class="section"> <h4 id="トークナイザー"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A1%BC%A5%AF">トーク</a>ナイザー</h4> <p>Sudachiと<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mecab">Mecab</a>それぞれに対してほぼ同じ処理をする<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A1%BC%A5%AF">トーク</a>ナイザーを作りました。</p> <pre class="code Python" data-lang="Python" data-unlink>class SudachiTokenizer(): def __init__(self, mode=&#34;C&#34;, stopwords=None, include_pos=None): if mode not in [&#34;A&#34;, &#34;B&#34;, &#34;C&#34;]: raise Exception(&#34;invalid mode. &#39;A&#39; ,&#39;B&#39; or &#39;C&#39;&#34;) self.mode = getattr(tokenizer.Tokenizer.SplitMode, mode) print(self.mode ) if stopwords is None: self.stopwords = [] else: self.stopwords = stopwords if include_pos is None: self.include_pos = [&#34;名詞&#34;, &#34;動詞&#34;, &#34;形容詞&#34;] else: self.include_pos = include_pos def parser(self, text): return tokenizer_obj.tokenize(text, self.mode) def tokenize(self, text, pos=False): res = [] for m in self.parser(text): p = m.part_of_speech() base = m.normalized_form() #.dictionary_form() #print(base, &#34;: &#34;, p) if p[0] in self.include_pos and base not in self.stopwords and p[1] != &#34;数詞&#34;: if pos: res.append((base, p[0])) else: res.append(base) return res</pre><pre class="code Python" data-lang="Python" data-unlink>class MeCabTokenizer: def __init__(self, dic_dir=None, stopwords=None, include_pos=None): tagger_cmd = &#34;-Ochasen&#34; if dic_dir: tagger_cmd += &#34; -d {}&#34;.format(dic_dir) mecab = MeCab.Tagger(tagger_cmd) self.parser = mecab.parse if stopwords is None: self.stopwords = [] else: self.stopwords = stopwords if include_pos is None: self.include_pos = [&#34;名詞&#34;, &#34;動詞&#34;, &#34;形容詞&#34;] else: self.include_pos = include_pos def tokenize(self, text, pos=False): l = [line.split(&#34;\t&#34;) for line in self.parser(text).split(&#34;\n&#34;)] res = [] for w in l: if len(w) &gt;=4: # check nomal words (e.g. not EOS) p = w[3] group_pos = p.split(&#34;-&#34;)[0] base = w[2] if group_pos in self.include_pos and base not in self.stopwords and &#34;数&#34; not in p: if pos: res.append((base, p)) else: res.append(base) return res</pre><p>また、これらの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A1%BC%A5%AF">トーク</a>ナイザーに通す前には共通の関数で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CE%A1%BC%A5%DE%A5%E9%A5%A4%A5%BA">ノーマライズ</a>してます。</p> <pre class="code Python" data-lang="Python" data-unlink>kaomoji_reg = r&#39;[\[|\(][^あ-ん\u30A1-\u30F4\u2E80-\u2FDF\u3005-\u3007\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF\U00020000-\U0002EBEF]+?[\]|\)]&#39; m = re.compile(kaomoji_reg) def normalize(text): text = str(text) text = text.replace(&#34;\n&#34;, &#34; &#34;) text = re.sub(r&#34;http(s)?:\/{2}[\d\w-]+(\.[\d\w-]+)*(?:(?:\/[^\s/]*))*&#34;, &#34; &#34;, text) text = re.sub(r&#34;\S*@\S*\s?&#34; ,&#34; &#34;, text) text = text.lower() text = re.sub(kaomoji_reg, &#34; &#34;, text) text = re.sub(r&#39;\d+&#39;, &#39;&#39;, text) text = neologdn.normalize(text) return text</pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%C8%A5%C3%A5%D7%A5%EF%A1%BC%A5%C9">ストップワード</a>も用意します。</p> <pre class="code Python" data-lang="Python" data-unlink>sw_filename = &#34;stopwords.txt&#34; if not Path(sw_filename).exists(): res = request.urlopen(&#34;http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/Japanese.txt&#34;).read().decode(&#34;utf-8&#34;) with open(sw_filename, &#34;w&#34;) as f: f.write(res) else: with open(sw_filename) as f: res = f.read() stopwords = [line.strip() for line in res.split(&#34;\n&#34;)] print(len(stopwords)) #331 print(stopwords[:3]) # [&#39;あそこ&#39;, &#39;あたり&#39;, &#39;あちら&#39;]</pre> </div> <div class="section"> <h4 id="トークナイザー使用例"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A1%BC%A5%AF">トーク</a>ナイザー使用例</h4> <pre class="code Python" data-lang="Python" data-unlink> include_pos = [&#34;名詞&#34;, &#34;動詞&#34;, &#34;形容詞&#34;] mecab_tokenizer = MeCabTokenizer(dic_dir=&#34;/usr/local/lib/mecab/dic/mecab-ipadic-neologd&#34;, stopwords=stopwords, include_pos=include_pos) sudachi_tokenizer = SudachiTokenizer(mode=&#34;B&#34;, stopwords=stopwords, include_pos=include_pos+[&#34;形状詞&#34;]) mecab_tokenizer.tokenize(normalize(text), pos=False) # 出力 [&#39;コード&#39;, &#39;命令&#39;, &#39;冗長&#39;, &#39;算出&#39;, &#39;プロパティ&#39;, &#39;利用&#39;, &#39;する&#39;, &#39;バージョン&#39;, &#39;比較&#39;, &#39;する&#39;, &#39;みる&#39;] sudachi_tokenizer.tokenize(normalize(text), pos=False) # 出力 [&#39;コード&#39;, &#39;命令&#39;, &#39;冗長&#39;, &#39;算出&#39;, &#39;プロパティー&#39;, &#39;利用&#39;, &#39;為る&#39;, &#39;バージョン&#39;, &#39;比較&#39;, &#39;為る&#39;, &#39;見る&#39;]</pre><p>「する」と「為る」、「みる」と「見る」の違いはsudachiのnormalized_form()から来ています。<br /> <br /> </p> </div> <div class="section"> <h4 id="辞書の統計的フィルター">辞書の統計的フィルター</h4> <p>今回は分類のタスクなので、全ての記事の中で1回しか出てない単語や、全体の9割より多く出現してる単語を除去しました。</p> <pre class="code Python" data-lang="Python" data-unlink>dictinonary_mecab = Dictionary(sentences_mecab) dictinonary_mecab.filter_extremes(no_below=2, no_above=0.9) dictinonary_mecab.compactify() corpus_mecab = [dictinonary_mecab.doc2bow(w) for w in sentences_mecab] dictinonary_sudachi = Dictionary(sentences_sudachi) dictinonary_sudachi.filter_extremes(no_below=2, no_above=0.9) dictinonary_sudachi.compactify() corpus_sudachi = [dictinonary_sudachi.doc2bow(w) for w in sentences_sudachi]</pre> </div> <div class="section"> <h4 id="ベクトル化">ベクトル化</h4> <p>tf-idfでベクトル化します。つまり一つの記事は語彙数次元のスパースなベクトルになります。<br /> モジュールにはgensimを使いました。<br /> <br /> </p> </div> <div class="section"> <h4 id="分類器">分類器</h4> <p>分類器にはロジスティック回帰を使いました。<br /> 今回はweightの設定もハイパラのチューニングもせずにscikit-learnのデフォルト値で学習</p> </div> </div> <div class="section"> <h3 id="結果">結果</h3> <div class="section"> <h4 id="SudachiモードA">Sudachi(モードA)</h4> <figure class="figure-image figure-image-fotolife" title="sudachi_A"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20200713/20200713160434.png" alt="f:id:tdualdir:20200713160434p:plain" title="f:id:tdualdir:20200713160434p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>sudachi_A</figcaption></figure> </div> <div class="section"> <h4 id="SudachiモードB">Sudachi(モードB)</h4> <figure class="figure-image figure-image-fotolife" title="sudachi_B"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20200713/20200713161020.png" alt="f:id:tdualdir:20200713161020p:plain" title="f:id:tdualdir:20200713161020p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>sudachi_B</figcaption></figure> </div> <div class="section"> <h4 id="SudachiモードC">Sudachi(モードC)</h4> <figure class="figure-image figure-image-fotolife" title="sudachi_C"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20200713/20200713160721.png" alt="f:id:tdualdir:20200713160721p:plain" title="f:id:tdualdir:20200713160721p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>sudachi_C</figcaption></figure> </div> <div class="section"> <h4 id="MecabNeologd"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Mecab">Mecab</a>+Neologd</h4> <figure class="figure-image figure-image-fotolife" title="mecab"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20200713/20200713154222.png" alt="f:id:tdualdir:20200713154222p:plain" title="f:id:tdualdir:20200713154222p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/mecab">mecab</a></figcaption></figure><p>正解率<br /> Sudachi(モードA) : 0.936<br /> Sudachi(モードB) : 0.934<br /> Sudachi(モードC) : 0.935<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mecab">Mecab</a>+Neologd: <b>0.943</b></p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Mecab">Mecab</a>+Neologdが一番良いです。<br /> <br /> </p> </div> </div> <div class="section"> <h3 id="速度について">速度について</h3> <p>気になったのが速度です。<br /> 訓練データとして5532個のニュース記事を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A1%BC%A5%AF">トーク</a>ナイズした結果です。<br /> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20200713/20200713141431.png" alt="f:id:tdualdir:20200713141431p:plain" title="f:id:tdualdir:20200713141431p:plain" class="hatena-fotolife" itemprop="image"></span><br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mecab">Mecab</a>が30秒かからずに終わっていますが、Sudachiは7分30秒ほどかかっています。</p> </div> <div class="section"> <h3 id="その他">その他</h3> <div class="section"> <h4 id="品詞の付与について">品詞の付与について</h4> <p>品詞の特定は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mecab">Mecab</a>とほとんど変わらないのですが、ちょいちょい違う場合もある様です。<br /> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20200713/20200713142212.png" alt="f:id:tdualdir:20200713142212p:plain" title="f:id:tdualdir:20200713142212p:plain" class="hatena-fotolife" itemprop="image"></span></p><p>なので今回は"名詞", "動詞", "形容詞"のみを抽出する予定でしたが、Sudachiの場合は"形状詞"も抽出しました。</p> </div> </div> <div class="section"> <h3 id="終わりに">終わりに</h3> <p>今回のタスクにおいては<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mecab">Mecab</a>+Neologdの方が良かったです。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/podcast">podcast</a>でも少し言ってましたが、今は検索タスクを優先して改善してる様なので今回の使い方はまだフォーカスしてないのかもしれません。<br /> この先10年はメンテしていく予定らしいので、ビジネスに使うとかシステムに組み込むという話になった時は一つ選択肢には上がると思います。<br /> (組み込んだ後のNeologdの更新って皆んなどうしてるんだろう🤔)</p><p>また今回のコードはここにあります。こうした方が良いとかアド<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>ください!<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2FTdual%2Fcheck_sudachi" title="Tdual/check_sudachi" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://github.com/Tdual/check_sudachi">github.com</a></cite></p><br /> <p>↓今すぐフォローすべきキラキラ アカウント<p><a class="twitter-follow-button" href="https://twitter.com/tdualdir?ref_src=twsrc^tfw" data-show-count="false">Follow @tdualdir</a></p></p><br /> <p>↓今すぐ登録すべきキラキラAIサービス<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.matrixflow.net%2Fmatrixflow" title="MatrixFlow プログラミング不要のAI構築プラットフォーム | 株式会社MatrixFlow" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.matrixflow.net/matrixflow">www.matrixflow.net</a></cite></p><br /> <p>じゃあの。</p> </div> tdualdir くそだったワイが起業してやったこと。むしろやってない奴はやばい。 hatenablog://entry/26006613593341706 2020-07-03T23:41:57+09:00 2020-07-04T17:14:04+09:00 初めまして。株式会社MatrixFlow(マトリックスフロー)のCEOをやってるものです。 株式会社MatrixFlowは,ビジネスマン向けのAIを構築・活用・運用出来るプラットフォームサービス「MatrixFlow」を運営しています。 www.matrixflow.net おかげさまでユーザーも2000名を超え、経済産業新聞さんや東洋経済さんに取り上げてもらってユーザーも週で20名以上伸びています。 会社自体はまだ2年も立ってないひよっこですが、経験を少しでもこれから起業しようと思ってる人、起業に興味がある人に還元できればと思ってます。 1.起業したら、アクセラレータープログラムに入る スタ… <p>初めまして。株式会社MatrixFlow(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%C8%A5%EA%A5%C3%A5%AF%A5%B9">マトリックス</a>フロー)のCEOをやってるものです。<br /> 株式会社MatrixFlowは,ビジネスマン向けのAIを構築・活用・運用出来るプラットフォームサービス「MatrixFlow」を運営しています。<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.matrixflow.net%2F" title="株式会社MatrixFlow" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.matrixflow.net/">www.matrixflow.net</a></cite><br /> おかげさまでユーザーも2000名を超え、経済産業新聞さんや<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%EC%CD%CE%B7%D0%BA%D1">東洋経済</a>さんに取り上げてもらってユーザーも週で20名以上伸びています。<br /> 会社自体はまだ2年も立ってない<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%D2%A4%E8%A4%C3%A4%B3">ひよっこ</a>ですが、経験を少しでもこれから起業しようと思ってる人、起業に興味がある人に還元できればと思ってます。</p> <div class="section"> <h3>1.起業したら、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%E9">アクセラ</a>レータープログラムに入る</h3> <p>スタートアップを各方面から支援する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%E9">アクセラ</a>レータープログラムと言うものを大企業や行政が実施しています。<br /> メンターの教えによる会社経営の示唆や知識は学びは大きく非常に感謝してます。<br /> また、そこの業界ネットワークに参加できることも大きいです。今でもそこで築いたネットワーク関係で仕事が入って来てます。<br /> 同業種の同期であることの仲間意識は思った以上に強いです。<br /> 起業した際には是非とも自分の分野の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%E9">アクセラ</a>レータープログラムを検索して申し込むことをオススメします。<br /> (MatrixFlow社は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%C8%A5%EB">バイトル</a>でお馴染みの<a class="keyword" href="http://d.hatena.ne.jp/keyword/dip">dip</a>がやっているAI<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%E9">アクセラ</a>レーターと、海外VCのPlug and Playの日本法人がやってる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%E9">アクセラ</a>レータプログラムに参加してます。)</p> </div> <div class="section"> <h3>2.VCからもらうのは資金よりも知恵や経験</h3> <p>起業したての頃にいくつかのVCをまわりました。<br /> 最初は資金調達を目的としてましたが、優秀なVCさんと話していると資金よりも知恵や数々のスタートアップを見て来た経験からくる助言が非常に重く役に立ちます。<br /> もちろん腹が立つような言葉を浴びせられたこともありますが、今振り返ると決して間違ってることを言ってるわけではないのでVCの言うことはまずは素直に聞いて実践することをオススメします。<br /> また、ラウンドが違うVCからは他のVCの紹介や仕事をもらったこともあるのでVCとは積極的に会うべきです。</p> </div> <div class="section"> <h3>3.<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%E3%A1%BC">ベンチャー</a>融資の申請</h3> <p>日本金融公庫がスタートアップに対して最大2000万円の融資をしている。(2020年7月の現状)<br /> 受けない手はない。手続き等で不安がある場合は申請の手助けをするサービスもあるのでそこに頼るのもありです。</p> </div> <div class="section"> <h3>4.ツールに頼るべき</h3> <p>事業をやる上で専用のツールは沢山あるので有効活用すべき。間違ってもエクセルでなんとかしようと思うべきじゃない。<br /> MatrixFlow社は<br /> ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%CA%C4%BD%B4%C9%CD%FD">進捗管理</a>はTrello(無料)<br /> ・営業・カスタマーサクセスはHubspot(無料)<br /> ・会計はfreee(有料)<br /> ・コミュニケーションはslack(無料)<br /> ・Gsuite (メール、スライド、ドキュメント、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%D7%A5%EC%A5%C3%A5%C9%A5%B7%A1%BC%A5%C8">スプレッドシート</a>、アンケートフォーム等) (有料)<br /> を使っています。<br /> 少なくともslack、TrelloとHubspotは使うべき。</p> </div> <div class="section"> <h3>5.スタートアップ専門の弁護士をつける</h3> <p>弁護士っていうと大袈裟な感じがするが、スタートアップこそ不利な契約が結ばれそうになることがある(損害賠償の範囲も大きく賠償金の上限も無しなど)。<br /> そこで創業2年以内なら格安のサービスをしてる事務所があるのでそこにお願いする。<br /> MatrixFlow社はAZXにお願いしてる。(ちゃんと疑問にも答えてくれるので正直めっちゃ満足してる)</p> </div> <div class="section"> <h3>6.メディアには露出すべき</h3> <p>メディアにばっか出る経営者は胡散臭いとか自己顕示欲が強いとか言われがちだが、メディアの効果はやはり大きい。<br /> MatrixFlow社もインタビュー記事きっかけで商談が組まれて最終的に数千万円の案件に繋がった。<br /> よっぽど嫌ではなければメディアには露出した方が良い。</p> </div> <div class="section"> <h3>7.悪いのは常に自分</h3> <p>社員がミスをした時、悪いのは社員じゃなくてミスをするような体制を作ってる経営者である。<br /> ミスは人ではなくてシステムが引き起こすと思ってシステムの改善をすべきです。<br /> 例えば、営業部の人が商談のあとのお礼メールを出すのを忘れるならカレンダーにお礼メールを出すというスケジュールを追加するようにしたり、管理ツールにお礼メールという<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C1%A5%A7%A5%C3%A5%AF%A5%DC%A5%C3%A5%AF%A5%B9">チェックボックス</a>を作ったりと人ベースではなくシステムベースでミスを減らす努力するのが経営者です。</p> </div> <div class="section"> <h3>8.取引相手が欲しいのは製品やサービスではなく、効果やメンツ</h3> <p>究極的なことを言えば、取引相手が欲しいのは質の高い製品・サービスではなくて、<br /> そこから得られる効果やそれによって得られる組織内でのメンツであることを意識する。<br /> 如何に性能が良いかではくて、如何にこれの導入によって組織やあなたが得をするか言うべき。</p> </div> <div class="section"> <h3>おわり</h3> <p>まだありますが、長くなったのでこのあたりで一旦終了です!<br /> 好評ならpart2をやります。</p><p>↓今すぐフォローすべきキラキラ アカウント<p><a class="twitter-follow-button" href="https://twitter.com/tdualdir?ref_src=twsrc^tfw" data-show-count="false">Follow @tdualdir</a></p></p><br /> <p>↓今すぐ登録すべきキラキラAIサービス<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.matrixflow.net%2Fmatrixflow" title="MatrixFlow プログラミング不要のAI構築プラットフォーム | 株式会社MatrixFlow" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.matrixflow.net/matrixflow">www.matrixflow.net</a></cite></p><br /> <p>じゃあの。</p> </div> tdualdir de:code2019に行ったらMicrosoftのAI戦略が見えてきた hatenablog://entry/17680117127176659171 2019-06-23T04:02:37+09:00 2019-06-23T04:06:43+09:00 お久しぶりです。半年ぶりくらいにブログを書きます。5/29と5/30にザ・プリンス パークタワー東京で開催されたde:code2019に参加してきてました。 Microsoftが毎年開催しているエンジニア向けの一大イベントです。www.microsoft.com まずは「マイクロソフト リサーチの AI / 自然言語処理研究 最前線」を聞きました。#decode19 pic.twitter.com/ZezqiZAYrS— tdual🔰MatrixFlow (@tdualdir) May 29, 2019Microsoft Research のこれまでの自然言語処理の基礎研究の成果の紹介でした。… <p>お久しぶりです。半年ぶりくらいにブログを書きます。</p><p>5/29と5/30にザ・プリンス パークタワー東京で開催されたde:code2019に参加してきてました。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Microsoft">Microsoft</a>が毎年開催しているエンジニア向けの一大イベントです。</p><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.microsoft.com%2Fja-jp%2Fevents%2Fdecode%2F2019%2Fdefault.aspx" title="de:code 2019 | 開発者をはじめとする、IT に携わるすべてのエンジニアのための年に一度のテクニカルカンファレンス。5月29日-30日開催。https://aka.ms/decode19 #decode19" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.microsoft.com/ja-jp/events/decode/2019/default.aspx">www.microsoft.com</a></cite></p><br /> <p>まずは「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%AF%A5%ED%A5%BD%A5%D5%A5%C8">マイクロソフト</a> リサーチの AI / <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%AB%C1%B3%B8%C0%B8%EC%BD%E8%CD%FD">自然言語処理</a>研究 最前線」を聞きました。<blockquote class="twitter-tweet" data-lang="HASH(0x56441bb8d3b0)"><p lang="und" dir="ltr"><a href="https://twitter.com/hashtag/decode19?src=hash&amp;ref_src=twsrc%5Etfw">#decode19</a> <a href="https://t.co/ZezqiZAYrS">pic.twitter.com/ZezqiZAYrS</a></p>&mdash; tdual🔰MatrixFlow (@tdualdir) <a href="https://twitter.com/tdualdir/status/1133581829712146432?ref_src=twsrc%5Etfw">May 29, 2019</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Microsoft">Microsoft</a> Research のこれまでの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%AB%C1%B3%B8%C0%B8%EC%BD%E8%CD%FD">自然言語処理</a>の基礎研究の成果の紹介でした。<br /> 歴史の中でブレイクスルーに確実に絡んでいるのはさすがだなぁと思って聞いていました。<br /> また「りんな」についても触れていて何かを効率化するAIではなく、Emotional AIだと言ってたのが印象に残りました。</p><br /> <br /> <p>次は「開発者のための<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B3%D8%BD%AC">機械学習</a>入門:Azure Machine Learning Studio で構造化データから予測分析」を聞きました。<blockquote class="twitter-tweet" data-lang="HASH(0x5638b9757560)"><p lang="ja" dir="ltr">競合視察的なやつ <a href="https://twitter.com/hashtag/decode19?src=hash&amp;ref_src=twsrc%5Etfw">#decode19</a> <a href="https://t.co/NdaT9JZipk">pic.twitter.com/NdaT9JZipk</a></p>&mdash; tdual🔰MatrixFlow (@tdualdir) <a href="https://twitter.com/tdualdir/status/1133597579516583936?ref_src=twsrc%5Etfw">May 29, 2019</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p><p>目的は弊社が開発しているサービス「<a href="https://www.products.matrixflow.net/">MatrixFlow</a>」と似ているので敵状視察的なやつです。<br /> セッションの内容としては<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B3%D8%BD%AC">機械学習</a>の基本的な考え方から始まって後半からようやくML Studioの話が出てきました。<br /> 初めて知ったことも多かったです。<br /> 例えば、ML Studioは<a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>で前処理や<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B3%D8%BD%AC">機械学習</a>のト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A1%BC%A5%CB%A5%F3">レーニン</a>グが可能で学習済みモデルをそのまま<a class="keyword" href="http://d.hatena.ne.jp/keyword/Web%A5%B5%A1%BC%A5%D3%A5%B9">Webサービス</a>にデプロイできるのですが、モデルの更新はPower shellでやらないといけないと言う若干ズコー感がある事や、エクセルから推論テストが出来ることを知りました。<br /> 最後にはML Studioの上位互換になる(予定の?)Azure Machine Learning Service Visual Interface(まだプレビュー版)の説明もありました。<br /> ML Studioと比べた時に何が変わったかと言うと、<a class="keyword" href="http://d.hatena.ne.jp/keyword/GPU">GPU</a>が使用可能、デプロイ先がKubernatesを使えるようになったりと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%E9%A5%A6%A5%C9">クラウド</a>らしい構成になったようです。GA(General Available)が楽しみです。</p><p>個人的にはML Studioにエクセルの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>が用意され連携できるのが<a class="keyword" href="http://d.hatena.ne.jp/keyword/Microsoft">Microsoft</a>らしいと思いましたが、推論だけでもエクセル上からできると言うのはAIを意識的に使うのではなく、いつの間にか裏でAIが動いていたと言う世界を作るには良いのかもしれません🤔</p><br /> <br /> <p>1日目の最後は「Build 2019 Azure AI & Data Platform 最新アップデート」を聞きました。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B3%D8%BD%AC">機械学習</a>系の話を期待して行ったのですが、ほとんどがDB周りの話でした。しかし面白かったです。<br /> 例のAzure <a class="keyword" href="http://d.hatena.ne.jp/keyword/SQL">SQL</a> Database Serverless(まだプレビュー版)の話がありました。データベースの負荷が全くない場合はPausedして料金がゼロになると言うのはすごい。<br /> またCosmos DBのSpark対応でSparkがCosmos DBと同じサーバー内にあるのでロードする必要なく使えると言うは面白いし実際に便利そうでした。</p><br /> <br /> <p>2日目の最初は「こうすれば <a class="keyword" href="http://d.hatena.ne.jp/keyword/Deep%20Learning">Deep Learning</a> 推論は速くなる!<a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a> AI ソフトウェア製品を活用した推論高速化手法のご紹介」を聞きました。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a>のチップを効率よく使う方法やopenVINOの説明でした。<br /> pip install <a class="keyword" href="http://d.hatena.ne.jp/keyword/intel">intel</a>-tensorflowで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%C6%A5%EB">インテル</a>チップ用に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%D7%A5%C6%A5%A3%A5%DE">オプティマ</a>イズしたTensorflowが使えるなんて初めて知りました。<br /> またopenVINOと言う<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%C6%A5%EB">インテル</a>に特化した推論<a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a>も初耳でした。<br /> 物体検知のデモをやっていましたが、確かに早くなっていました。iGPUがあるならエッジでも爆速になるらしいです。</p><p>そしてなぜかこのツイートが若干伸びた<blockquote class="twitter-tweet" data-lang="HASH(0x56434bd2b920)"><p lang="ja" dir="ltr">pip install <a class="keyword" href="http://d.hatena.ne.jp/keyword/intel">intel</a>-tensorflow<br>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%C6%A5%EB">インテル</a>が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%D7%A5%C6%A5%A3%A5%DE">オプティマ</a>イズしたtensorflowが使える <a href="https://twitter.com/hashtag/decode19?src=hash&amp;ref_src=twsrc%5Etfw">#decode19</a></p>&mdash; tdual🔰MatrixFlow (@tdualdir) <a href="https://twitter.com/tdualdir/status/1133952000343781377?ref_src=twsrc%5Etfw">May 30, 2019</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p><br /> <p>次は「Custom <a class="keyword" href="http://d.hatena.ne.jp/keyword/Vision">Vision</a> で出来ること & 出来ないからって諦めてませんか?」を聞きに行きました。<br /> Custom <a class="keyword" href="http://d.hatena.ne.jp/keyword/Vision">Vision</a>に特段興味があったわけではないですが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B3%D8%BD%AC">機械学習</a>系のサービスとしてどう売り出しているのかを理解して最終的にMatrixFlowに活かそうと思って行きました。<br /> どうやらディスカッション系のセッションだったらしくオーディエンスは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A5%DB">スマホ</a>から質問を投稿し、それに答えていきつつオーディエンスにも積極的に質問をする形式でした。<br /> 登壇者も休むことなくずっと喋っていてエンターテイナーかwwwって思いました。<br /> 内容としては聞いているとCustom <a class="keyword" href="http://d.hatena.ne.jp/keyword/Vision">Vision</a>は足がかりとしては良いかもしれないけど、色々制限があってガチで何かやろうとするにはまだ使いにくそうという印象でした。<br /> ただ、dockerや<a class="keyword" href="http://d.hatena.ne.jp/keyword/iOS">iOS</a>用にエクスポートできるのでエンジニアがPoCでサクッと何か作ってみるのには使えそうでした。</p><br /> <p>次は「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B3%D8%BD%AC">機械学習</a>のためのデータ加工 ~ 特徴量の見つけ方と作り方」を聞きました。<blockquote class="twitter-tweet" data-lang="HASH(0x5607ebd26408)"><p lang="und" dir="ltr"><a href="https://twitter.com/hashtag/decode19?src=hash&amp;ref_src=twsrc%5Etfw">#decode19</a> <a href="https://t.co/fiUfX2lexs">pic.twitter.com/fiUfX2lexs</a></p>&mdash; tdual🔰MatrixFlow (@tdualdir) <a href="https://twitter.com/tdualdir/status/1133993039272136705?ref_src=twsrc%5Etfw">May 30, 2019</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p><p>AutoMLが当たり前になっていく中で特徴量の作成は自動化出来ないので大事だと言う話をして、その後に失敗談を交えて特徴量の作り方の解説をしていました。<br /> 目的変数はビジネス課題になっているのかをしっかりと検討し、<br /> 説明変数は特徴量の洗い出しは5W2H (<a class="keyword" href="http://d.hatena.ne.jp/keyword/5W1H">5W1H</a> +how much)でやりモデルの活用のタイミングもイメージすべきという内容でした。<br /> 特徴量を作るときにビジネス課題を解決するためという視点を忘れてはいけないという非常に教育的なセッションでした。</p><br /> <br /> <p>最後に「Azure Machine Learning service Deep Dive ~自動<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B3%D8%BD%AC">機械学習</a>から MLOps まで~」を聞きました。<blockquote class="twitter-tweet" data-lang="HASH(0x561d29e3d9e8)"><p lang="und" dir="ltr"><a href="https://twitter.com/hashtag/decode19?src=hash&amp;ref_src=twsrc%5Etfw">#decode19</a> <a href="https://t.co/JpSNkV9nTk">pic.twitter.com/JpSNkV9nTk</a></p>&mdash; tdual🔰MatrixFlow (@tdualdir) <a href="https://twitter.com/tdualdir/status/1134014399234990080?ref_src=twsrc%5Etfw">May 30, 2019</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p><p>PoCを超え、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B3%D8%BD%AC">機械学習</a>をサービスとして提供してる会社が次に必要でなるであろうMLOps。それをAzure DevOpsの応用で実現するという内容でした。<br /> 自動化パイプラインで精度などのモニタリングまでやって再学習やデプロイのサイクルを効率的に回そうという話。<br /> Azure Machine Learning Workspaceでモデルを一元管理できるんですね。良さそうです。<br /> 全体のパイプライン構成も精度などの監視も含めると割とアリな構成なんじゃないかと思いました。<br /> また、最後の方でAutomated MLの紹介がありましたが、前処理も含めて自動化してくれるらしいです🤔<br /> そしてそのAutomated MLはSHAP、LIMEをモロそのままサービスに組み込んでいるのもInterpretabilityの時流に乗っていて素晴らしいと感じました。</p><br /> <p>まとめ<br /> 仕事柄、競合調査の一環で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B3%D8%BD%AC">機械学習</a>系のツールやサービスの情報収集をすることが多いのですが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Microsoft">Microsoft</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B3%D8%BD%AC">機械学習</a>関係のサービスはチグハグ感があったのが今回のde:codeを通した印象としてはAzure上に綺麗にまとめて来ています。AIをAIとして世に提供するというよりは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%E9%A5%A6%A5%C9">クラウド</a>ソリューションの一機能として提供したいという思いが伝わってきます。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%BF%A1%BC%A5%D7%A5%E9%A5%A4%A5%BA">エンタープライズ</a>に強い<a class="keyword" href="http://d.hatena.ne.jp/keyword/Microsoft">Microsoft</a>だからこそ、ビジネス活用されるAIのシェアはAzureと共に広げていくという戦略はシンプルで効果的だと思いました。</p><br /> <br /> <br /> <br /> <br /> <br /> <p>↓今すぐ登録すべきキラキラAIサービス<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.products.matrixflow.net%2F" title="MatrixFlow|プログラミング不要のAI構築プラットフォーム" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.products.matrixflow.net/">www.products.matrixflow.net</a></cite></p><br /> <br /> <p>↓今すぐフォローすべきキラキラ アカウント<p><a class="twitter-follow-button" href="https://twitter.com/tdualdir?ref_src=twsrc^tfw" data-show-count="false">Follow @tdualdir</a></p></p><p>じゃあの。</p> tdualdir 私が実践した、エンジニアが超優良企業に転職するための最も簡単な方法 hatenablog://entry/10257846132666896429 2018-11-09T20:07:43+09:00 2018-11-09T20:07:43+09:00 転職先を自分で作る。 (起業する。)↓今すぐフォローすべきキラキラ アカウントFollow @tdualdir↑今すぐフォローすべきキラキラ アカウント <p><b><span style="font-size: 300%">転職先を自分で作る。</span></b><br /> <b><span style="font-size: 300%">(起業する。)</span></b></p><p>↓今すぐフォローすべきキラキラ アカウント<p><a class="twitter-follow-button" href="https://twitter.com/tdualdir?ref_src=twsrc^tfw" data-show-count="false">Follow @tdualdir</a></p>↑今すぐフォローすべきキラキラ アカウント</p> tdualdir PyCon mini OsakaでCharacter-Level CNNについて話してきた。 hatenablog://entry/17391345971646017057 2018-05-19T21:52:39+09:00 2018-05-20T14:26:06+09:00 スライド Character-Level CNN Character-Level CNNとは 今回やること なぜ文字レベルなのか? 論文 構成・アーキテクチャ 日本語のデータセット 結果 誤字・脱字に対する強さ 結論 終わりに 東京在住ですが、なぜかグランフロント大阪で開催されたPyCon mini Osakaで登壇して来ました。 osaka.pycon.jp前日から大阪に乗り込んでました。(久しぶりに弊社の大阪オフィスに行った。) スライド 発表内容は以下のスライドになります。 Characeter-Level CNN from tdualdir www.slideshare.net (画像… <ul class="table-of-contents"> <li><a href="#スライド">スライド</a></li> <li><a href="#Character-Level-CNN">Character-Level CNN</a><ul> <li><a href="#Character-Level-CNNとは">Character-Level CNNとは</a></li> <li><a href="#今回やること">今回やること</a></li> <li><a href="#なぜ文字レベルなのか">なぜ文字レベルなのか?</a></li> <li><a href="#論文">論文</a></li> <li><a href="#構成アーキテクチャ">構成・アーキテクチャ</a></li> <li><a href="#日本語のデータセット">日本語のデータセット</a></li> <li><a href="#結果">結果</a></li> <li><a href="#誤字脱字に対する強さ">誤字・脱字に対する強さ</a></li> <li><a href="#結論">結論</a></li> </ul> </li> <li><a href="#終わりに">終わりに</a></li> </ul><p><br /> 東京在住ですが、なぜか<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B0%A5%E9%A5%F3%A5%D5%A5%ED%A5%F3%A5%C8%C2%E7%BA%E5">グランフロント大阪</a>で開催されたPyCon mini Osakaで登壇して来ました。<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fosaka.pycon.jp%2F" title="Pycon mini Osaka 2018" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://osaka.pycon.jp/">osaka.pycon.jp</a></cite></p><p>前日から大阪に乗り込んでました。(久しぶりに弊社の大阪オフィスに行った。)</p> <div class="section"> <h3 id="スライド">スライド</h3> <p>発表内容は以下のスライドになります。<br /> <iframe src="https://www.slideshare.net/slideshow/embed_code/key/6cMg3tZ20l8FU8" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/tdualdir/characeterlevel-cnn" title="Characeter-Level CNN" target="_blank">Characeter-Level CNN</a> </strong> from <strong><a href="https://www.slideshare.net/tdualdir" target="_blank">tdualdir</a></strong> </div><cite class="hatena-citation"><a href="https://www.slideshare.net/tdualdir/characeterlevel-cnn?ref=https://www.slideshare.net/tdualdir/slideshelf">www.slideshare.net</a></cite><br /> (画像がぼやけていてすまない・・・)<br /> 最初はCNNやTensorFlowの基礎的な説明をして後半からCharacter-Level CNNについて話しました。</p> </div> <div class="section"> <h3 id="Character-Level-CNN">Character-Level CNN</h3> <p>Character-Level CNNのところを説明します。<br /> <br /> </p> <div class="section"> <h4 id="Character-Level-CNNとは">Character-Level CNNとは</h4> <p>文書を文字(Character)単位で区切ってそれをCNNに通してテキスト分類します。 ※単語単位でないのに注意<br /> <br /> </p> </div> <div class="section"> <h4 id="今回やること">今回やること</h4> <p>今回は、テキストからネガティブかポジティブかを判断するタスク(いわゆる感情分析のネガポジ)をこなす分類器を作ることを考えます。<br /> 結果から言うと、オリジナル論文<a href="#f-52504015" name="fn-52504015" title=" Xiang Zhang, Junbo Zhao, Yann LeCun: Character-level Convolutional Networks for Text Classification (https://arxiv.org/abs/1509.01626) ">*1</a>では上手く行かずに、違う<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>で上手く行きました。<br /> <br /> </p> </div> <div class="section"> <h4 id="なぜ文字レベルなのか">なぜ文字レベルなのか?</h4> <p>文字レベルで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%AB%C1%B3%B8%C0%B8%EC%BD%E8%CD%FD">自然言語処理</a>をするというのは珍しいと思いますが(大体は単語レベルで区切る)、そのメリットは<br /> <br /> </p> <ul> <li>前処理がいらない(日本語なら<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%AC%A4%AB%A4%C1%BD%F1%A4%AD">分かち書き</a>が必要ない)</li> <li>タイポやスペルミスが多い文書でも有効(レビュー,チャットなど)</li> <li>文書じゃない物にも適応できる(URL, <a class="keyword" href="http://d.hatena.ne.jp/keyword/Tex">Tex</a>, プログラミングコードなど)</li> </ul><p>などが挙げられます。<br /> <br /> </p> </div> <div class="section"> <h4 id="論文">論文</h4> <p>上手くいった<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>ですが、<br /> Joshua Saxe, Konstantin Berlin: eXpose:A Character-Level Convolutional Neural Network with Embeddings For Detecting Malicious URLs, File Paths and Registry Keys(<a href="https://arxiv.org/abs/1702.08568">https://arxiv.org/abs/1702.08568</a>)<br /> を参考にしました。<br /> 内容はCharacter-Level CNNを使って悪意あるURLやファイルパスを検出するという内容です。<br /> かなり丁寧に書かれていてわかりやすい論文でした。<br /> <br /> </p> </div> <div class="section"> <h4 id="構成アーキテクチャ">構成・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a></h4> <p>処理の流れとしては</p> <ol> <li>文字を低次元に埋め込む</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>サイズが違う複数のCNNに入れて特徴を出力</li> <li>特徴を一つに結合</li> <li>全結合層に通して分類</li> </ol><p>です。</p><br /> <p>1の埋め込みは、(文字 × 埋め込み次元)行列を埋め込み層として用意して、対応する文字の行ベクトルだけを更新します。<figure class="figure-image figure-image-fotolife" title="図1.埋め込み層" width=10><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180520/20180520142008.png" alt="f:id:tdualdir:20180520142008p:plain:w300" title="f:id:tdualdir:20180520142008p:plain:w300" class="hatena-fotolife" style="width:300px" itemprop="image"></span><figcaption>図1.埋め込み層</figcaption></figure></p><br /> <p>2については論文に書いてる図を借りると次のようになります。<figure class="figure-image figure-image-fotolife" title="図2.CNNの処理"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180519/20180519210753.png" alt="f:id:tdualdir:20180519210753p:plain" title="f:id:tdualdir:20180519210753p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図2.CNNの処理</figcaption></figure>1×2,1×3,1×4,1×5というサイズのフィルターにそれぞれ通します。<br /> 様々なWindowで文字のCooccurrence(共起性)を学習してると考えられます。<figure class="figure-image figure-image-fotolife" title="図3.CNN部分の解釈"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180519/20180519211149.png" alt="f:id:tdualdir:20180519211149p:plain" title="f:id:tdualdir:20180519211149p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図3.CNN部分の解釈</figcaption></figure></p><br /> <p>3.特徴を一つに結合、4.全結合層に通して分類はそのままの意味です。</p><p>TensorFlowで実装してTensorboardのグラフに書くと以下のようになります。<figure class="figure-image figure-image-fotolife" title="図4.アーキテクチャ"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180519/20180519205644.png" alt="f:id:tdualdir:20180519205644p:plain" title="f:id:tdualdir:20180519205644p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図4.<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a></figcaption></figure></p><p></p> </div> <div class="section"> <h4 id="日本語のデータセット">日本語のデー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%BB%A5%C3%A5%C8">タセット</a></h4> <p>日本語のデー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%BB%A5%C3%A5%C8">タセット</a>として最近公表されたばかりのchABSA-dataset<a href="#f-07531020" name="fn-07531020" title=" [https://github.com/chakki-works/chABSA-dataset] ">*2</a>を使いました。<br /> 上場企業の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CD%AD%B2%C1%BE%DA%B7%F4%CA%F3%B9%F0%BD%F1">有価証券報告書</a>をベースに作成されたデー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%BB%A5%C3%A5%C8">タセット</a>で、特徴としては「何が」ポジティブ/ネガティブだったのかと言う情報を含んでいます。<br /> これで、「何が」のネガティブとポジティブの数を比べて多い方を文書全体の感情としました。<br /> その結果、訓練データとテストデータを合わせて2830文書が対象となりました。<br /> <br /> </p> </div> <div class="section"> <h4 id="結果">結果</h4> <p>結果は以下のようになりました。<figure class="figure-image figure-image-fotolife" title="図6.loss"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180519/20180519212347.png" alt="f:id:tdualdir:20180519212347p:plain" title="f:id:tdualdir:20180519212347p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図6.loss</figcaption></figure><figure class="figure-image figure-image-fotolife" title="図7.accuracy"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180519/20180519212339.png" alt="f:id:tdualdir:20180519212339p:plain" title="f:id:tdualdir:20180519212339p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図7.accuracy</figcaption></figure></p><p>デー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%BB%A5%C3%A5%C8">タセット</a>が少ないので不安でしたがaccuracyも0.9程度にはなりました。<br /> <br /> </p> </div> <div class="section"> <h4 id="誤字脱字に対する強さ">誤字・脱字に対する強さ</h4> <p>面白いのがここからで、わざと誤字・脱字をしてちゃんとネガポジを判定できるか試してみました。<br /> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180519/20180519212917.png" alt="f:id:tdualdir:20180519212917p:plain" title="f:id:tdualdir:20180519212917p:plain" class="hatena-fotolife" itemprop="image"></span><br /> 「増加傾向」を「加向」とか、「減少傾向」を「減向」にしても問題なく判定できています。</p><p>なので、ここでテストデータの文書の文字を適当な文字に変換した際にどのくらい精度が下がるのかグラフを書いてみました。<figure class="figure-image figure-image-fotolife" title="図8.変えた文字数と精度(character-level)"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180519/20180519213508.png" alt="f:id:tdualdir:20180519213508p:plain" title="f:id:tdualdir:20180519213508p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図8.変えた文字数と精度(character-level)</figcaption></figure></p><p>50文字をランダムな文字に置き換えても精度が8割以上あるのは驚きです。(1つの文書は大体300文字程度なので役1/6が適当な文字と言うこと)</p><p>これを<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mecab">Mecab</a>を使って単語レベルで区切ってCNNで学習させたword-level CNNでも試しました。<figure class="figure-image figure-image-fotolife" title="図9.変えた文字数と精度(word-level)"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180519/20180519213821.png" alt="f:id:tdualdir:20180519213821p:plain" title="f:id:tdualdir:20180519213821p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図9.変えた文字数と精度(word-level)</figcaption></figure></p><p>50文字も変えると精度は0.5なので全く判別出来てないことになります。</p> </div> <div class="section"> <h4 id="結論">結論</h4> <p>Character level CNNは誤字・脱字に強すぎなんじゃwwww<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SNS">SNS</a>メッセージ、チャット、レビューなど最適と言える。<br /> さらに日本語だと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%AC%A4%AB%A4%C1%BD%F1%A4%AD">分かち書き</a>が不要と言うのも魅力的。また、単語で区切ったりしないので辞書が要らず、この実装だけであらゆる言語に対応可能。<br /> <br /> <br /> </p> </div> </div> <div class="section"> <h3 id="終わりに">終わりに</h3> <p>カンファレンスで発表するのは初めてでしたが、発表練習をするのを忘れていたので時間配分がちょっと不安でしたが、まあまあ時間ぴったりに終わったのでよかったです。<br /> カンファレンスは楽しかった。</p><p>コードはここに置いてます。<br /> <a href="https://github.com/Tdual/char_level_cnn">GitHub - Tdual/char_level_cnn: Character level CNN</a></p><br /> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C4%A5%A4%A5%C3%A5%BF%A1%BC">ツイッター</a>やっているのでフォローお願いします。<br /> ↓今すぐフォローすべきキラキラ アカウント<p><a class="twitter-follow-button" href="https://twitter.com/tdualdir?ref_src=twsrc^tfw" data-show-count="false">Follow @tdualdir</a></p></p><p>じゃあの。</p> </div><div class="footnote"> <p class="footnote"><a href="#fn-52504015" name="f-52504015" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text"> Xiang Zhang, Junbo Zhao, Yann LeCun: Character-level Convolutional Networks for Text Classification (<a href="https://arxiv.org/abs/1509.01626">https://arxiv.org/abs/1509.01626</a>) </span></p> <p class="footnote"><a href="#fn-07531020" name="f-07531020" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text"> <a href="https://github.com/chakki-works/chABSA-dataset">https://github.com/chakki-works/chABSA-dataset</a> </span></p> </div> tdualdir 「虚数はあるのか?」という話の物理学的な回答 hatenablog://entry/17391345971642276649 2018-05-08T16:03:25+09:00 2018-05-09T06:35:30+09:00 はじめに 電磁気学/波動・振動論 オイラーの公式と振動 インピーダンスの例 インピーダンスの虚数 量子力学 終わりに 追記(2018-5-9) はじめに GW中にツイッターで「虚数はあるのか?」という話をタイムラインでよく見かけたので自分なりの回答をしようと思います。 私は大学/大学院で素粒子論・超弦理論をやってきた理論物理徒なので物理的な観点から回答します。※虚数はiで表現します。() 電磁気学/波動・振動論 物理で初めて虚数を使うのはおそらく電磁気学か波動・振動論でしょう。 オイラーの公式という形で出て来ると思います。 オイラーの公式 虚数によって指数関数と三角関数が関係付くという美しい公… <ul class="table-of-contents"> <li><a href="#はじめに">はじめに</a></li> <li><a href="#電磁気学波動振動論">電磁気学/波動・振動論</a><ul> <li><a href="#オイラーの公式と振動">オイラーの公式と振動</a></li> <li><a href="#インピーダンスの例">インピーダンスの例</a></li> <li><a href="#インピーダンスの虚数">インピーダンスの虚数</a></li> </ul> </li> <li><a href="#量子力学">量子力学</a></li> <li><a href="#終わりに">終わりに</a></li> <li><a href="#追記2018-5-9">追記(2018-5-9)</a></li> </ul> <div class="section"> <h3 id="はじめに">はじめに</h3> <p>GW中に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C4%A5%A4%A5%C3%A5%BF%A1%BC">ツイッター</a>で「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>はあるのか?」という話をタイムラインでよく見かけたので自分なりの回答をしようと思います。<br /> 私は大学/大学院で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%C7%CE%B3%BB%D2">素粒子</a>論・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C4%B6%B8%B9%CD%FD%CF%C0">超弦理論</a>をやってきた理論物理徒なので物理的な観点から回答します。</p><p>※<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>はiで表現します。(<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20i%5E2%3D-1" alt=" i^2=-1"/>)<br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="電磁気学波動振動論"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C5%BC%A7%B5%A4%B3%D8">電磁気学</a>/波動・振動論</h3> <p>物理で初めて<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>を使うのはおそらく<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C5%BC%A7%B5%A4%B3%D8">電磁気学</a>か波動・振動論でしょう。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%A4%A5%E9%A1%BC%A4%CE%B8%F8%BC%B0">オイラーの公式</a>という形で出て来ると思います。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%A4%A5%E9%A1%BC%A4%CE%B8%F8%BC%B0">オイラーの公式</a><br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20e%5E%7Bi%5Ctheta%7D%20%3D%20%5Ccos%5Ctheta%20%2Bi%5Csin%5Ctheta%20%5Ctag%7B1%7D" alt=" e^{i\theta} = \cos\theta +i\sin\theta \tag{1}"/> <br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>によって指数関数と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BB%B0%B3%D1%B4%D8%BF%F4">三角関数</a>が関係付くという美しい公式です。<br /> <br /> </p> <div class="section"> <h4 id="オイラーの公式と振動"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%A4%A5%E9%A1%BC%A4%CE%B8%F8%BC%B0">オイラーの公式</a>と振動</h4> <p>ご存知の通り<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BB%B0%B3%D1%B4%D8%BF%F4">三角関数</a>は振動を表しているので<img src="https://chart.apis.google.com/chart?cht=tx&chl=e%5E%7Bi%5Ctheta%7D" alt="e^{i\theta}"/>も振動を表現しています。<br /> では振動とはどう言う運動かというと、遠くに行こうとするものを中心に引き戻す力が働くので物体は振動してるわけです。<br /> 遠くに行けば行くほど強い力で引き戻す必要があるので、引き戻す力は距離に比例してるとすると振動は次の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%BF%C6%B0%CA%FD%C4%F8%BC%B0">運動方程式</a>でかけます。<br /> m:振動してる物体の質量<br /> x:位置<br /> t:時間<br /> k:定数(バネ定数)<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20m%5Cfrac%7Bd%5E2x%7D%7Bdt%5E2%7D%3D-kx%20%5Ctag%7B2%7D" alt=" m\frac{d^2x}{dt^2}=-kx \tag{2}"/><br /> 左辺は質量かける加速度、右辺は中心に引き戻す力です。(ma=Fですね。)<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BB%B0%B3%D1%B4%D8%BF%F4">三角関数</a> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x%20%3D%20C%5Csin%5Cleft%28%5Csqrt%7B%5Cfrac%7Bk%7D%7Bm%7D%7Dt%5Cright%29" alt=" x = C\sin\left(\sqrt{\frac{k}{m}}t\right)"/>、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x%20%3D%20C%5Ccos%5Cleft%28%5Csqrt%7B%5Cfrac%7Bk%7D%7Bm%7D%7Dt%5Cright%29" alt=" x = C\cos\left(\sqrt{\frac{k}{m}}t\right)"/>はもちろんこの式を満たしています。(Cは定数)</p><p>さて、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x%3DCe%5E%7Bi%20%5Csqrt%7B%5Cfrac%7Bk%7D%7Bm%7D%7Dt%7D" alt=" x=Ce^{i \sqrt{\frac{k}{m}}t}"/>を(2)式に代入してみてください。(Cは定数)<br /> ちゃんと等式が成立していることがわ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%AB%A4%EB%A4%C8">かると</a>思います。つまり、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20e%5E%7Bi%5Ctheta%7D" alt=" e^{i\theta}"/>が振動を表しているということです。(今の場合は<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctheta%3D%5Csqrt%7B%5Cfrac%7Bk%7D%7Bm%7D%7Dt" alt=" \theta=\sqrt{\frac{k}{m}}t"/>)<br /> また、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x%3DCe%5E%7Bi%20%5Csqrt%7B%5Cfrac%7Bk%7D%7Bm%7D%7Dt%7D" alt=" x=Ce^{i \sqrt{\frac{k}{m}}t}"/>の代わりに時間に依存しない項をeの肩に追加しても式を満たします。(<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20C%3DC%27e%5E%7Bi%5Cdelta%7D" alt=" C=C&#39;e^{i\delta}"/>と置き直す。)<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x%3DC%27e%5E%7Bi%20%28%5Csqrt%7B%5Cfrac%7Bk%7D%7Bm%7D%7Dt%2B%5Cdelta%29%7D" alt=" x=C&#39;e^{i (\sqrt{\frac{k}{m}}t+\delta)}"/><br /> この<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cdelta" alt=" \delta"/>は位相(phase)と呼ばれいてtが0の時の値なのでどのような状態で振動が始まったのかを表現しています。</p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20e%5E%7Bi%5Ctheta%7D" alt=" e^{i\theta}"/>は物理では様々な分野で出てきます。<br /> ですので、物理学徒は<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20e%5E%7Bi%5Ctheta%7D" alt=" e^{i\theta}"/>をみたら「振動だ!」と思うように訓練されています。<br /> <br /> <br /> </p> </div> <div class="section"> <h4 id="インピーダンスの例"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%D4%A1%BC%A5%C0%A5%F3%A5%B9">インピーダンス</a>の例</h4> <p>抵抗とコイルが直列につながっている回路に交流電流を流すことを考えます。<br /> V:電圧<br /> I:電流<br /> R:抵抗<br /> L:インダクタンス<br /> t:時間<br /> とすると、電位差の和は0になるというキルヒホッフの第二法則より<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20V-RI-L%5Cfrac%7BdI%7D%7Bdt%7D%20%3D%200%20%5Ctag%7B3%7D" alt=" V-RI-L\frac{dI}{dt} = 0 \tag{3}"/><br /> となります。1項目は起電力で、2項目は抵抗にかかる電圧(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%E0%A4%CE%CB%A1%C2%A7">オームの法則</a>)、3項目はコイルにかかる電圧です。<br /> さて、交流電流は振動しているので電流は<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20I%3DI_%7B0%7De%5E%7Bi%5Comega%20t%7D" alt=" I=I_{0}e^{i\omega t}"/>と書けそうです。(<img src="https://chart.apis.google.com/chart?cht=tx&chl=I_0" alt="I_0"/>は定数)<br /> これを代入すると、<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20V%20%3D%20%28R%2Bi%5Comega%20L%29I%20%5Ctag%7B4%7D" alt=" V = (R+i\omega L)I \tag{4}"/><br /> になることがわかります。つまり全体として見れば、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20R%2Bi%5Comega%20L" alt=" R+i\omega L"/>の抵抗がかかっているように見えます。<br /> この、<img src="https://chart.apis.google.com/chart?cht=tx&chl=V" alt="V"/>と<img src="https://chart.apis.google.com/chart?cht=tx&chl=I" alt="I"/>の比である<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20R%2Bi%5Comega%20L" alt=" R+i\omega L"/>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%D4%A1%BC%A5%C0%A5%F3%A5%B9">インピーダンス</a>と呼びます。以後、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%D4%A1%BC%A5%C0%A5%F3%A5%B9">インピーダンス</a>をZと表記します。<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20Z%3D%20R%2Bi%5Comega%20L%20%5Ctag%7B5%7D" alt=" Z= R+i\omega L \tag{5}"/><br /> (5)式を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%C1%C7%CA%BF%CC%CC">複素平面</a>で表すで表現すると様々なことがわかります。図1となります。<figure class="figure-image figure-image-fotolife" title="図1.複素平面上のインピーダンス"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180507/20180507231918.png" alt="f:id:tdualdir:20180507231918p:plain" title="f:id:tdualdir:20180507231918p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図1.<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%C1%C7%CA%BF%CC%CC">複素平面</a>上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%D4%A1%BC%A5%C0%A5%F3%A5%B9">インピーダンス</a></figcaption></figure>この図から直ちに大きさ<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%7CZ%7C%3D%5Csqrt%7BR%5E2%2B%28%5Comega%20L%29%5E2%7D" alt=" |Z|=\sqrt{R^2+(\omega L)^2}"/>,電圧と電流の位相差<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctan%5Calpha%3D%5Cfrac%7B%5Comega%20L%7D%7BR%7D" alt=" \tan\alpha=\frac{\omega L}{R}"/>であるとわかります。<br /> <br /> <br /> <br /> </p> </div> <div class="section"> <h4 id="インピーダンスの虚数"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%D4%A1%BC%A5%C0%A5%F3%A5%B9">インピーダンス</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a></h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%D4%A1%BC%A5%C0%A5%F3%A5%B9">インピーダンス</a>、つまり電圧と電流の比に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>が出ました。<br /> つまり、<b><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>は存在する?</b><br /> 結論から言うとそうとは言い切れません。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%A4%A5%E9%A1%BC%A4%CE%B8%F8%BC%B0">オイラーの公式</a>を(1)の<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Ctheta" alt="\theta"/>に<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cfrac%7B%5Cpi%7D%7B2%7D" alt=" \frac{\pi}{2}"/>を代入してみてください。<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20e%5E%7B%28i%5Cfrac%7B%5Cpi%7D%7B2%7D%29%7D%20%3D%20i" alt=" e^{(i\frac{\pi}{2})} = i"/>になります。<br /> つまり<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%D4%A1%BC%A5%C0%A5%F3%A5%B9">インピーダンス</a>は<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20R%2B%5Comega%20Le%5E%7B%28i%5Cfrac%7B%5Cpi%7D%7B2%7D%29%7D" alt=" R+\omega Le^{(i\frac{\pi}{2})}"/>と書けます。<br /> 電流が<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20I_0e%5E%7Bi%5Comega%20t%7D" alt=" I_0e^{i\omega t}"/>であり、(4)の再び代入すると、<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20V%3DRI_0e%5E%7Bi%5Comega%20t%7D%20%2B%20%5Comega%20LI_0e%5E%7Bi%28%5Comega%20t%2B%20%5Cfrac%7B%5Cpi%7D%7B2%7D%29%7D" alt=" V=RI_0e^{i\omega t} + \omega LI_0e^{i(\omega t+ \frac{\pi}{2})}"/>となります。<br /> これが示しているのはコイルに入ったら位相が<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cfrac%7B%5Cpi%7D%7B2%7D" alt=" \frac{\pi}{2}"/>ずれるということを表現しているにすぎません。<br /> 実際に<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20I%3DI_%7B0%7De%5E%7Bi%5Comega%20t%7D" alt=" I=I_{0}e^{i\omega t}"/>の代わりに<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20I%3DI_%7B0%7D%5Csin%28%5Comega%20t%29" alt=" I=I_{0}\sin(\omega t)"/>と表現しても良いはずです。<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20V%3DV_0%5Csin%28%5Comega%20t%20%2B%20%5Calpha%29" alt=" V=V_0\sin(\omega t + \alpha)"/><br /> これを(3)式に代入すると<br /> \begin{align}<br /> V_0\sin(\omega t + \alpha) &= RI_0\sin(\omega t) + \omega LI_0\cos(\omega t) \\<br /> &= I_0\sqrt{R^2+(\omega L)^2}\sin(\omega t + \theta_0) \tag{6}<br /> \end{align}<br /> 但し、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctan%5Ctheta_0%3D%5Cfrac%7B%5Comega%20L%7D%7BR%7D" alt=" \tan\theta_0=\frac{\omega L}{R}"/><br /> 両辺を比べると、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20V_0%20%3D%20%20I_0%5Csqrt%7BR%5E2%2B%28%5Comega%20L%29%5E2%7D" alt=" V_0 = I_0\sqrt{R^2+(\omega L)^2}"/>, <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctan%5Calpha%3D%5Cfrac%7B%5Comega%20L%7D%7BR%7D" alt=" \tan\alpha=\frac{\omega L}{R}"/>となって<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%C1%C7%BF%F4">複素数</a>を使わなくても同じ結果を得られます。</p><p>ではなぜ最初に<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20I%3DI_%7B0%7De%5E%7Bi%5Comega%20t%7D" alt=" I=I_{0}e^{i\omega t}"/>を使ったのかというと(6)式の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BB%B0%B3%D1%B4%D8%BF%F4">三角関数</a>の合成を使うよりも<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%C1%C7%CA%BF%CC%CC">複素平面</a>の幾何として扱った方が簡単だからです。<br /> つまり、ここで使っている<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%C1%C7%BF%F4">複素数</a>は本質的なものではなくあくまでも便利な道具として使っています。</p><p>実は他の分野で扱われる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>も同じで、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>を使わなくても解ける問題が殆どです。<br /> 次の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%CC%BB%D2%CE%CF%B3%D8">量子力学</a>を除いては。<br /> <br /> <br /> </p> </div> </div> <div class="section"> <h3 id="量子力学"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%CC%BB%D2%CE%CF%B3%D8">量子力学</a></h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%CC%BB%D2%CE%CF%B3%D8">量子力学</a>の基礎方程式として状態の変化を記述する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%E5%A5%EC%A5%C7%A5%A3%A5%F3%A5%AC%A1%BC%CA%FD%C4%F8%BC%B0">シュレディンガー方程式</a>というのがあります。<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20ih%5Cfrac%7Bd%5Cpsi%28t%2Cx%2Cy%2Cz%29%7D%7Bdt%7D%20%3D%20%20-%5Cfrac%7B%5Chbar%5E2%7D%7B2m%7D%5Cnabla%5E2%20%5Cpsi%28t%2Cx%2Cy%2Cz%29%20%2B%20V%28x%2Cy%2Cz%29%20%5Cpsi%28t%2Cx%2Cy%2Cz%29%20%20%5Ctag%7B7%7D" alt=" ih\frac{d\psi(t,x,y,z)}{dt} = -\frac{\hbar^2}{2m}\nabla^2 \psi(t,x,y,z) + V(x,y,z) \psi(t,x,y,z) \tag{7}"/><br /> h:<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%F3%A5%AF%C4%EA%BF%F4">プランク定数</a><br /> m:が粒子の質量<br /> V:ポテンシャル<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cpsi" alt=" \psi"/>:<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C7%C8%C6%B0%B4%D8%BF%F4">波動関数</a>(状態を表す関数)<br /> t:時間<br /> x,y,z:それぞれ空間座標<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cnabla%5E2" alt=" \nabla^2"/>:<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%D7%A5%E9%A5%B7%A5%A2%A5%F3">ラプラシアン</a></p><p>この方程式には初めから<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>が入っています。<br /> しかし、人間が観測する物理量は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%CC%BB%D2%CE%CF%B3%D8">量子力学</a>では<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C7%C8%C6%B0%B4%D8%BF%F4">波動関数</a>に働く作用で、実数になります。(というか実数になるようにしてます。)<br /> また、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cpsi" alt="\psi"/>に関しても物理として意味があるのは<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cpsi" alt="\psi"/>ではなく<img src="https://chart.apis.google.com/chart?cht=tx&chl=%7C%5Cpsi%7C%5E2" alt="|\psi|^2"/>です。<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7C%5Cpsi%7C%5E2" alt="|\psi|^2"/>が粒子の存在確率密度を表すというのが一般的な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%CC%BB%D2%CE%CF%B3%D8">量子力学</a>の解釈です。<br /> 確率密度なので空間で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>すると1になります。<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cint%5Cint%5Cint%20%7C%5Cpsi%28t%2Cx%2Cy%2Cz%29%7C%5E2%20dxdydz%20%3D%201%20%5Ctag%7B8%7D" alt=" \int\int\int |\psi(t,x,y,z)|^2 dxdydz = 1 \tag{8}"/></p><br /> <p>では、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%CC%BB%D2%CE%CF%B3%D8">量子力学</a>においても<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>を使わずに表現できるのでしょうか?</p><p>その前に(7)式は両辺に複数共役をとっても成り立つはずなので<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cpsi%5E%2A" alt="\psi^*"/>が成り立つ方程式は<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20-ih%5Cfrac%7Bd%5Cpsi%5E%2A%28t%2Cx%2Cy%2Cz%29%7D%7Bdt%7D%20%3D%20%20-%5Cfrac%7B%5Chbar%5E2%7D%7B2m%7D%5Cnabla%5E2%20%5Cpsi%5E%2A%28t%2Cx%2Cy%2Cz%29%20%2B%20V%28x%2Cy%2Cz%29%20%5Cpsi%5E%2A%28t%2Cx%2Cy%2Cz%29%20%20%5Ctag%7B9%7D" alt=" -ih\frac{d\psi^*(t,x,y,z)}{dt} = -\frac{\hbar^2}{2m}\nabla^2 \psi^*(t,x,y,z) + V(x,y,z) \psi^*(t,x,y,z) \tag{9}"/><br /> となります。(これは後で使います。)</p><br /> <p>さて、確率密度の時間変化を考えます。<br /> \begin{align}<br /> \frac{d|\psi|^2}{dt} &= \frac{d}{dt}(\psi^*\psi) \\<br /> & = \frac{d\psi^*}{dt}\psi + \psi^*\frac{d\psi}{dt} \\<br /> & = -\frac{\hbar}{2mi}\left( \psi^\ast\nabla^2 \psi - (\nabla^2 \psi^\ast)\psi \right)\\<br /> & = -\frac{\hbar}{2mi} \nabla \cdot \left( \psi^* \nabla \psi - (\nabla \psi^*)\psi \right)\\<br /> & = - \nabla \cdot { \frac{\hbar}{2mi} \left(\psi^* \nabla \psi - (\nabla \psi^*)\psi \right) }<br /> \end{align}<br /> 3行目の式変形で(7),(8)を使った。また、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cnabla%20%5Ccdot" alt=" \nabla \cdot"/>は<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20div" alt=" div"/>とも書かれ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%D0%A1%BC%A5%B8%A5%A7%A5%F3%A5%B9">ダイバージェンス</a>ですね。</p><br /> <p>ここで、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Crho%20%3D%7C%5Cpsi%7C%5E2%20" alt=" \rho =|\psi|^2 "/>, <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20j%20%3D%5Cfrac%7B%5Chbar%7D%7B2mi%7D%20%5Cleft%28%5Cpsi%5E%2A%20%5Cnabla%20%5Cpsi%20-%20%28%5Cnabla%20%5Cpsi%5E%2A%29%5Cpsi%20%5Cright%29%20" alt=" j =\frac{\hbar}{2mi} \left(\psi^* \nabla \psi - (\nabla \psi^*)\psi \right) "/>とすると、<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cfrac%7Bd%5Crho%7D%7Bdt%7D%20%3D%20-%20%5Cnabla%20%5Ccdot%20j%20%5Ctag%7B10%7D" alt=" \frac{d\rho}{dt} = - \nabla \cdot j \tag{10}"/><br /> と書けます。<br /> (10)式は連続方程式と呼ばれていて、確率密度<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Crho" alt=" \rho"/>の時間変化がjという流れとなるという式です。(jは確率密度流と呼ばれています。)<br /> この連続方程式は確率密度が急に湧いてきたり、無くなったりせず空間上で連続的に変化することを表してます。<br /> 確率密度なら当然満たすべき性質です。</p><p>さて、この確率密度流の係数に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>が出てきました。<br /> 先ほどの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%D4%A1%BC%A5%C0%A5%F3%A5%B9">インピーダンス</a>の時と違うのは<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cpsi" alt=" \psi"/>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%C1%C7%BF%F4">複素数</a>とした訳ではないのに始めから確率密度流に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>が入っていることです。<br /> さらに確率密度は実数なので(10)の左辺も実数で、確率密度流は実数になるべきです。そうするためには<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cpsi" alt=" \psi"/>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%C1%C7%BF%F4">複素数</a>である必要があります。<br /> (そもそも<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cpsi" alt=" \psi"/>が実数なら<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cpsi%5E%2A%3D%5Cpsi" alt=" \psi^*=\psi"/>となって確率密度流は常に0になる。<br /> また、(8)式より「右辺が1なんだから確率密度の時間<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC">微分</a>は0になるのでは?・・・」と思った人は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%A6%A5%B9">ガウス</a>の定理などを思い出しながら実際に計算してみて下さい。)</p><p>つまり、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%7C%5Cpsi%7C%5E2%20" alt="|\psi|^2 "/>を確率密度と解釈するなら<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%CC%BB%D2%CE%CF%B3%D8">量子力学</a>には<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>は必須であると言えます。<br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="終わりに">終わりに</h3> <p>これが「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>はあるのか?」という問いに完璧に答えるかと言われてると微妙ではありますね。<br /> そもそも<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%CC%BB%D2%CE%CF%B3%D8">量子力学</a>の解釈が間違っているとか、実は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>を使わなくて済む別の方程式があるのではないかとか色々ツッコミどころはあると思います。<br /> ただ、少なくとも私は「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>はあるの?」とか「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>は必要なの?」って聞かれた場合は「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>が無いと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%CC%BB%D2%CE%CF%B3%D8">量子力学</a>の確率解釈が成立しない。」と答えます。<br /> <br /> </p> </div> <div class="section"> <h3 id="追記2018-5-9">追記(2018-5-9)</h3> <p>フィードバック<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Re(ψ),Im(ψ) の2つの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C7%C8%C6%B0%B4%D8%BF%F4">波動関数</a>があって、その二乗和が確率になるってモデル作ったら<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>いらなくないでしょうか?</p>&mdash; 平田朋義 (@tomo3141592653) <a href="https://twitter.com/tomo3141592653/status/993762425508777984?ref_src=twsrc%5Etfw">2018年5月8日</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p><p><blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">問題は量子系を「複素」Hilbert空間で記述することがどれだけ本質的なのかというところですが、U(1)の下で変換する複素<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AB%A5%E9%A1%BC">スカラー</a>場は、これと同型なSO(2)の下で変換する実2成分場で書いてもいいはずなので、このような場は直交行列の下で時間発展すると解釈できないでしょうか?</p>&mdash; れおなち (@leonacism) <a href="https://twitter.com/leonacism/status/993944921403899904?ref_src=twsrc%5Etfw">2018年5月8日</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p><br /> <br /> <p>これらの議論を受けて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>を使わなくても<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%CC%BB%D2%CE%CF%B3%D8">量子力学</a>は構成できる気もして来ました。</p><p>現段階での、理解としては以下のツイートになります。<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">実<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D2%A5%EB%A5%D9%A5%EB%A5%C8">ヒルベルト</a>ではダメで複素<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D2%A5%EB%A5%D9%A5%EB%A5%C8">ヒルベルト</a>じゃないと導出できない性質があれば、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%CC%BB%D2%CE%CF%B3%D8">量子力学</a>には本質的に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%F5%BF%F4">虚数</a>が必要って言えるのか。<br>あるのか?</p>&mdash; tdual@情報幾何 (@tdualdir) <a href="https://twitter.com/tdualdir/status/993961456692424704?ref_src=twsrc%5Etfw">2018年5月8日</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p><p>詳しい方がいたら教えてください><</p><br /> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C4%A5%A4%A5%C3%A5%BF%A1%BC">ツイッター</a>やっているのでフォローお願いします。<br /> ↓今すぐフォローすべきキラキラ アカウント<p><a class="twitter-follow-button" href="https://twitter.com/tdualdir?ref_src=twsrc^tfw" data-show-count="false">Follow @tdualdir</a></p></p><p>じゃあの。</p> </div> tdualdir 日記20180507 hatenablog://entry/17391345971642326440 2018-05-07T22:06:22+09:00 2018-05-07T22:06:22+09:00 日記じゃ 前処理大全が業務で役に立った Macの隠しファイル表示/非表示コマンド TrelloのPower-UpsをTwitterに変えた。 データドリブンなカナブン 前処理大全が業務で役に立った 例えば、 a, 1 b, 2 c, 3 b, 4 a, 5 a, 6 を a, [1,5,6] b, [2,4] c, [3]という処理をしたかった。 pandasのgroupbyでどうにかなるのか?ってちょっと悩んだが、前処理大全でagg関数でlambdaを使う処理をやったことを思い出した。agg("カラム名", lambda x: xの計算) の時のxは Seriesオブジェクトになっているので… <p>日記じゃ</p> <ul class="table-of-contents"> <li><a href="#前処理大全が業務で役に立った">前処理大全が業務で役に立った</a></li> <li><a href="#Macの隠しファイル表示非表示コマンド">Macの隠しファイル表示/非表示コマンド</a></li> <li><a href="#TrelloのPower-UpsをTwitterに変えた">TrelloのPower-UpsをTwitterに変えた。</a></li> <li><a href="#データドリブンなカナブン">データドリブンなカナブン</a></li> </ul> <div class="section"> <h3 id="前処理大全が業務で役に立った">前処理大全が業務で役に立った</h3> <p>例えば、</p> <pre class="code" data-lang="" data-unlink>a, 1 b, 2 c, 3 b, 4 a, 5 a, 6 </pre><p>を</p> <pre class="code" data-lang="" data-unlink>a, [1,5,6] b, [2,4] c, [3]</pre><p>という処理をしたかった。<br /> pandasのgroupbyでどうにかなるのか?ってちょっと悩んだが、前処理大全でagg関数でlambdaを使う処理をやったことを思い出した。</p><p>agg("<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A5%E9%A5%E0%CC%BE">カラム名</a>", lambda x: xの計算) の時のxは Seriesオブジェクトになっているのでtolist()でリスト化したら上手くいった。<br /> <script src="https://gist.github.com/Tdual/c35a0a1b570e1567a5677e682167ebcd.js"> </script><cite class="hatena-citation"><a href="https://gist.github.com/Tdual/c35a0a1b570e1567a5677e682167ebcd">gist.github.com</a></cite><br /> なお、SeriesGroupByにapply(list)してもできる模様。(その場合の返り値はDataFrameじゃなくてSeries)</p><p>ありがとう前処理大全!<br /> <br /> <br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="Macの隠しファイル表示非表示コマンド"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>の隠しファイル表示/非表示コマンド</h3> <p>以前、日記に以下のコマンドをターミナルに打てば良いと書いた。<br /> <iframe src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Ftdual.hatenablog.com%2Fentry%2F2018%2F05%2F02%2F022703" title="日記20180501 - tdualのブログ" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="http://tdual.hatenablog.com/entry/2018/05/02/022703">tdual.hatenablog.com</a></cite><br /> </p> <pre class="code" data-lang="" data-unlink>defaults write com.apple.finder AppleShowAllFiles TRUE killAll Finder</pre><p>しかしもっと簡単なキーボードコマンドがあった。</p><p><b>[command] + [shift] + [.]</b></p><p>で切り替えられる。<br /> <br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="TrelloのPower-UpsをTwitterに変えた">TrelloのPower-<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ups">Ups</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a>に変えた。</h3> <p>Power-<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ups">Ups</a>は無料プランなら一つのボードに一つ設定できる。<br /> 今までは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Github">Github</a>にしてたのですが、どうも使わないので<a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a>が埋め込めるPower-<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ups">Ups</a>にした。<br /> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180507/20180507171056.png" alt="f:id:tdualdir:20180507171056p:plain" title="f:id:tdualdir:20180507171056p:plain" class="hatena-fotolife" itemprop="image"></span></p><br /> <br /> <p></p> </div> <div class="section"> <h3 id="データドリブンなカナブン">データドリブンなカナブン</h3> <p><blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">衝動的に作ってしまった・・・ <a href="https://t.co/aQv0RWeSa9">pic.twitter.com/aQv0RWeSa9</a></p>&mdash; tdual@情報幾何 (@tdualdir) <a href="https://twitter.com/tdualdir/status/993376259643068416?ref_src=twsrc%5Etfw">2018年5月7日</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p> </div> tdualdir 日記20180506 hatenablog://entry/17391345971642144339 2018-05-06T23:50:42+09:00 2018-05-06T23:50:42+09:00 日記じゃ。 Pycon mini Osakaの資料作り Tensorflowのデバイスのログ出力 分散表現という言葉 Pycon mini Osakaの資料作り 資料を作った。7割くらい出来たけど、資料を作ってるとまたアーキテクチャを変えたり色々と実験したくなるので資料が進まない。 あと、資料にアーキテクチャ図を書こうと思ってTensorboardのグラフを載せようと思ったけどグラフの流れは縦向きなので如何せんスライドに貼りずらい。 Tensorboardのグラフは横向きに出来ないのか? Tensorflowのデバイスのログ出力 Tensorflowのデバイス(CPU,GPU)のログ出力をする… <p>日記じゃ。</p> <ul class="table-of-contents"> <li><a href="#Pycon-mini-Osakaの資料作り">Pycon mini Osakaの資料作り</a></li> <li><a href="#Tensorflowのデバイスのログ出力">Tensorflowのデバイスのログ出力</a></li> <li><a href="#分散表現という言葉">分散表現という言葉</a></li> </ul> <div class="section"> <h3 id="Pycon-mini-Osakaの資料作り">Pycon mini Osakaの資料作り</h3> <p>資料を作った。7割くらい出来たけど、資料を作ってるとまた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>を変えたり色々と実験したくなるので資料が進まない。<br /> あと、資料に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>図を書こうと思ってTensorboardのグラフを載せようと思ったけどグラフの流れは縦向きなので如何せんスライドに貼りずらい。<br /> Tensorboardのグラフは横向きに出来ないのか?<br /> <br /> <br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="Tensorflowのデバイスのログ出力">Tensorflowのデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>のログ出力</h3> <p>Tensorflowのデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>(CPU,<a class="keyword" href="http://d.hatena.ne.jp/keyword/GPU">GPU</a>)のログ出力をするにはSessionで設定すれば良い。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> tensorflow <span class="synStatement">as</span> tf a = tf.constant([<span class="synConstant">1.0</span>, <span class="synConstant">2.0</span>, <span class="synConstant">3.0</span>, <span class="synConstant">4.0</span>, <span class="synConstant">5.0</span>, <span class="synConstant">6.0</span>], shape=[<span class="synConstant">2</span>, <span class="synConstant">3</span>], name=<span class="synConstant">'a'</span>) b = tf.constant([<span class="synConstant">1.0</span>, <span class="synConstant">2.0</span>, <span class="synConstant">3.0</span>, <span class="synConstant">4.0</span>, <span class="synConstant">5.0</span>, <span class="synConstant">6.0</span>], shape=[<span class="synConstant">3</span>, <span class="synConstant">2</span>], name=<span class="synConstant">'b'</span>) c = tf.matmul(a, b) sess = tf.Session(config=tf.ConfigProto(log_device_placement=<span class="synIdentifier">True</span>)) <span class="synIdentifier">print</span>(sess.run(c)) </pre><p>出力</p> <pre class="code" data-lang="" data-unlink>2018-05-06 22:58:47.845758: I tensorflow/core/common_runtime/placer.cc:886] MatMul: (MatMul)/job:localhost/replica:0/task:0/device:CPU:0 b: (Const): /job:localhost/replica:0/task:0/device:CPU:0 2018-05-06 22:58:47.845783: I tensorflow/core/common_runtime/placer.cc:886] b: (Const)/job:localhost/replica:0/task:0/device:CPU:0 a: (Const): /job:localhost/replica:0/task:0/device:CPU:0 2018-05-06 22:58:47.845808: I tensorflow/core/common_runtime/placer.cc:886] a: (Const)/job:localhost/replica:0/task:0/device:CPU:0 [[22. 28.] [49. 64.]]</pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A1%BC%A5%D7%A5%EA%A5%BF">インタープリタ</a>でやるとこれで良いのだがupyter notebook上で実行するとlogは出力されない・・・<br /> あれ?って思ってjupter notebookのログを見るとそっちに出力されてた。<br /> なんとかしてjupyter notebookで表示しようと思ったけど、<a class="keyword" href="http://d.hatena.ne.jp/keyword/C%2B%2B">C++</a>のエラー標準出力は表示されないだと・・・<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fstackoverflow.com%2Fquestions%2F39677168%2Ftensorflow-documentations-example-code-on-logging-device-placement-doesnt-pr%2F39681826" title="Tensorflow documentation&#39;s example code on &quot;Logging Device Placement&quot; doesn&#39;t print out anything" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://stackoverflow.com/questions/39677168/tensorflow-documentations-example-code-on-logging-device-placement-doesnt-pr/39681826">stackoverflow.com</a></cite></p><br /> <br /> <br /> <p></p> </div> <div class="section"> <h3 id="分散表現という言葉">分散表現という言葉</h3> <p>単語の埋め込みを分散表現(Distributed representation)とも言うが「分散」ってなんだ?って思って調べたけどなんか深そうだった。<br /> 一応、one-hotベクトルじゃなくて複数成分で単語を表現出来ているときに分散表現と呼ばれていると言える。<br /> 分布仮説との関係、認識の類似性としての表現、word2vecのように計算ができることなど色々な側面があってちゃんとまとめる必要がありそう。</p> </div> tdualdir 日記20180505 hatenablog://entry/17391345971641935592 2018-05-06T12:54:33+09:00 2018-05-06T12:54:33+09:00 日記じゃ 茨城のひたち海浜公園にネモフィラを見に行った。 character level cnnで文書の最大長を変えて実験 Instant Hotspotを知らないうちに使ってた 茨城のひたち海浜公園にネモフィラを見に行った。 ネモフィラっていう青い花をTwitterなどで見かけて綺麗だったのと、せっかくのゴルデンウィークだしちょっと小旅行するかってことで「ひたち海浜公園」に行った。 国営ひたち海浜公園 – 海と空と緑がともだち。ひたち海浜公園は、茨城県ひたちなか市にある国営公園です。最寄駅は「勝田駅」で、行きは品川から「JR特急ときわ」に乗って行って1時間30分くらい。 それにしても普通の運… <p>日記じゃ</p> <ul class="table-of-contents"> <li><a href="#茨城のひたち海浜公園にネモフィラを見に行った">茨城のひたち海浜公園にネモフィラを見に行った。</a></li> <li><a href="#character-level-cnnで文書の最大長を変えて実験">character level cnnで文書の最大長を変えて実験</a></li> <li><a href="#Instant-Hotspotを知らないうちに使ってた">Instant Hotspotを知らないうちに使ってた</a></li> </ul> <div class="section"> <h3 id="茨城のひたち海浜公園にネモフィラを見に行った">茨城の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%D2%A4%BF%A4%C1%B3%A4%C9%CD%B8%F8%B1%E0">ひたち海浜公園</a>に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CD%A5%E2%A5%D5%A5%A3%A5%E9">ネモフィラ</a>を見に行った。</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CD%A5%E2%A5%D5%A5%A3%A5%E9">ネモフィラ</a>っていう<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%C4%A4%A4%B2%D6">青い花</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a>などで見かけて綺麗だったのと、せっかくのゴルデンウィークだしちょっと小旅行するかってことで「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%D2%A4%BF%A4%C1%B3%A4%C9%CD%B8%F8%B1%E0">ひたち海浜公園</a>」に行った。<br /> <a href="http://hitachikaihin.jp/">&#x56FD;&#x55B6;&#x3072;&#x305F;&#x3061;&#x6D77;&#x6D5C;&#x516C;&#x5712; &ndash; &#x6D77;&#x3068;&#x7A7A;&#x3068;&#x7DD1;&#x304C;&#x3068;&#x3082;&#x3060;&#x3061;&#x3002;&#x3072;&#x305F;&#x3061;&#x6D77;&#x6D5C;&#x516C;&#x5712;&#x306F;&#x3001;&#x8328;&#x57CE;&#x770C;&#x3072;&#x305F;&#x3061;&#x306A;&#x304B;&#x5E02;&#x306B;&#x3042;&#x308B;&#x56FD;&#x55B6;&#x516C;&#x5712;&#x3067;&#x3059;&#x3002;</a></p><p>最寄駅は「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%A1%C5%C4%B1%D8">勝田駅</a>」で、行きは品川から「JR特急ときわ」に乗って行って1時間30分くらい。<br /> それにしても普通の運賃と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%C3%B5%DE%B7%F4">特急券</a>が別にあるシステムは面倒臭いし、ややこしいのでどうにかならんものか。<br /> (日本人でもややこしいんだから海外の観光客なら尚更混乱するでしょうね。)</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%A1%C5%C4%B1%D8">勝田駅</a>からは専用のバスが出ていて15分かからないくらいで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%D2%A4%BF%A4%C1%B3%A4%C9%CD%B8%F8%B1%E0">ひたち海浜公園</a>に着いた。<br /> 暑かったのでTシャツで行ったが、海の近くなので風が結構冷たかった。<br /> 入場料は大人400円で、中学生以下は無料という激安だった。</p><p>園内は思ったより広くて、たこ焼きやかき氷などの屋台があちこちにあってテーブルもたくさん設置されていてのんびり過ごせる感じだった。<br /> 肝心の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CD%A5%E2%A5%D5%A5%A3%A5%E9">ネモフィラ</a>は10分程度歩いたら見えてきた。<br /> 小さな丘を登りながら<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CD%A5%E2%A5%D5%A5%A3%A5%E9">ネモフィラ</a>を楽しむ形になってた。<br /> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180506/20180506115852.jpg" alt="f:id:tdualdir:20180506115852j:plain" title="f:id:tdualdir:20180506115852j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180506/20180506115931.jpg" alt="f:id:tdualdir:20180506115931j:plain" title="f:id:tdualdir:20180506115931j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180506/20180506115855.jpg" alt="f:id:tdualdir:20180506115855j:plain" title="f:id:tdualdir:20180506115855j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180506/20180506115911.jpg" alt="f:id:tdualdir:20180506115911j:plain" title="f:id:tdualdir:20180506115911j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180506/20180506115917.jpg" alt="f:id:tdualdir:20180506115917j:plain" title="f:id:tdualdir:20180506115917j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180506/20180506115919.jpg" alt="f:id:tdualdir:20180506115919j:plain" title="f:id:tdualdir:20180506115919j:plain" class="hatena-fotolife" itemprop="image"></span><br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CD%A5%E2%A5%D5%A5%A3%A5%E9">ネモフィラ</a>で丘が青くなっているのは神秘的やな。</p><br /> <p>丘の頂上からは海が見えた。空も雲一つなくて見渡す限り青色で綺麗だった(写真はない。)</p><br /> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CD%A5%E2%A5%D5%A5%A3%A5%E9">ネモフィラ</a>を見た後は厚切りポテトチップスを屋台で買って座って食べて、帰った。<br /> 帰りは特急に乗らなかったが、勝田から日暮里まで2時間以上かかった。眠かった。<br /> 久しぶりに歩いたので疲れたが、まあ、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B4%A1%BC%A5%EB%A5%C7%A5%F3%A5%A6%A5%A3%A1%BC%A5%AF">ゴールデンウィーク</a>っぽいことをしたのでよかった。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CD%A5%E2%A5%D5%A5%A3%A5%E9">ネモフィラ</a>も綺麗だったし。<br /> 今、<a class="keyword" href="http://d.hatena.ne.jp/keyword/wiki">wiki</a>で調べたけど<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CD%A5%E2%A5%D5%A5%A3%A5%E9">ネモフィラ</a>って英語では"baby blue eyes"ともいうのか。なるほど。<br /> <br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="character-level-cnnで文書の最大長を変えて実験">character level cnnで文書の最大長を変えて実験</h3> <p>文書の最大長が長すぎると埋め込む前の次元が大きくなってしまって処理に時間がかかるので1000文字で切ってた。<br /> もちろん1000文字以上の文書だと途中で切られているがそれでも十分に極性を表現できていると考える。(原論文でも1014とかで切ってた。)<br /> ただ、実験として最大長を2000文字に変えてみた。<br /> まだ途中だけど情報が多い分やはり収束は速い。<br /> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180506/20180506123426.png" alt="f:id:tdualdir:20180506123426p:plain" title="f:id:tdualdir:20180506123426p:plain" class="hatena-fotolife" itemprop="image"></span><br /> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180506/20180506123437.png" alt="f:id:tdualdir:20180506123437p:plain" title="f:id:tdualdir:20180506123437p:plain" class="hatena-fotolife" itemprop="image"></span><br /> 青い方が2000文字<br /> 赤い方が1000文字<br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="Instant-Hotspotを知らないうちに使ってた">Instant Hotspotを知らないうちに使ってた</h3> <p>私の<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/wifi">wifi</a>しか使えないので外で使う時は毎回<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPhone">iPhone</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C6%A5%B6%A5%EA%A5%F3%A5%B0">テザリング</a>で通信してたんだけどあることに気付いた。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPhone">iPhone</a>のインターネット共有をoffにしていても<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a>から<a class="keyword" href="http://d.hatena.ne.jp/keyword/wifi">wifi</a>を見つけて接続できる・・・<br /> なぜなんだって思って調べたらiOS8から使える「Instant Hotspot」っていう機能だった。<br /> 両端末でアップルアカウントにログインしていて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>がonになっていれば、<a class="keyword" href="http://d.hatena.ne.jp/keyword/wifi">wifi</a>で繋ごうとした時に自動でインターネット共有をonにしてくれる。<br /> 最近、<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a>を再び使い出したので当たり前だと思って享受してたけど、よく考えたらめっちゃ便利な機能やな。</p> </div> tdualdir 日記20180504 hatenablog://entry/17391345971641530814 2018-05-05T01:09:44+09:00 2018-05-05T01:15:53+09:00 日記じゃ Character level CNNでアーキテクチャを変える 参考 アーキテクチャ図(tensorboardのグラフ) VocabularyProcessor 方針 回線のスピードチェックアプリを入れて見た。 speedcheck 結果 microbit 2、3時間のお昼寝 ヨドバシの前でGUのセールをやってたのでTシャツを3枚買った。 Trelloのipadアプリでチケットにチケットを添付できない。 今日の思い付き pycon miniのスライド全然できてないじゃん・・・ Character level CNNでアーキテクチャを変える 原論文([1509.01626] Chara… <p>日記じゃ</p> <ul class="table-of-contents"> <li><a href="#Character-level-CNNでアーキテクチャを変える">Character level CNNでアーキテクチャを変える</a><ul> <li><a href="#参考">参考</a></li> <li><a href="#アーキテクチャ図tensorboardのグラフ">アーキテクチャ図(tensorboardのグラフ)</a></li> <li><a href="#VocabularyProcessor">VocabularyProcessor</a></li> <li><a href="#方針">方針</a></li> </ul> </li> <li><a href="#回線のスピードチェックアプリを入れて見た">回線のスピードチェックアプリを入れて見た。</a><ul> <li><a href="#speedcheck">speedcheck</a></li> <li><a href="#結果">結果</a></li> </ul> </li> <li><a href="#microbit">microbit</a></li> <li><a href="#23時間のお昼寝">2、3時間のお昼寝</a></li> <li><a href="#ヨドバシの前でGUのセールをやってたのでTシャツを3枚買った">ヨドバシの前でGUのセールをやってたのでTシャツを3枚買った。</a></li> <li><a href="#Trelloのipadアプリでチケットにチケットを添付できない">Trelloのipadアプリでチケットにチケットを添付できない。</a></li> <li><a href="#今日の思い付き">今日の思い付き</a></li> <li><a href="#pycon-miniのスライド全然できてないじゃん">pycon miniのスライド全然できてないじゃん・・・</a></li> </ul> <div class="section"> <h3 id="Character-level-CNNでアーキテクチャを変える">Character level CNNで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>を変える</h3> <p>原論文(<a href="https://arxiv.org/abs/1509.01626">[1509.01626] Character-level Convolutional Networks for Text Classification</a>)の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>ではどうも上手く学習できないので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>を全然違うものに変えた。<br /> 低次元空間に埋め込みした後に複数の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>サイズを通して、最後に結合して特徴を出力するやつ。<br /> <br /> </p> <div class="section"> <h4 id="参考">参考</h4> <p><a href="https://arxiv.org/abs/1702.08568">[1702.08568] eXpose: A Character-Level Convolutional Neural Network with Embeddings For Detecting Malicious URLs, File Paths and Registry Keys</a><br /> <a href="https://arxiv.org/abs/1408.5882v2">[1408.5882v2] Convolutional Neural Networks for Sentence Classification</a><br /> <a href="https://qiita.com/bokeneko/items/c0f0ce60a998304400c8">character-level CNN&#x3067;&#x30AF;&#x30EA;&#x30B9;&#x30DE;&#x30B9;&#x3092;&#x751F;&#x304D;&#x629C;&#x304F; - Qiita</a><br /> <a href="http://catindog.hatenablog.com/entry/2016/08/22/102406">CNN&#x3092;&#x5229;&#x7528;&#x3057;&#x305F;&#x30BB;&#x30F3;&#x30C1;&#x30E1;&#x30F3;&#x30C8;&#x5206;&#x6790; - &#x306B;&#x307B;&#x3093;&#x3054;&#x306E;&#x308C;&#x3093;&#x3057;&#x3085;&#x3046;</a></p><p></p> </div> <div class="section"> <h4 id="アーキテクチャ図tensorboardのグラフ"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>図(tensorboardのグラフ)</h4> <p>tensorflowで実装したのでtensorboardのグラフで表示しとくと</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>図としては原論文<br /> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180505/20180505000102.png" alt="f:id:tdualdir:20180505000102p:plain" title="f:id:tdualdir:20180505000102p:plain" class="hatena-fotolife" itemprop="image"></span><br /> を以下の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>に変更じゃ<br /> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180505/20180505000156.png" alt="f:id:tdualdir:20180505000156p:plain" title="f:id:tdualdir:20180505000156p:plain" class="hatena-fotolife" itemprop="image"></span></p><p></p> </div> <div class="section"> <h4 id="VocabularyProcessor">VocabularyProcessor</h4> <p>文字を数値化するのはtensorflow.contrib.learnのpreprocessing.VocabularyProcessorを使ったので日本語も問題なくできる。<br /> 注意点としてはこれは元々は単語の処理をする為のものなので最大長を4とかに設定すると</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> tensorflow.contrib.learn <span class="synPreProc">import</span> preprocessing vocab_processor = preprocessing.VocabularyProcessor(<span class="synConstant">4</span>) docs = [<span class="synConstant">&quot;a aa aaa aaaa&quot;</span>, <span class="synConstant">&quot;aaa a&quot;</span>] <span class="synIdentifier">print</span>(<span class="synIdentifier">list</span>(vocab_processor.fit_transform(docs))) </pre><p>出力</p> <pre class="code" data-lang="" data-unlink>[array([1, 2, 3, 4]), array([3, 1, 0, 0])]</pre><p>なので単語の間にスペースを入れて文字を整数に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%C3%A5%D4%A5%F3%A5%B0">マッピング</a>するようにした。<br /> <script src="https://gist.github.com/Tdual/39f38d62d67422826a061abd8104b046.js"> </script><cite class="hatena-citation"><a href="https://gist.github.com/Tdual/39f38d62d67422826a061abd8104b046">gist.github.com</a></cite><br /> あとcontrib.learn.preprocessingは古いのでtf.dataを使えと言う警告が出るがtf.dataの使い方がわからない。<br /> と言うかドキュメント読んでも同じことが出来るようには思えない・・・ うーむ・・・<br /> <br /> </p> </div> <div class="section"> <h4 id="方針">方針</h4> <p>学習も上手くいってるのでこの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>で色々実験する。<br /> <br /> <br /> </p> </div> </div> <div class="section"> <h3 id="回線のスピードチェックアプリを入れて見た">回線のスピードチェックアプリを入れて見た。</h3> <p>なんか回線が遅い気がしたのでせっかくなのでアプリを入れて確認して見た。</p> <div class="section"> <h4 id="speedcheck">speedcheck</h4> <p>これ<div class="itunes-embed freezed itunes-kind-software"><a href="https://itunes.apple.com/jp/app/speedcheck-internet-speed-test/id616145031?mt=8&uo=4&at=10l8JW&ct=hatenablog" rel="nofollow" target="_blank"><img src="https://cdn.image.st-hatena.com/image/scale/4b5bb0287ee209cce2164a0ab883036e1e3b366b/enlarge=0;height=200;version=1;width=200/https%3A%2F%2Fis3-ssl.mzstatic.com%2Fimage%2Fthumb%2FPurple128%2Fv4%2F08%2F8c%2F0c%2F088c0cdb-573e-5d53-ab86-4d7a13b0c6e2%2Fsource%2F100x100bb.jpg" alt="Speedcheck Internet Speed Test" title="Speedcheck Internet Speed Test" class="itunes-embed-image"/></a><div class="itunes-embed-info"><p class="itunes-embed-title"><a href="https://itunes.apple.com/jp/app/speedcheck-internet-speed-test/id616145031?mt=8&uo=4&at=10l8JW&ct=hatenablog" rel="nofollow" target="_blank">Speedcheck Internet Speed Test</a></p><ul><li class="itunes-embed-artist">Frederik Lipfert</li><li class="itunes-embed-genre">ユーティリティ</li><li class="itunes-embed-price">無料</li><li class="itunes-embed-badge"><a href="https://itunes.apple.com/jp/app/speedcheck-internet-speed-test/id616145031?mt=8&uo=4&at=10l8JW&ct=hatenablog" rel="nofollow" target="_blank"><img src="https://cdn.blog.st-hatena.com/images/theme/itunes/itunes-badge-appstore@2x.png" width="60px" height="15px" /></a></li></ul></div></div></p><p>チェックした上下の速度だけでなく<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSID">SSID</a>や場所も履歴として残るので良い。<br /> 色んな場所のFree <a class="keyword" href="http://d.hatena.ne.jp/keyword/wifi">wifi</a>の速度をチェックしたくなる。<br /> 結果を<a class="keyword" href="http://d.hatena.ne.jp/keyword/ipad">ipad</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/iphone">iphone</a>で同期できるらしいのでアカウントも作った。<br /> ただ広告がウザすぎるので360円くらい払って広告出さないようにした。<br /> また、<a class="keyword" href="http://d.hatena.ne.jp/keyword/ipad">ipad</a>の方のアプリで支払ったのに<a class="keyword" href="http://d.hatena.ne.jp/keyword/iphone">iphone</a>の方でログインしたのにまだ広告出てるのはなんかちょっと微妙やな。<br /> 同じアカウントなら一つ買ったら別の端末でも広告出さないようにしてよ。<a class="keyword" href="http://d.hatena.ne.jp/keyword/iphone">iphone</a>の方は広告出したままにした。。。<br /> <br /> </p> </div> <div class="section"> <h4 id="結果">結果</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/wifi">wifi</a>で二種類繋げられるんだけど、チェックしたらなぜか知らないけど遅い方に接続してることが発覚した。<br /> だから遅く感じたのか・・・<br /> 速い方に変えた。</p><p>速度</p> <ul> <li>遅い方</li> </ul><p>くだり 21.36Mbps<br /> のぼり 5.63Mbps<br /> <br /> </p> <ul> <li>早い方</li> </ul><p>くだり 59.24Mbps <br /> のぼり 4.69Mbps</p><p>どっちも普通に速いやんけ。ってかのぼりは同じあまり変わらないのね。<br /> <br /> <br /> <br /> </p> </div> </div> <div class="section"> <h3 id="microbit">microbit</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/twitter">twitter</a>で見かけたのでちょっと調べた。</p><p><a href="http://microbit.org/ja/guide/">http://microbit.org/ja/guide/</a><br /> 教育用の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>。<a class="keyword" href="http://d.hatena.ne.jp/keyword/BBC">BBC</a>が作っていてイギリスの小学生とかが使ってるらしい。<br /> マイクロusbでパソコンに繋いでプログラミングできるみたいだ。<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>でもコーディング可。<br /> ジャイロ、温度センサー、無線通信、<a class="keyword" href="http://d.hatena.ne.jp/keyword/bluetooth">bluetooth</a>と機能は一通り揃ってるみたいだ。<br /> <br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="23時間のお昼寝">2、3時間のお昼寝</h3> <p>例のごとくMONSTER ENERGYを昨日二本飲んだので夜は3時間くらいしか眠れなかったので2、3時間お昼寝した。<br /> 昼寝すると午後からの作業が捗るな。<br /> <br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="ヨドバシの前でGUのセールをやってたのでTシャツを3枚買った">ヨドバシの前でGUのセールをやってたのでTシャツを3枚買った。</h3> <p>3枚で3000円ちょっとだった。<br /> なんてないTシャツなので写真は割愛<br /> <br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="Trelloのipadアプリでチケットにチケットを添付できない">Trelloの<a class="keyword" href="http://d.hatena.ne.jp/keyword/ipad">ipad</a>アプリでチケットにチケットを添付できない。</h3> <p>Trelloの<a class="keyword" href="http://d.hatena.ne.jp/keyword/ipad">ipad</a>アプリでチケットにチケットを添付しようと思ったらなんか選択肢に出て来なかった。<a class="keyword" href="http://d.hatena.ne.jp/keyword/mac">mac</a>アプリではできるのに・・・<br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="今日の思い付き">今日の思い付き</h3> <p><blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">あ、プラグラミング言語の特定とかなら出来そうか。</p>&mdash; tdual@情報幾何 (@tdualdir) <a href="https://twitter.com/tdualdir/status/992391095731408897?ref_src=twsrc%5Etfw">2018年5月4日</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script><br /> ブログのネタとしてはいいかもしれないけどあまり実用的ではないかも・・・<br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="pycon-miniのスライド全然できてないじゃん">pycon miniのスライド全然できてないじゃん・・・</h3> <p>やばい・・・</p> </div> tdualdir 日記20180503 hatenablog://entry/17391345971641098203 2018-05-04T02:35:05+09:00 2018-05-04T04:00:42+09:00 日記じゃ 今日はずっとcharacter level CNNの実装してた。 久しぶりにAWSのGPUインスタンスを起動した。 『前処理大全』の3-3を読んだ。 平均値 SQLの関数 python ChromeのdevToolを開くショートカット 歌詞取得スクリプト コンソールに求人を埋め込むAbemaTV 今日はずっとcharacter level CNNの実装してた。 完全に論文通りなのになんか上手く学習されないのでどこかバグがあるんだろうか。 tensorboardでsparsityを確認したらいきなりほぼ1になっていたのでなんかおかしい・・・ 久しぶりにAWSのGPUインスタンスを起動し… <p>日記じゃ<br /> <br /> <br /> </p> <ul class="table-of-contents"> <li><a href="#今日はずっとcharacter-level-CNNの実装してた">今日はずっとcharacter level CNNの実装してた。</a></li> <li><a href="#久しぶりにAWSのGPUインスタンスを起動した">久しぶりにAWSのGPUインスタンスを起動した。</a></li> <li><a href="#前処理大全の3-3を読んだ">『前処理大全』の3-3を読んだ。</a><ul> <li><a href="#平均値">平均値</a></li> <li><a href="#SQLの関数">SQLの関数</a></li> <li><a href="#python">python</a></li> </ul> </li> <li><a href="#ChromeのdevToolを開くショートカット">ChromeのdevToolを開くショートカット</a></li> <li><a href="#歌詞取得スクリプト">歌詞取得スクリプト</a></li> <li><a href="#コンソールに求人を埋め込むAbemaTV">コンソールに求人を埋め込むAbemaTV</a></li> </ul> <div class="section"> <h3 id="今日はずっとcharacter-level-CNNの実装してた">今日はずっとcharacter level CNNの実装してた。</h3> <p>完全に論文通りなのになんか上手く学習されないのでどこかバグがあるんだろうか。<br /> tensorboardでsparsityを確認したらいきなりほぼ1になっていたのでなんかおかしい・・・<br /> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180504/20180504023309.png" alt="f:id:tdualdir:20180504023309p:plain" title="f:id:tdualdir:20180504023309p:plain" class="hatena-fotolife" itemprop="image"></span></p><br /> <p></p> </div> <div class="section"> <h3 id="久しぶりにAWSのGPUインスタンスを起動した">久しぶりに<a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/GPU">GPU</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>を起動した。</h3> <p>Char level CNNの学習を待って居られないので時間をお金で買うことにした。<br /> だが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Amazon">Amazon</a> reviewのデー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%BB%A5%C3%A5%C8">タセット</a>を送ったらすぐにディスクが一杯になった。<br /> 前に<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>の学習のための画像デー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%BB%A5%C3%A5%C8">タセット</a>を保存していて、それが圧迫してたので消した。<br /> <br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="前処理大全の3-3を読んだ">『前処理大全』の3-3を読んだ。</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B6%CB%C3%CD">極値</a>、代表値の算出の話。<br /> <br /> </p> <div class="section"> <h4 id="平均値">平均値</h4> <p>「平均値」の他の代表値とは違う利点として計算計算コストが低いから良いって言うのは、言われてみそうだがあまり意識したことなかった。<br /> <br /> </p> </div> <div class="section"> <h4 id="SQLの関数"><a class="keyword" href="http://d.hatena.ne.jp/keyword/SQL">SQL</a>の関数</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/SQL">SQL</a>のMEDIAN関数やPERCENTILE_CONT関数を使ったことないな・・・<br /> まあ、<a class="keyword" href="http://d.hatena.ne.jp/keyword/SQL">SQL</a>でそもそもデータ分析をしたことない。手元に持ってきて<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>でやってる。そこまで巨大なデータを扱わないからか?<br /> <br /> </p> </div> <div class="section"> <h4 id="python"><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a></h4> <p>agg関数はlambdaが使えるのか。<br /> あとは、パーセンタイルの計算としてnumpy.percentileがある。<br /> <script src="https://gist.github.com/Tdual/4ccba2f4a1f1ea37c5fca239627f7c15.js"> </script><cite class="hatena-citation"><a href="https://gist.github.com/Tdual/4ccba2f4a1f1ea37c5fca239627f7c15">gist.github.com</a></cite></p><br /> <p>バージョン1.15からnumpy.quantileも使える。(今は1.14)<br /> percentileは引数が1~100の整数だが、quantileは0~1の少数で指定できるようだ。<br /> <a href="http://www.numpy.org/devdocs/reference/generated/numpy.quantile.html">numpy.quantile &mdash; NumPy v1.15.dev0 Manual</a></p><br /> <br /> <p></p> </div> </div> <div class="section"> <h3 id="ChromeのdevToolを開くショートカット"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Chrome">Chrome</a>のdevToolを開くショートカット</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/macOS">macOS</a>ではcommand+option+I<br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="歌詞取得スクリプト">歌詞取得<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a></h3> <p>「歌詞タイム」ってサイトで歌詞をちょっとコピーしようとしたら出来なかったので取得<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を作った。<br /> DevToolを開いても取得できたけど<br>タグなどが挟まっていたので「もう<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>作るか・・・」ってなった。<br /> 最初、HTML要素を見て歌詞が見当たらなかったので歌詞は別<a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>で取得してるのかと思ったけどただ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%B3%A1%BC%A5%C9">エンコード</a>して<a class="keyword" href="http://d.hatena.ne.jp/keyword/javascript">javascript</a>で持ってるだけだった。<br /> なのでHTMLをテキストで取得してデコードした後に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>で対象箇所を抽出するだけで歌詞を取得できた。(<br /> HTTP HEADERなどを駆使してもっとマシな作りに出来ないか・・・)<br /> なんかの法律に抵触すると面倒臭いので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>は公開しないようにします。<br /> <br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="コンソールに求人を埋め込むAbemaTV">コンソールに求人を埋め込むAbemaTV</h3> <p><blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">AbemaTVのページでコンソールを開くと求人が出てくるの、割と面白くないですか? <a href="https://t.co/BjLqlUnILm">pic.twitter.com/BjLqlUnILm</a></p>&mdash; keymoon (@kymn_) <a href="https://twitter.com/kymn_/status/991919804691836928?ref_src=twsrc%5Etfw">2018年5月3日</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p><p>ワロタwwww</p><p>ちなみに要素はアイコンが。<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">要素はもっとワロタ <a href="https://t.co/JcvNIH9OPJ">pic.twitter.com/JcvNIH9OPJ</a></p>&mdash; tdual@情報幾何 (@tdualdir) <a href="https://twitter.com/tdualdir/status/991925296386359301?ref_src=twsrc%5Etfw">2018年5月3日</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p> </div> tdualdir 日記20180502 hatenablog://entry/17391345971640805959 2018-05-02T23:29:06+09:00 2018-05-02T23:30:52+09:00 まとめ 昨日眠れなかったので一日中頭があまり働かない感じだった。 『Pythonで学ぶ新しい統計学の教科書』1部6章まで読んだ。 『前処理大全』3章「集約」の3−1まで読んだ。 はてなにJupyter notebookを貼る方法 アイロン買った。 畳み込み層の処理は相互相関と言う記事をポストした。 RAKERUに行った 明日の予定 pycon miniのスライドをいい加減完成させたい。 昨日眠れなかったので一日中頭があまり働かない感じだった。 昨日飲んだMONSTER ENERGYのせいだと思う。ああ言うのを飲むとよく眠れなくなる。(が集中力はやはり上がるのでつい飲んでしまう。) 『Pytho… <p>まとめ</p> <ul class="table-of-contents"> <li><a href="#昨日眠れなかったので一日中頭があまり働かない感じだった">昨日眠れなかったので一日中頭があまり働かない感じだった。</a></li> <li><a href="#Pythonで学ぶ新しい統計学の教科書1部6章まで読んだ">『Pythonで学ぶ新しい統計学の教科書』1部6章まで読んだ。</a></li> <li><a href="#前処理大全3章集約の31まで読んだ">『前処理大全』3章「集約」の3−1まで読んだ。</a></li> <li><a href="#はてなにJupyter-notebookを貼る方法">はてなにJupyter notebookを貼る方法</a></li> <li><a href="#アイロン買った">アイロン買った。</a></li> <li><a href="#畳み込み層の処理は相互相関と言う記事をポストした">畳み込み層の処理は相互相関と言う記事をポストした。</a></li> <li><a href="#RAKERUに行った">RAKERUに行った</a></li> <li><a href="#明日の予定">明日の予定</a><ul> <li><a href="#pycon-miniのスライドをいい加減完成させたい">pycon miniのスライドをいい加減完成させたい。</a></li> </ul> </li> </ul> <div class="section"> <h3 id="昨日眠れなかったので一日中頭があまり働かない感じだった">昨日眠れなかったので一日中頭があまり働かない感じだった。</h3> <p>昨日飲んだMONSTER ENERGYのせいだと思う。ああ言うのを飲むとよく眠れなくなる。(が集中力はやはり上がるのでつい飲んでしまう。) <br /> <br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="Pythonで学ぶ新しい統計学の教科書1部6章まで読んだ">『<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>で学ぶ新しい<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%FD%B7%D7%B3%D8">統計学</a>の教科書』1部6章まで読んだ。</h3> <p>まだ、<br /> - 母集団分布の推定 = 分布の決定(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%CA%AC%C9%DB">正規分布</a>や二項分布など) + パラメータの推定<br /> - 標本の統計量=母集団分布のパラメータの推定値<br /> みたいな<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%FD%B7%D7%B3%D8">統計学</a>の基礎の話</p><p>「母数」は分布のパラメータのことでサンプルサイズじゃないってことを強調して書いてた。<br /> 個人的にはもう「母数」って言葉も使うのやめてパラメータで良いんじゃないかと思う。<br /> <br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="前処理大全3章集約の31まで読んだ">『前処理大全』3章「集約」の3−1まで読んだ。</h3> <p>groupbyした後に<br /> aggで集計処理をまとめてできる。<br /> <script src="https://gist.github.com/Tdual/55e7efc217424c16b09e03ccc2728538.js"> </script><cite class="hatena-citation"><a href="https://gist.github.com/Tdual/55e7efc217424c16b09e03ccc2728538">gist.github.com</a></cite></p><br /> <p>"May the agg be with groupby(aggがgroupbyとともにあらんことを)"<br /> <br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="はてなにJupyter-notebookを貼る方法"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA">はてな</a>にJupyter notebookを貼る方法</h3> <p>gistにipynbファイルを<a class="keyword" href="http://d.hatena.ne.jp/keyword/D%26D">D&D</a>で追加して、そのリンクを貼るだけだった。<br /> 気をつけるのはtextareaに入れるとちゃんと貼れないのでこの状態の時に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Drop">Drop</a>する。<br /> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180502/20180502172337.png" alt="f:id:tdualdir:20180502172337p:plain" title="f:id:tdualdir:20180502172337p:plain" class="hatena-fotolife" itemprop="image"></span></p><br /> <p></p> </div> <div class="section"> <h3 id="アイロン買った">アイロン買った。</h3> <p>最近買ったシャツのシワが目立つので、人生初のアイロンを買った。<br /> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180502/20180502232016.jpg" alt="f:id:tdualdir:20180502232016j:plain" title="f:id:tdualdir:20180502232016j:plain" class="hatena-fotolife" itemprop="image"></span><br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/t-fal">t-fal</a>の変な形のスチームアイロン。アイロン台を買いたくなかったのでハンガーとかに掛けたままシワが伸ばせるやつにした。<br /> まだ使ってない。<br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="畳み込み層の処理は相互相関と言う記事をポストした">畳み込み層の処理は相互相関と言う記事をポストした。</h3> <p><iframe src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Ftdual.hatenablog.com%2Fentry%2F2018%2F05%2F02%2F113110" title="深層学習の畳み込み層の処理は「畳み込み」じゃなかった件 - tdualのブログ" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="http://tdual.hatenablog.com/entry/2018/05/02/113110">tdual.hatenablog.com</a></cite><br /> 割と反響があったみたい。<br /> Toeplitz matrixの解説やnp.correlationでcnnを実装する話もいつか書きたい。<br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="RAKERUに行った">RAKERUに行った</h3> <p>オムライス専門のチェーン店。初めて行った。吉祥寺の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E8%A5%C9%A5%D0%A5%B7%A5%AB%A5%E1%A5%E9">ヨドバシカメラ</a>横のガストの下。<br /> オムライスだけでなくパンも美味かった。後、店内がカラフルで子供受けしそうな内装だった。<br /> <br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="明日の予定">明日の予定</h3> <div class="section"> <h4 id="pycon-miniのスライドをいい加減完成させたい">pycon miniのスライドをいい加減完成させたい。</h4> </div> </div> tdualdir 深層学習の畳み込み層の処理は「畳み込み」じゃなかった件 hatenablog://entry/17391345971640581558 2018-05-02T11:31:10+09:00 2018-05-02T16:43:02+09:00 畳み込み層の処理は厳密には畳み込みではなかったのか・・・ 畳み込み層 畳み込み層の処理 数学で言うところの畳み込み 畳み込みの定義 畳み込み層の処理と比較 相互相関 相互相関と畳み込みの相違点 交換律 フーリエ変換 相互相関の意味 畳み込み層に「畳み込み」を適応するとどうなるのか? 終わりに 畳み込み層 畳み込み層の処理 畳み込み層ではインプットの画像データに対して重みを掛けてアウトプットします。この重みをカーネルと呼びます。 実際の計算は図1のようになっています。図1. 畳み込み層の処理インプットデータの一部にカーネルを適応してその適応された部分で行列の内積を取っています。式でかくと次のよう… <p>畳み込み層の処理は厳密には畳み込みではなかったのか・・・<br /> <br /> </p> <ul class="table-of-contents"> <li><a href="#畳み込み層">畳み込み層</a><ul> <li><a href="#畳み込み層の処理">畳み込み層の処理</a></li> </ul> </li> <li><a href="#数学で言うところの畳み込み">数学で言うところの畳み込み</a><ul> <li><a href="#畳み込みの定義">畳み込みの定義</a></li> <li><a href="#畳み込み層の処理と比較">畳み込み層の処理と比較</a></li> </ul> </li> <li><a href="#相互相関">相互相関</a><ul> <li><a href="#相互相関と畳み込みの相違点">相互相関と畳み込みの相違点</a><ul> <li><a href="#交換律">交換律</a></li> <li><a href="#フーリエ変換">フーリエ変換</a></li> <li><a href="#相互相関の意味">相互相関の意味</a></li> </ul> </li> </ul> </li> <li><a href="#畳み込み層に畳み込みを適応するとどうなるのか">畳み込み層に「畳み込み」を適応するとどうなるのか?</a></li> <li><a href="#終わりに">終わりに</a></li> </ul> <div class="section"> <h3 id="畳み込み層">畳み込み層</h3> <div class="section"> <h4 id="畳み込み層の処理">畳み込み層の処理</h4> <p>畳み込み層ではインプットの画像データに対して重みを掛けてアウトプットします。この重みを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>と呼びます。<br /> 実際の計算は図1のようになっています。<figure class="figure-image figure-image-fotolife" title="図1. 畳み込み層の処理"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180501/20180501211957.png" alt="f:id:tdualdir:20180501211957p:plain" title="f:id:tdualdir:20180501211957p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図1. 畳み込み層の処理</figcaption></figure>インプットデータの一部に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>を適応してその適応された部分で行列の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%E2%C0%D1">内積</a>を取っています。式でかくと次のようになります。<br /> アウトプットされた行列のi,j成分を<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20O_%7Bi%2Cj%7D" alt=" O_{i,j}"/>,<br /> インプットされた行列のi,j成分を<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20I_%7Bi%2Cj%7D" alt=" I_{i,j}"/>,<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>のi,j成分を<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20K_%7Bi%2Cj%7D" alt=" K_{i,j}"/>とすると<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%7B%20%5Cdisplaystyle%20O_%7Bi%2Cj%7D%3D%20%5Csum_m%5Csum_n%20I_%7Bi%2Bm%2C%20j%2Bn%7DK_%7Bm%2Cn%7D%20%5Ctag%7B1%7D%20%7D" alt=" { \displaystyle O_{i,j}= \sum_m\sum_n I_{i+m, j+n}K_{m,n} \tag{1} }"/></p><br /> <p></p> </div> </div> <div class="section"> <h3 id="数学で言うところの畳み込み">数学で言うところの畳み込み</h3> <div class="section"> <h4 id="畳み込みの定義">畳み込みの定義</h4> <p>2次元の畳み込みは次のように定義されています。<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%7B%20%5Cdisplaystyle%20%28f%2Ag%29%28a%2Cb%29%3D%20%5Cint%5Cint%20g%28a-x%2Cb-y%29f%28x%2Cy%29dxdy%20%5Ctag%7B2%7D%20%7D" alt=" { \displaystyle (f*g)(a,b)= \int\int g(a-x,b-y)f(x,y)dxdy \tag{2} }"/><br /> 離散値の場合は行列で表現できて<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%7B%20%5Cdisplaystyle%20%28f%2Ag%29_%7Bi%2Cj%7D%20%3D%20%5Csum_m%5Csum_n%20g_%7Bi-m%2C%20j-n%7Df_%7Bm%2Cn%7D%20%5Ctag%7B3%7D%20%7D" alt=" { \displaystyle (f*g)_{i,j} = \sum_m\sum_n g_{i-m, j-n}f_{m,n} \tag{3} }"/><br /> となります。</p> </div> <div class="section"> <h4 id="畳み込み層の処理と比較">畳み込み層の処理と比較</h4> <p>(1)と(3)は非常に似てますが、(1)では<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%7Bi%2Bm%2C%20j%2Bn%7D" alt=" {i+m, j+n}"/>、(3)では<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%7Bi-m%2C%20j-n%7D" alt=" {i-m, j-n}"/>となっていて、添え字が違うことに気付きます。<br /> 実は(1)の処理は<b>相互相関(cross-correlation)</b>と呼ばれていて畳み込みとは別物です。</p> </div> </div> <div class="section"> <h3 id="相互相関">相互相関</h3> <div class="section"> <h4 id="相互相関と畳み込みの相違点">相互相関と畳み込みの相違点</h4> <p>まずは相互相関と畳み込みの違いを見ます。<br /> 以後、簡単のために1次元実数値連続関数を扱います。<br /> 1次元実数値連続関数の畳み込み<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%7B%20%5Cdisplaystyle%20%28f%2Ag%29%28a%29%20%3D%20%5Cint_%7B-%5Cinfty%7D%5E%7B%5Cinfty%7D%20g%28a-x%29f%28x%29dx%20%5Ctag%7B4%7D%20%7D" alt=" { \displaystyle (f*g)(a) = \int_{-\infty}^{\infty} g(a-x)f(x)dx \tag{4} }"/></p><p>1次元実数値連続関数の相互相関<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%7B%20%5Cdisplaystyle%20%28f%20%5Cstar%20g%29%28a%29%20%3D%20%5Cint_%7B-%5Cinfty%7D%5E%7B%5Cinfty%7D%20g%28a%2Bx%29f%28x%29dx%20%5Ctag%7B5%7D%20%7D" alt=" { \displaystyle (f \star g)(a) = \int_{-\infty}^{\infty} g(a+x)f(x)dx \tag{5} }"/><br /> ((5)の関数が実数値でない場合は<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20f%28x%29" alt=" f(x)"/>の代わりに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%C1%C7%B6%A6%CC%F2">複素共役</a><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20f%5E%7B%2A%7D%28x%29" alt=" f^{*}(x)"/>を取る必要がある。)</p> <div class="section"> <h5 id="交換律">交換律</h5> <p>畳み込みの重要な性質の一つとして交換律があります。<br /> ここで<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x%27%20%3D%20a-x" alt=" x&#39; = a-x"/>とすると<br /> \begin{align}<br /> (f*g)(a) &= \int_{-\infty}^{\infty} g(a-x)f(x)dx\\<br /> &= \int_{\infty}^{-\infty} g(x')f(a-x')d(a-x')\\<br /> &= \int_{\infty}^{-\infty} g(x')f(a-x')d(-x')\\<br /> &=\int_{-\infty}^{\infty} f(a-x')g(x')dx' = (g*f)(a)<br /> \end{align}<br /> つまり、<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20f%2Ag%20%3D%20g%2Af%20" alt=" f*g = g*f "/> と言う交換律が成り立つことがわかります。</p><p>しかし、(5)の相互相関の形では交換律は満たしません。<br /> <br /> </p> </div> <div class="section"> <h5 id="フーリエ変換"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A1%BC%A5%EA%A5%A8%CA%D1%B4%B9">フーリエ変換</a></h5> <p>畳み込みの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A1%BC%A5%EA%A5%A8%CA%D1%B4%B9">フーリエ変換</a>がそれぞれの関数の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A1%BC%A5%EA%A5%A8%CA%D1%B4%B9">フーリエ変換</a>の積になってるは有名な定理で、工学などでもよく応用されます。<br /> \begin{align}<br /> F[f*g] &= \int_{-\infty}^{\infty}\left(\int_{-\infty}^{\infty} g(a-x)f(x)dx\right)e^{-ika}da\\<br /> &= \int_{-\infty}^{\infty}\int_{-\infty}^{\infty} g(a')f(x)e^{-ik(a'+x)}dxda'\\<br /> &=\int_{-\infty}^{\infty}f(x)e^{-ikx}dx \int_{-\infty}^{\infty}f(a')e^{-ika'}da' \\<br /> &= F[f] F[g]<br /> \end{align}<br /> 式変形の二行目では<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20a%20-%20x%3D%20a%27" alt=" a - x= a&#39;"/>とした。<br /> これを相互相関でやると<br /> \begin{align}<br /> F[f\star g] &= \int_{-\infty}^{\infty}\left(\int_{-\infty}^{\infty} g(a+x)f(x)dx\right)e^{-ika}da\\<br /> &= \int_{-\infty}^{\infty}\int_{-\infty}^{\infty} g(a')f(x)e^{-ik(a'-x)}dxda'\\<br /> &=\int_{-\infty}^{\infty}f(x)e^{+ikx}dx \int_{-\infty}^{\infty}f(a')e^{-ika'}da' \\<br /> &= F^{*}[f] F[g]<br /> \end{align}<br /> ここでは<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20a%20%2B%20x%3D%20a%27" alt=" a + x= a&#39;"/>とした。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A1%BC%A5%EA%A5%A8%CA%D1%B4%B9">フーリエ変換</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%C1%C7%B6%A6%CC%F2">複素共役</a>を取ったものと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A1%BC%A5%EA%A5%A8%CA%D1%B4%B9">フーリエ変換</a>に積になっています。(クロ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%B9%A5%DA">ススペ</a>クトルと言う。)</p><p>非常に似た形をしてますが性質の相違点はいくつかあるようです。</p> </div> <div class="section"> <h5 id="相互相関の意味">相互相関の意味</h5> <p>相互相関の意味ですが、座標aでの二つの関数の類似度を表しています。似てるほど相互相関は大きくなります。<br /> 例えば、ノイズに混ざった二つの信号があった場合に相互相関を使ってそれが同じ信号かどうか判断できます。<br /> (参考: <a href="https://qiita.com/inoory/items/3ea2d447f6f1e8c40ffa">https://qiita.com/inoory/items/3ea2d447f6f1e8c40ffa</a>)<br /> また、相互相関の性質を利用してフィルターなのども出来ます。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> numpy <span class="synStatement">as</span> np <span class="synPreProc">import</span> matplotlib.pyplot <span class="synStatement">as</span> plt sig = np.repeat([<span class="synConstant">0.</span>, <span class="synConstant">1.</span>, <span class="synConstant">1.</span>, <span class="synConstant">0.</span>, <span class="synConstant">1.</span>, <span class="synConstant">0.</span>, <span class="synConstant">0.</span>, <span class="synConstant">1.</span>], <span class="synConstant">128</span>) sig_noise = sig + np.random.randn(<span class="synIdentifier">len</span>(sig)) corr = np.correlate(sig_noise, np.ones(<span class="synConstant">128</span>), mode=<span class="synConstant">'same'</span>) / <span class="synConstant">128</span> clock = np.arange(<span class="synConstant">64</span>, <span class="synIdentifier">len</span>(sig), <span class="synConstant">128</span>) fig, (ax_orig, ax_noise, ax_corr) = plt.subplots(<span class="synConstant">3</span>, <span class="synConstant">1</span>, sharex=<span class="synIdentifier">True</span>) ax_orig.plot(sig) ax_orig.plot(clock, sig[clock], <span class="synConstant">'ro'</span>) ax_orig.set_title(<span class="synConstant">'Original signal'</span>) ax_noise.plot(sig_noise) ax_noise.set_title(<span class="synConstant">'Signal with noise'</span>) ax_corr.plot(corr) ax_corr.plot(clock, corr[clock], <span class="synConstant">'ro'</span>) ax_corr.axhline(<span class="synConstant">0.5</span>, ls=<span class="synConstant">':'</span>) ax_corr.set_title(<span class="synConstant">'Cross-correlated with rectangular pulse'</span>) ax_orig.margins(<span class="synConstant">0</span>, <span class="synConstant">0.1</span>) fig.tight_layout() fig.show() </pre><p>出力<figure class="figure-image figure-image-fotolife" title="図3.相互相関を使ったフィルター"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180502/20180502111957.png" alt="f:id:tdualdir:20180502111957p:plain" title="f:id:tdualdir:20180502111957p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図3.相互相関を使ったフィルター</figcaption></figure></p><br /> <br /> <br /> <br /> <br /> <p></p> </div> </div> </div> <div class="section"> <h3 id="畳み込み層に畳み込みを適応するとどうなるのか">畳み込み層に「畳み込み」を適応するとどうなるのか?</h3> <p>畳み込み層に「畳み込み」を適応するとどうなるのか?<br /> 結論から言うと何も問題ないです。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CB%A5%E5%A1%BC%A5%E9%A5%EB%A5%CD%A5%C3%A5%C8%A5%EF%A1%BC%A5%AF">ニューラルネットワーク</a>の層で相互相関と畳み込みの相違点は関係ありません。<br /> ただ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>の上下左右を反転して学習してるだけです。(この<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>をフリップ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>と言います。)<br /> 図2の様にインプットのラベルを−1から始めて<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>を反転すると畳み込みの式と一致してることがわ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%AB%A4%EB%A4%C8">かると</a>思います。<figure class="figure-image figure-image-fotolife" title="図2. 「畳み込み」を適応した畳み込み層の処理"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180501/20180501235156.png" alt="f:id:tdualdir:20180501235156p:plain" title="f:id:tdualdir:20180501235156p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図2. 「畳み込み」を適応した畳み込み層の処理</figcaption></figure></p><br /> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%7B%20%5Cdisplaystyle%20O_%7Bi%2Cj%7D%20%3D%20%28f%2Ag%29_%7Bi%2Cj%7D%20%3D%20%5Csum_m%5Csum_n%20I_%7Bi-m%2C%20j-n%7DK_%7Bm%2Cn%7D%20%5Ctag%7B6%7D%20%7D" alt=" { \displaystyle O_{i,j} = (f*g)_{i,j} = \sum_m\sum_n I_{i-m, j-n}K_{m,n} \tag{6} }"/></p><p></p> </div> <div class="section"> <h3 id="終わりに">終わりに</h3> <p>な ぜ Convolutional と 名 付 け た し。<br /> まあ、ただの名前だし、数学の用語が誤用されることはよくあることなのであまり気にしても仕方ないね。</p><p>notebookはここに置いときますね。<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2FTdual%2Fcross_correlation%2Fblob%2Fmaster%2Fcross-correlation.ipynb" title="Tdual/cross_correlation" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://github.com/Tdual/cross_correlation/blob/master/cross-correlation.ipynb">github.com</a></cite></p><br /> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C4%A5%A4%A5%C3%A5%BF%A1%BC">ツイッター</a>やっているのでフォローお願いします!<br /> ↓今すぐフォローすべきキラキラ アカウント<p><a class="twitter-follow-button" href="https://twitter.com/tdualdir?ref_src=twsrc^tfw" data-show-count="false">Follow @tdualdir</a></p></p><p>じゃあの。</p><p>参考文献<br /> <a target="_blank" href="https://www.amazon.co.jp/gp/product/4048930621/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4048930621&linkCode=as2&tag=tdual-22&linkId=f3e1725dd3b3c72a685b68859f68916c"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4048930621&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL160_&tag=tdual-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=tdual-22&l=am2&o=9&a=4048930621" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p> </div> tdualdir 日記20180501 hatenablog://entry/17391345971640387326 2018-05-02T02:27:03+09:00 2018-05-07T09:30:02+09:00 なんとなく日記書いてみるか。(いつまで続くかわからないけど) Finderのメニューバーにデスクトップを置いた 「PYTHONで学ぶあたらしい統計学の教科書」を買った 「PYTHONで学ぶあたらしい統計学の教科書」を1部4章まで読んだ 畳み込み層 Python2.7.15は最後(last)のバージョンじゃなく最新(latest)のバージョンらしいな・・・ Finderのメニューバーにデスクトップを置いた 基本的にMacBookのデスクトップにファイルを置かないんだけど、友達に少し貸してたらなんか色々ファイルを置かれていた。 デスクトップのファイルを確認するためにFinderからユーザーディレク… <p>なんとなく日記書いてみるか。(いつまで続くかわからないけど)<br /> <br /> </p> <ul class="table-of-contents"> <li><a href="#Finderのメニューバーにデスクトップを置いた">Finderのメニューバーにデスクトップを置いた</a></li> <li><a href="#PYTHONで学ぶあたらしい統計学の教科書を買った">「PYTHONで学ぶあたらしい統計学の教科書」を買った</a></li> <li><a href="#PYTHONで学ぶあたらしい統計学の教科書を1部4章まで読んだ">「PYTHONで学ぶあたらしい統計学の教科書」を1部4章まで読んだ</a></li> <li><a href="#畳み込み層">畳み込み層</a></li> <li><a href="#Python2715は最後lastのバージョンじゃなく最新latestのバージョンらしいな">Python2.7.15は最後(last)のバージョンじゃなく最新(latest)のバージョンらしいな・・・</a></li> </ul> <div class="section"> <h3 id="Finderのメニューバーにデスクトップを置いた">Finderのメニューバーにデスクトップを置いた</h3> <p>基本的に<a class="keyword" href="http://d.hatena.ne.jp/keyword/MacBook">MacBook</a>のデスクトップにファイルを置かないんだけど、友達に少し貸してたらなんか色々ファイルを置かれていた。<br /> デスクトップのファイルを確認するためにFinderからユーザー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リを開いてもデスクトップフォルダが見つからない・・・<br /> ターミナルに行ってlsコマンドで確認するとちゃんとある・・・なんで隠してるんだよ・・・<br /> 仕方ないのでopenコマンドで開いてファイル確認したけど、これから毎回それするの面倒臭いのでFinderのメニューにデスクトップを置くことにした。<br /> まずはFinderから隠してるフォルダを表示しなければと思い、隠してるフォルダの表示の仕方を調べた。<br /> ターミナルでやる方法が見つかった。</p> <pre class="code" data-lang="" data-unlink>defaults write com.apple.finder AppleShowAllFiles TRUE killAll Finder</pre><p>これで全てのファイルがFinderから確認できるようになった。デスクトップフォルダも表示されたのでドラッグ&ドロップでメニューに追加した。<br /> 全てのファイルが表示されたままではみづらいので</p> <pre class="code" data-lang="" data-unlink>defaults write com.apple.finder AppleShowAllFiles FALSE killAll Finder</pre><p>で元に戻した。<br /> ってか、なんでデフォルトでデスクトップフォルダ隠すんだよ・・・(それとも過去の自分が何かやったのか?<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B4%A1%BC%A5%EB%A5%C7%A5%F3%A5%A6%A5%A3%A1%BC%A5%AF">ゴールデンウィーク</a>が終わって出社したら会社の<a class="keyword" href="http://d.hatena.ne.jp/keyword/MacBook">MacBook</a>を確認してみるか。)<br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="PYTHONで学ぶあたらしい統計学の教科書を買った">「<a class="keyword" href="http://d.hatena.ne.jp/keyword/PYTHON">PYTHON</a>で学ぶあたらしい<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%FD%B7%D7%B3%D8">統計学</a>の教科書」を買った</h3> <p>「<a class="keyword" href="http://d.hatena.ne.jp/keyword/PYTHON">PYTHON</a>で学ぶあたらしい<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%FD%B7%D7%B3%D8">統計学</a>の教科書」の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Kindle">Kindle</a>版を買った。<br /> <a target="_blank" href="https://www.amazon.co.jp/gp/product/4798155063/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798155063&linkCode=as2&tag=tdual-22&linkId=cf94e747e5016ff9dde7239b9f6c7bc0"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4798155063&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL160_&tag=tdual-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=tdual-22&l=am2&o=9&a=4798155063" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p><p>会社のチャットで面白そうと言う発言があったのでちょっと興味を持っていた。<br /> 紙の本の方が先に出てて本屋で少し立ち読みして良さそうなので<a class="keyword" href="http://d.hatena.ne.jp/keyword/Kindle">Kindle</a>版が出たら買おうと思ってた。<br /> 「前処理大全」をまだ読み終わってないので並行で読んでいくか。<br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="PYTHONで学ぶあたらしい統計学の教科書を1部4章まで読んだ">「<a class="keyword" href="http://d.hatena.ne.jp/keyword/PYTHON">PYTHON</a>で学ぶあたらしい<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%FD%B7%D7%B3%D8">統計学</a>の教科書」を1部4章まで読んだ</h3> <p>この本は7部構成でその中の章も沢山あるので量にビビってたけど細かく切ってるだけみたいだ。1ページに3章が詰まってるとかもざらにある。<br /> 母集団と標本を池の魚を釣る例えてその後もその例えがちょいちょい出てくる。<br /> 1部は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%FD%B7%D7%B3%D8">統計学</a>の基礎で、ここまでは用語の説明だけだった。<br /> <br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="畳み込み層">畳み込み層</h3> <p>Pycon miniの資料を作ってる途中でCNNのことを調べてたら畳み込み層の処理は厳密には畳み込みでないと言うのをGoodfellowらの『深層学習』の中で見つけた。<br /> ひょっとしたら研究者なら当然知っているような内容かもしれないけど自分なりにまとめて別の記事として書く。<br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="Python2715は最後lastのバージョンじゃなく最新latestのバージョンらしいな">Python2.7.15は最後(last)のバージョンじゃなく最新(latest)のバージョンらしいな・・・</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a>で見た面白いポスト<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">I misread the original post -- it&#39;s the *latest*, not the *last*. Maybe I was *hoping* it&#39;s the last, but the intention of the team is not to stop supporting it now. Apologies!</p>&mdash; <a class="keyword" href="http://d.hatena.ne.jp/keyword/Guido%20van%20Rossum">Guido van Rossum</a> (@gvanrossum) <a href="https://twitter.com/gvanrossum/status/991325420141228032?ref_src=twsrc%5Etfw">2018年5月1日</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p><p>ワロタwwwww</p> </div> tdualdir MacBook Proにアプリインストール hatenablog://entry/17391345971640345416 2018-05-01T11:25:48+09:00 2018-05-01T11:25:48+09:00 日記残すか。 MacBook Proにアプリインストール 朝にこの記事を読んで「Alfred」と「CLCL lite」と「RecordIt」をインストールした。 www.danshihack.com Alfredは昔は使ったけどこのMacBook Proにしてからインストールしてなかったから再び入れてみた。 AlfredRunning with Crayons Ltd仕事効率化無料まあ、あまり使ってなかったので入れてなかったワケで、これからも使わないかもしれないけど定番アプリなのでとりあえずは入れてみた感じですね。 CLCL liteは結構いいな。 CLCL LiteGenjiユーティリティ無… <p>日記残すか。</p> <div class="section"> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/MacBook%20Pro">MacBook Pro</a>にアプリインストール</h3> <p>朝にこの記事を読んで「Alfred」と「CLCL lite」と「RecordIt」をインストールした。<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.danshihack.com%2F2018%2F04%2F30%2Fjunp%2Fmacapp-2018.html" title="Mac歴15年になった僕が愛用しているアプリ19個、使わなくなったアプリ3個" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.danshihack.com/2018/04/30/junp/macapp-2018.html">www.danshihack.com</a></cite><br /> </p> <div class="section"> <h4>Alfredは昔は使ったけどこの<a class="keyword" href="http://d.hatena.ne.jp/keyword/MacBook%20Pro">MacBook Pro</a>にしてからインストールしてなかったから再び入れてみた。</h4> <p><div class="itunes-embed freezed itunes-kind-mac-software"><a href="https://itunes.apple.com/jp/app/alfred/id405843582?mt=12&uo=4&at=10l8JW&ct=hatenablog" rel="nofollow" target="_blank"><img src="https://cdn.image.st-hatena.com/image/scale/9a4531f8ba653187e116ffe419cf04aa14cc3b69/enlarge=0;height=200;version=1;width=200/https%3A%2F%2Fis4-ssl.mzstatic.com%2Fimage%2Fthumb%2FPurple%2Fv4%2F50%2Fd4%2F97%2F50d49791-0fdc-7ab6-7d34-50f68d659547%2Fsource%2F100x100bb.png" alt="Alfred" title="Alfred" class="itunes-embed-image"/></a><div class="itunes-embed-info"><p class="itunes-embed-title"><a href="https://itunes.apple.com/jp/app/alfred/id405843582?mt=12&uo=4&at=10l8JW&ct=hatenablog" rel="nofollow" target="_blank">Alfred</a></p><ul><li class="itunes-embed-artist">Running with Crayons Ltd</li><li class="itunes-embed-genre">仕事効率化</li><li class="itunes-embed-price">無料</li><li class="itunes-embed-badge"><a href="https://itunes.apple.com/jp/app/alfred/id405843582?mt=12&uo=4&at=10l8JW&ct=hatenablog" rel="nofollow" target="_blank"><img src="https://cdn.blog.st-hatena.com/images/theme/itunes/itunes-badge-macappstore@2x.png" width="80px" height="15px" /></a></li></ul></div></div></p><p>まあ、あまり使ってなかったので入れてなかったワケで、これからも使わないかもしれないけど定番アプリなのでとりあえずは入れてみた感じですね。<br /> <br /> </p> </div> <div class="section"> <h4>CLCL liteは結構いいな。</h4> <p><div class="itunes-embed freezed itunes-kind-mac-software"><a href="https://itunes.apple.com/jp/app/clcl-lite/id495511246?mt=12&uo=4&at=10l8JW&ct=hatenablog" rel="nofollow" target="_blank"><img src="https://cdn.image.st-hatena.com/image/scale/5bd99f4a658b1c20e973f595fd44e23653ce7d20/enlarge=0;height=200;version=1;width=200/https%3A%2F%2Fis1-ssl.mzstatic.com%2Fimage%2Fthumb%2FPurple%2Fv4%2Fcf%2Fdf%2Fb3%2Fcfdfb3ff-6229-58b9-15bf-d37ac135f4d7%2Fsource%2F100x100bb.png" alt="CLCL Lite" title="CLCL Lite" class="itunes-embed-image"/></a><div class="itunes-embed-info"><p class="itunes-embed-title"><a href="https://itunes.apple.com/jp/app/clcl-lite/id495511246?mt=12&uo=4&at=10l8JW&ct=hatenablog" rel="nofollow" target="_blank">CLCL Lite</a></p><ul><li class="itunes-embed-artist">Genji</li><li class="itunes-embed-genre">ユーティリティ</li><li class="itunes-embed-price">無料</li><li class="itunes-embed-badge"><a href="https://itunes.apple.com/jp/app/clcl-lite/id495511246?mt=12&uo=4&at=10l8JW&ct=hatenablog" rel="nofollow" target="_blank"><img src="https://cdn.blog.st-hatena.com/images/theme/itunes/itunes-badge-macappstore@2x.png" width="80px" height="15px" /></a></li></ul></div></div></p><p>commandやoptionを連打することでアプリを開くことが出来る。これくらいシンプルな方が好きかも。<br /> commandにTrelloのアプリを割り当ててすぐにメモが出来るようにした。<br /> optionには<a class="keyword" href="http://d.hatena.ne.jp/keyword/Chrome">Chrome</a>を割り当ててすぐにブラウザに戻れるようにした。<br /> もう一つあれば、iTermに割り当てたのに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%B0%A4%CC%A4%CC">ぐぬぬ</a>・・・<br /> CLCLは多用しそうですね。<br /> <br /> </p> </div> <div class="section"> <h4>RecordItも使える!</h4> <p><a href="http://recordit.co/">Recordit: Record screencasts fast &amp; free! with GIF Support!</a><br /> 画面を撮影して<a class="keyword" href="http://d.hatena.ne.jp/keyword/GIF%A5%A2%A5%CB%A5%E1%A1%BC%A5%B7%A5%E7%A5%F3">GIFアニメーション</a>にしてくれるアプリ。<br /> 今までLICEcapを使っていたけどRedordItの方が使いやすい。<br /> 上のメニューバーにアイコンが出て来てそこで範囲選択や録画/停止が出来る。<br /> また、アニメーションはローカルに保存されるわけではなくrecordit.coにアップロードされているのでURLを貼るだけで共有できる。<br /> アニメーションにはメニューバーから選択できてブラウザで開かれる。(パスワードで鍵も掛けられるみたい。)</p><p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180501/20180501112006.png" alt="f:id:tdualdir:20180501112006p:plain:w200" title="f:id:tdualdir:20180501112006p:plain:w200" class="hatena-fotolife" style="width:200px" itemprop="image"></span></p><p>デフォルトではmp4形式で再生されてる。右下のGIFボタンを押すことでGIFファイルが開かれる。<br /> ローカルに保存したければ、一度ブラウザで開いてから右クリックで保存。(サイトがいつ無くなるかわからないのでローカルに保存した方がいいか・・・?)<br /> これはめっちゃ良い。</p> </div> </div> tdualdir A/Bテストの評価をベイズ統計でやってみない? hatenablog://entry/17391345971636763657 2018-04-21T00:46:20+09:00 2018-04-21T13:42:18+09:00 遊びでA/Bテストの評価をベイズ統計でやってみたら、思いのほか面白かったので記事に残します。 用語の定義 コンバージョン コンバージョン率 A/Bテスト コンバージョンの確率分布 なぜベイズ統計を使うのか 割合の問題点 尤度と最尤法 尤度 最尤法 ベイズ統計 ベイズの定理 共役事前分布 ベータ分布 事後分布の導出 事後分布のグラフ ベイジアンA/Bテストの実装 コード 使用例 本番っぽい使い方 カイ二乗検定と比較 最後に 用語の定義 コンバージョン コンバージョンとは「Webサイト上で起きた最終的な成果」のことです。 具体的に何を意味するかはサイトの種類によっては様々です。 例えば、ECサイト… <p>遊びでA/Bテストの評価を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>統計でやってみたら、思いのほか面白かったので記事に残します。</p> <ul class="table-of-contents"> <li><a href="#用語の定義">用語の定義</a><ul> <li><a href="#コンバージョン">コンバージョン</a></li> <li><a href="#コンバージョン率">コンバージョン率</a></li> <li><a href="#ABテスト">A/Bテスト</a></li> </ul> </li> <li><a href="#コンバージョンの確率分布">コンバージョンの確率分布</a></li> <li><a href="#なぜベイズ統計を使うのか">なぜベイズ統計を使うのか</a><ul> <li><a href="#割合の問題点">割合の問題点</a></li> <li><a href="#尤度と最尤法">尤度と最尤法</a><ul> <li><a href="#尤度">尤度</a></li> <li><a href="#最尤法">最尤法</a></li> </ul> </li> </ul> </li> <li><a href="#ベイズ統計">ベイズ統計</a><ul> <li><a href="#ベイズの定理">ベイズの定理</a></li> <li><a href="#共役事前分布">共役事前分布</a></li> <li><a href="#ベータ分布">ベータ分布</a></li> <li><a href="#事後分布の導出">事後分布の導出</a></li> <li><a href="#事後分布のグラフ">事後分布のグラフ</a></li> </ul> </li> <li><a href="#ベイジアンABテストの実装">ベイジアンA/Bテストの実装</a><ul> <li><a href="#コード">コード</a></li> <li><a href="#使用例">使用例</a></li> <li><a href="#本番っぽい使い方">本番っぽい使い方</a></li> </ul> </li> <li><a href="#カイ二乗検定と比較">カイ二乗検定と比較</a></li> <li><a href="#最後に">最後に</a></li> </ul> <div class="section"> <h3 id="用語の定義">用語の定義</h3> <div class="section"> <h4 id="コンバージョン">コンバージョン</h4> <p>コンバージョンとは「Webサイト上で起きた最終的な成果」のことです。<br /> 具体的に何を意味するかはサイトの種類によっては様々です。<br /> 例えば、<a class="keyword" href="http://d.hatena.ne.jp/keyword/EC%A5%B5%A5%A4%A5%C8">ECサイト</a>では商品の購入で、<a class="keyword" href="http://d.hatena.ne.jp/keyword/SNS">SNS</a>では会員登録などです。</p> </div> <div class="section"> <h4 id="コンバージョン率">コンバージョン率</h4> <p>コンバージョン率は「成果に繋がる最初の行動に対して実際に成果に繋がった割合」のことです。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/EC%A5%B5%A5%A4%A5%C8">ECサイト</a>ではある商品が購入された数をその商品が表示された数で割ったものがコンバージョン率となります。<br /> (例えば、ある商品の表示数が100でその内で購入数が2ならばコンバージョン率は 2/100=0.02になります。)</p> </div> <div class="section"> <h4 id="ABテスト">A/Bテスト</h4> <p>A/Bテストとは複数の施策に対して良否をつけるためのテストです。<br /> 例えば、ウェブサイトの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E6%A1%BC%A5%B6%A5%D3%A5%EA%A5%C6%A5%A3">ユーザビリティ</a>ーを上げるためにデザインAとデザインBを同じ期間試してどちらが表示数が多いのか比べたり、<br /> 広告のパターンAとパターンBを出し分けてどちらのコンバージョン率が大きいか比べたりすることです。</p><br /> <p>今回は広告のA/Bテストを考えます。<br /> 広告の表示に対して購入が何件有ったのか(コンバージョン率)をA/Bテストします。<br /> <br /> </p> </div> </div> <div class="section"> <h3 id="コンバージョンの確率分布">コンバージョンの確率分布</h3> <p>表示に対して購入が有ったか、無かったのかの二通りです。<br /> それはBernoulli(ベルヌーイ)分布で表現できます。<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cdisplaystyle%20f%28x%5Cmid%20%5Ctheta%29%3D%20%5Ctheta%5Ex%281-%5Ctheta%29%5E%7B1-x%7D%20%5Ctag%7B1%7D" alt=" \displaystyle f(x\mid \theta)= \theta^x(1-\theta)^{1-x} \tag{1}"/><br /> 購入が有った時x=1<br /> 購入が無かった時x=0<br /> とすれば、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Ctheta" alt="\theta"/>がx=1になる時の確率なので<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Ctheta" alt="\theta"/>がコンバージョン率ということになります。<br /> xは確率変数,<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Ctheta" alt="\theta"/>はパラメータ(母数とも呼ばれる)と呼ばれています。</p> </div> <div class="section"> <h3 id="なぜベイズ統計を使うのか">なぜ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>統計を使うのか</h3> <div class="section"> <h4 id="割合の問題点">割合の問題点</h4> <p>コンバージョン率は購入数÷表示数であることを説明しました。ここでパターンAのコンバージョン率を確かめる実験を二回行ったとします。</p><p>実験①: 表示数100, 購入数2 でした。コンバージョン率は2/100=0.02になります。</p><p>実験②: 表示数10000、購入数200でした。コンバージョン率は200/10000=0.02になります。</p><p>例えば実験② は実験①に比べて長い間表示してたので表示数も多かったとします。</p><p>どちらの方が信頼できますか?<br /> 実験①はデータが少なくてたまたまコンバージョン率が0.02になった様に思えますが、実験②は実験①よりは信頼できそうです。<br /> しかし、両方とも同じコンバージョン率になります。<br /> コンバージョン率の様な割合はこの信頼性を表現出来ていない事になります。<br /> <br /> </p> </div> <div class="section"> <h4 id="尤度と最尤法">尤度と最尤法</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>統計の前に最尤法という方法でパラメータの推定をしてみます。</p> <div class="section"> <h5 id="尤度">尤度</h5> <p>確率分布はパラメータを固定した場合の確率変数の関数でしたが、同じ関数を確率変数を固定した場合のパラメータの関数と捉えた物を尤度と言います。<br /> この場合の確率変数には観測データが入ります。観測データの表示数がNの場合に尤度は以下の様になります。<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cdisplaystyle%20L%28%5Ctheta%29%3D%5Cprod_%7Bi%3D1%7D%5EN%20f%28x_i%5Cmid%5Ctheta%29%3D%5Cprod_%7Bi%3D1%7D%5EN%5Ctheta%5E%7Bx_i%7D%281-%5Ctheta%29%5E%7B1-x_i%7D%5Ctag%7B2%7D" alt=" \displaystyle L(\theta)=\prod_{i=1}^N f(x_i\mid\theta)=\prod_{i=1}^N\theta^{x_i}(1-\theta)^{1-x_i}\tag{2}"/><br /> </p> </div> <div class="section"> <h5 id="最尤法">最尤法</h5> <p>尤度が最大値の時のパラメータが尤も(もっとも)適した値であるという方針のもとでパラメータを推定する方法です。<br /> 最大値の時の引数の値を求めるには<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC">微分</a>が0のところを求めればいいのですが、計算を楽にするために尤度の対数を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC">微分</a>をします。(対数関数は単調増加関数なので引数が最大のときに対数関数の値も最大になるので問題ない。)</p><p>\begin{align*}<br /> \frac{d\log L(\theta)}{d\theta}<br /> &=\frac{d}{d\theta}\log\prod_{i=1}^N\theta^{x_i}(1-\theta)^{1-x_i}\\<br /> &=\frac{d}{d\theta} \sum_{i=1}^N \left(x_i \log\theta +(1-x_i)\log(1-\theta)\right) \\<br /> &=\sum_{i=1}^N \left(\frac{x_i}{\theta} - \frac{1-x_i}{1-\theta}\right) =0<br /> \end{align*}</p><p>\begin{align*}<br /> \sum_{i=1}^N \left(x_i(1-\theta) - (1-x_i)\theta \right) &=0\\<br /> \sum_{i=1}^N(x_i -\theta) &=0\\<br /> \sum_{i=1}^N x_i - N\theta &= 0\\<br /> \theta = \frac{\sum_{i=1}^N x_i}{N}<br /> \end{align*}</p><p>Nは表示数で、<img src="https://chart.apis.google.com/chart?cht=tx&chl=x_i" alt="x_i"/>はコンバージョンが有ったときに1で無かったときは0なので、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Ctheta" alt="\theta"/>の尤も適した値はコンバージョン率だとわかります。<br /> ですので、最尤法を使っても割合の問題が出てきて信頼性を測るすべはありません。<br /> <br /> </p> </div> </div> </div> <div class="section"> <h3 id="ベイズ統計"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>統計</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>統計ではパラメータを1つの決まった値ではなくて確率分布として考えます。<br /> こうする事で割合や最尤法では測れなかった信頼性が測れる事が後にわかります。</p> <div class="section"> <h4 id="ベイズの定理"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>の定理</h4> <p>確率分布の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>の定理は以下の様になります。<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cdisplaystyle%20f%28%5Ctheta%5Cmid%20x%29%3D%5Cfrac%7Bf%28x%5Cmid%20%5Ctheta%29p%28%5Ctheta%29%7D%7Bp%28x%29%7D%20%5Ctag%7B3%7D" alt=" \displaystyle f(\theta\mid x)=\frac{f(x\mid \theta)p(\theta)}{p(x)} \tag{3}"/></p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cdisplaystyle%20f%28%5Ctheta%5Cmid%20x%29" alt=" \displaystyle f(\theta\mid x)"/>は<b>事後分布</b>と呼ばれます。これをパラメータ(コンバージョン率)の分布と捉えます。<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20p%28x%29" alt=" p(x)"/>は<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctheta" alt=" \theta"/>に依存してないので今回はあまり気にする必要がありません。<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20f%28x%5Cmid%20%5Ctheta%29" alt=" f(x\mid \theta)"/>は尤度でベルヌーイ分布と同じ形でしたね。<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20f%28%5Ctheta%29" alt=" f(\theta)"/>は<b>事前分布</b>と呼ばれています。<br /> <br /> </p> </div> <div class="section"> <h4 id="共役事前分布">共役事前分布</h4> <p>事前分布の形を決定しないと事後分布の計算はできませんが形は謎です。<br /> ですので、この分布は適当に決めてしまいましょう。<br /> ただ、事前分布を適当に決めるにしても何らかの指針は欲しいものです。また適当に決めると計算できない場合がほとんどです。<br /> そこで共役事前分布というものを考えます。この共役事前分布は事後分布が計算できるように選んだ事前分布デス。また、事前分布と事後分布は同じ形の確率分布になります。<br /> どういうものがあるのかは<a class="keyword" href="http://d.hatena.ne.jp/keyword/wiki">wiki</a>などを見て欲しいのですが、尤度がベルヌーイ分布の場合は事前分布としてベータ分布を選べば良いことがわかっています。</p> </div> <div class="section"> <h4 id="ベータ分布">ベータ分布</h4> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cdisplaystyle%20f%28%5Ctheta%20%7C%20%5Calpha%2C%5Cbeta%29%20%3D%20%5Cfrac%7B1%7D%7BB%28%5Calpha%2C%5Cbeta%29%7D%5Ctheta%5E%7B%5Calpha-1%7D%281-%5Ctheta%29%5E%7B%5Cbeta-1%7D%20%5Ctag%7B4%7D" alt=" \displaystyle f(\theta | \alpha,\beta) = \frac{1}{B(\alpha,\beta)}\theta^{\alpha-1}(1-\theta)^{\beta-1} \tag{4}"/><br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20B%28%5Calpha%2C%5Cbeta%29" alt=" B(\alpha,\beta)"/>はベータ関数ですが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>をして1とするための規格化係数なのであまり気にしなくていいです。<br /> 形は図1の様になります。<figure class="figure-image figure-image-fotolife" title="図1.ベータ分布"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180420/20180420160947.png" alt="f:id:tdualdir:20180420160947p:plain" title="f:id:tdualdir:20180420160947p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図1.ベータ分布</figcaption></figure><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Calpha%2C%5Cbeta" alt=" \alpha,\beta"/>に依存して形が大きく変わっていることがわかります。<br /> また、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Calpha%2C%5Cbeta" alt=" \alpha,\beta"/>が共に1の時は一様分布になっているのもわかります。</p> </div> <div class="section"> <h4 id="事後分布の導出">事後分布の導出</h4> <p>共役事前分布のベータ分布を使って事後分布を計算して見ましょう。(事後分布もベータ分布になるはずですが。)<br /> \begin{align*}<br /> f(\theta\mid x) &\propto f(x\mid\theta)p(\theta)\\<br /> &\propto \left(\prod_{i=1}^N\theta^{x_i}(1-\theta)^{1-x_i}\right)\theta^{\alpha -1}(1-\theta)^{\beta-1}\\<br /> &=\theta^{\sum^N_{i=1}x_i+\alpha-1}(1-\theta)^{\sum^N_{i=1}(1-x_i)+\beta-1}\\<br /> &= \theta^{\alpha'-1}(1-\theta)^{\beta'-1}<br /> \end{align*}<br /> パラメータが<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Calpha%27%2C%20%5Cbeta%27" alt=" \alpha&#39;, \beta&#39;"/>のベータ分布になりました。<br /> 但し、<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cdisplaystyle%20%5Calpha%27%3D%5Csum_%7Bi%3D1%7D%5ENx_i%20%2B%20%5Calpha%2C%20%5Cbeta%27%3D%5Csum_%7Bi%3D1%7D%5EN%281-x_i%29%20%2B%20%5Cbeta%20%5Ctag%7B5%7D" alt=" \displaystyle \alpha&#39;=\sum_{i=1}^Nx_i + \alpha, \beta&#39;=\sum_{i=1}^N(1-x_i) + \beta \tag{5}"/><br /> です。<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Calpha%27" alt=" \alpha&#39;"/>はコンバージョン数だけ増加して、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cbeta%27" alt=" \beta&#39;"/>はコンバージョンされなかった数だけ増加しています。<br /> 事前分布のベータ分布のパラメータとして<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Calpha%3D1%2C%20%5Cbeta%3D1" alt=" \alpha=1, \beta=1"/>(一様分布になる)を選ぶことにしましょう。</p> </div> <div class="section"> <h4 id="事後分布のグラフ">事後分布のグラフ</h4> <p>必要なライブラリをpipで入れます。(pandasは描画には使いませんが後で使うので一緒にインストールします。)</p> <pre class="code" data-lang="" data-unlink>pip install numpy scipy matplotlib pandas</pre><p>事後分布を描画する関数を作ります。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> numpy <span class="synStatement">as</span> np <span class="synPreProc">import</span> scipy.stats <span class="synPreProc">from</span> matplotlib <span class="synPreProc">import</span> pyplot <span class="synStatement">as</span> plt <span class="synStatement">def</span> <span class="synIdentifier">show_beta</span>(h, t): x = np.linspace(<span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">1000</span>) plt.xlim(<span class="synConstant">0</span>, <span class="synConstant">1</span>) plt.ylim(<span class="synConstant">0</span>, <span class="synConstant">5</span>) plt.xlabel(<span class="synConstant">r&quot;$\theta$&quot;</span>,fontsize=<span class="synConstant">15</span>) plt.ylabel(<span class="synConstant">r&quot;$f(\theta\mid x)$&quot;</span>,fontsize=<span class="synConstant">15</span>) alpha = <span class="synConstant">1</span> beta = <span class="synConstant">1</span> alpha += h beta += t f = scipy.stats.beta(alpha, beta) m = f.mean() v = f.var() y = f.pdf(x) plt.title(<span class="synConstant">r'$\alpha$=%d+1, $\beta$=%d+1 [mean=%.2f, var=%.7f]'</span> % (h,t,m,v), fontsize=<span class="synConstant">15</span>) plt.plot(x, y) plt.show() </pre><p>hにコンバージョン数、tに非コンバージョン数を入れると事後分布を描画する様にしました。<br /> また、図のタイトルに平均(mean)と分散(var)も表示しています。</p><p>実験①:表示数100,購入数2の時を描画してみましょう。</p> <pre class="code lang-python" data-lang="python" data-unlink>show_beta(<span class="synConstant">2</span>,<span class="synConstant">100</span>-<span class="synConstant">2</span>) </pre><p>出力<figure class="figure-image figure-image-fotolife" title="図2.実験①の事後分布"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180420/20180420165542.png" alt="f:id:tdualdir:20180420165542p:plain" title="f:id:tdualdir:20180420165542p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図2.実験①の事後分布</figcaption></figure></p><p>実験②:表示数10000,購入数200の時は</p> <pre class="code lang-python" data-lang="python" data-unlink>show_beta(<span class="synConstant">200</span>,<span class="synConstant">10000</span>-<span class="synConstant">200</span>) </pre><p>出力<figure class="figure-image figure-image-fotolife" title="図3.実験②の事後分布"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180420/20180420165549.png" alt="f:id:tdualdir:20180420165549p:plain" title="f:id:tdualdir:20180420165549p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図3.実験②の事後分布</figcaption></figure></p><p>図2と図3を見比べると、図2の分布には幅があり不確定であることがわかります。一方で図3は幅がほとんどなく値がほぼ確定してることがわかります。この幅は分散に依存してるので、実際に分散(var)を見ると図3の方が全然小さいことがわかります。この様にパラメータ(コンバージョン率)を分布で表現すれば、その値の信頼性が分散という形で確認できることがわかりました。</p><p>これが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>統計を使う利点の一つです。</p> </div> </div> <div class="section"> <h3 id="ベイジアンABテストの実装"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%B8%A5%A2%A5%F3">ベイジアン</a>A/Bテストの実装</h3> <p>準備ができたので、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>統計を使ってA/Bテストの結果を評価しましょう。<br /> これは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%B8%A5%A2%A5%F3">ベイジアン</a>A/Bテストと呼ばれています。<br /> 早速実装しまし。</p> <div class="section"> <h4 id="コード">コード</h4> <pre class="code lang-python" data-lang="python" data-unlink><span class="synStatement">class</span> <span class="synIdentifier">BayesianAB</span>: <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self, params=<span class="synIdentifier">None</span>, size=<span class="synConstant">2</span>): <span class="synConstant">&quot;&quot;&quot;</span> <span class="synConstant"> params are a list of Beta distribution's initial params. e.g. [[alpha of A, beta of A], [alpha of B, beta of B]]</span> <span class="synConstant"> &quot;&quot;&quot;</span> <span class="synStatement">if</span> params <span class="synStatement">is</span> <span class="synIdentifier">None</span>: self.params = [] <span class="synStatement">for</span> _ <span class="synStatement">in</span> <span class="synIdentifier">range</span>(size): self.params.append([<span class="synConstant">1</span>,<span class="synConstant">1</span>]) self.size = <span class="synIdentifier">len</span>(self.params) self.data = [] <span class="synStatement">for</span> _ <span class="synStatement">in</span> <span class="synIdentifier">range</span>(size): self.data.append([<span class="synConstant">0</span>,<span class="synConstant">0</span>]) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;the number of comparison: &quot;</span>, self.size) self.sampling() <span class="synStatement">def</span> <span class="synIdentifier">update</span>(self, data, sampling=<span class="synIdentifier">True</span>): <span class="synConstant">&quot;&quot;&quot;</span> <span class="synConstant"> data are a list of pairs of impression and conversion. e.g. [[imp of A, conv of A], [imp of B, conv of B]]</span> <span class="synConstant"> &quot;&quot;&quot;</span> <span class="synStatement">if</span> self.size != <span class="synIdentifier">len</span>(data): <span class="synIdentifier">print</span>(<span class="synConstant">&quot;No match of the size.&quot;</span>) <span class="synStatement">for</span> p, current, new <span class="synStatement">in</span> <span class="synIdentifier">zip</span>(self.params, self.data, data): imp = new[<span class="synConstant">0</span>] conv = new[<span class="synConstant">1</span>] current[<span class="synConstant">0</span>] += imp current[<span class="synConstant">1</span>] += conv p[<span class="synConstant">0</span>] += conv p[<span class="synConstant">1</span>] += (imp - conv) <span class="synStatement">if</span> sampling: self.sampling() <span class="synStatement">def</span> <span class="synIdentifier">mean_ver</span>(self): <span class="synConstant">&quot;&quot;&quot;</span> <span class="synConstant"> return [(mean of A, variance of A), (mean of B, variance of B), ...]</span> <span class="synConstant"> &quot;&quot;&quot;</span> <span class="synStatement">return</span> [(posterior.mean(), posterior.var())<span class="synStatement">for</span> posterior <span class="synStatement">in</span> self.posterior_list] <span class="synStatement">def</span> <span class="synIdentifier">sampling</span>(self, n_samples=<span class="synConstant">50000</span>): <span class="synIdentifier">print</span>(<span class="synConstant">&quot;num of samples: &quot;</span>, n_samples) self.posterior_list = [beta(*p).rvs(n_samples) <span class="synStatement">for</span> p <span class="synStatement">in</span> self.params] <span class="synStatement">def</span> <span class="synIdentifier">show_beta</span>(self, title=<span class="synConstant">&quot;&quot;</span>, save=<span class="synIdentifier">False</span>, labels=<span class="synIdentifier">None</span>): plt.figure(figsize=(<span class="synConstant">10</span>, <span class="synConstant">5</span>)) plt.title(<span class="synConstant">&quot;Posterior distribution &quot;</span>+ title) cmap = plt.get_cmap(<span class="synConstant">'jet'</span>) color_list= [] <span class="synStatement">for</span> i, posterior <span class="synStatement">in</span> <span class="synIdentifier">enumerate</span>(self.posterior_list): color =cmap(<span class="synConstant">0.25</span>*(i+<span class="synConstant">1</span>)) color_list.append(color) plt.hist(posterior, bins=<span class="synConstant">100</span>, histtype=<span class="synConstant">&quot;stepfilled&quot;</span>, normed=<span class="synIdentifier">True</span>, color=color, alpha=<span class="synConstant">0.5</span>) handles = [Rectangle((<span class="synConstant">0</span>,<span class="synConstant">0</span>),<span class="synConstant">1</span>,<span class="synConstant">1</span>,color=c, ec=<span class="synConstant">&quot;k&quot;</span>, alpha=<span class="synConstant">0.5</span>) <span class="synStatement">for</span> c <span class="synStatement">in</span> color_list] <span class="synStatement">if</span> labels <span class="synStatement">is</span> <span class="synIdentifier">None</span>: labels = [<span class="synIdentifier">chr</span>(<span class="synConstant">65</span>+i) <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(self.size)] <span class="synComment"># create A,B,...</span> plt.legend(handles, labels) <span class="synStatement">if</span> save: plt.savefig(<span class="synConstant">&quot;{}.png&quot;</span>.<span class="synIdentifier">format</span>(title)) plt.show() <span class="synStatement">def</span> <span class="synIdentifier">diff_prob</span>(self, index_high, index_low): prob = (self.posterior_list[index_low] &lt; self.posterior_list[index_high]).mean() <span class="synStatement">if</span> prob &lt; <span class="synConstant">0.5</span>: prob = <span class="synConstant">1</span> - prob <span class="synStatement">return</span> prob <span class="synStatement">def</span> <span class="synIdentifier">show_metrics</span>(self): <span class="synIdentifier">print</span>(self.data) <span class="synStatement">def</span> <span class="synIdentifier">metrics</span>(self, labels=<span class="synIdentifier">None</span>): <span class="synStatement">if</span> labels <span class="synStatement">is</span> <span class="synIdentifier">None</span>: labels = [<span class="synIdentifier">chr</span>(<span class="synConstant">65</span>+i) <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(self.size)] <span class="synComment"># create A,B,...</span> <span class="synStatement">return</span> pd.DataFrame(self.data, index=labels, columns=[<span class="synConstant">&quot;Impressions&quot;</span>, <span class="synConstant">&quot;Conversions&quot;</span>]) </pre> </div> <div class="section"> <h4 id="使用例">使用例</h4> <p>初期化するときに事前分布のベータ分布のパラメータを設定できる様にしましたが、ほとんどの場合は一様分布で十分なのでそのまま初期化しましょう。<br /> またsizeで比較する数を指定できます。</p> <pre class="code lang-python" data-lang="python" data-unlink>abtest = BayesianAB(size=<span class="synConstant">2</span>) </pre><p>出力</p> <pre class="code" data-lang="" data-unlink>the number of comparison: 2 num of samples: 50000</pre><p>作成したクラスの使い方を説明するのですが、ここではダミーの行動データを作りましょう。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synStatement">def</span> <span class="synIdentifier">dummy_genrator</span>(conversion_rate, n_impression): <span class="synStatement">return</span> np.array(bernoulli(conversion_rate).rvs(n_impression)) a = dummy_genrator(<span class="synConstant">0.015</span>, <span class="synConstant">204</span>) b = dummy_genrator(<span class="synConstant">0.021</span>, <span class="synConstant">200</span>) imp_a = <span class="synIdentifier">len</span>(a) imp_b = <span class="synIdentifier">len</span>(b) conv_a = np.count_nonzero(a) conv_b = np.count_nonzero(b) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;A </span><span class="synSpecial">\n</span><span class="synConstant">表示数: {}</span><span class="synSpecial">\n</span><span class="synConstant">購入数: {}</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>.<span class="synIdentifier">format</span>(imp_a, conv_a)) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;B </span><span class="synSpecial">\n</span><span class="synConstant">表示数: {}</span><span class="synSpecial">\n</span><span class="synConstant">購入数: {}</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>.<span class="synIdentifier">format</span>(imp_b, conv_b)) </pre><p>出力</p> <pre class="code" data-lang="" data-unlink>A 表示数: 204 購入数: 2 B 表示数: 200 購入数: 3</pre><p>このデータを使って更新します。</p> <pre class="code lang-python" data-lang="python" data-unlink>abtest.update([[imp_a, conv_a], [imp_b, conv_b]]) </pre><p>これで更新されているので、平均と分散を確認すると、</p> <pre class="code lang-python" data-lang="python" data-unlink>abtest.mean_ver() </pre><p>出力</p> <pre class="code" data-lang="" data-unlink>[(0.014610260919694517, 7.003148406424335e-05), (0.019850764074203515, 9.568870563433339e-05)]</pre><p>[(平均,分散),(平均,分散)]という形式で出力してるので<br /> パターンAの分布の平均が0.014610260919694517, 分散が7.003148406424335e-05<br /> パターンBの分布の平均が0.019850764074203515, 分散が9.568870563433339e-05<br /> です。<br /> 図も描画して見ると</p> <pre class="code lang-python" data-lang="python" data-unlink>abtest.show_beta() </pre><p>出力<figure class="figure-image figure-image-fotolife" title="図4.使用例の事後分布"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180420/20180420172806.png" alt="f:id:tdualdir:20180420172806p:plain" title="f:id:tdualdir:20180420172806p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図4.使用例の事後分布</figcaption></figure>図4を見ると重なっている部分が大きく有意差がある様に見えませんが、数値としても確認しましょう。<br /> updateの時の順番と同じインデックスを指定してやります。Aなら0,Bなら1です。</p> <pre class="code lang-python" data-lang="python" data-unlink>abtest.diff_prob(<span class="synConstant">0</span>,<span class="synConstant">1</span>) </pre><p>出力</p> <pre class="code" data-lang="" data-unlink>0.6682600000000001</pre><p>完全に一致してる場合は0.5になります。ここでは0.668...なのでやはりあまり有意差がないということです。<br /> 更新したデータを見るにはshow_metricsを使います。</p> <pre class="code lang-python" data-lang="python" data-unlink>abtest.show_metrics() </pre><p>出力</p> <pre class="code" data-lang="" data-unlink>[[204, 2], [200, 3]]</pre><p>[[Aの表示数,Aの購入数],[Bの表示数],[Bの表示数]]という形式で出力してくれます。</p> </div> <div class="section"> <h4 id="本番っぽい使い方">本番っぽい使い方</h4> <p>大体の使い方はわかったと思うので、本番っぽい使い方をしてみましょう。</p><p>今回はパターンは2パターンではなく3パターンの比較します。それぞれのパターンをA,B,Cと呼びます。<br /> ある程度データが溜まった想定でダミーデータの生成します。</p> <pre class="code lang-python" data-lang="python" data-unlink>a = dummy_genrator(<span class="synConstant">0.015</span>, <span class="synConstant">1002</span>) b = dummy_genrator(<span class="synConstant">0.021</span>, <span class="synConstant">1200</span>) c = dummy_genrator(<span class="synConstant">0.016</span>, <span class="synConstant">1130</span>) imp_a = <span class="synIdentifier">len</span>(a) imp_b = <span class="synIdentifier">len</span>(b) imp_c = <span class="synIdentifier">len</span>(c) conv_a = np.count_nonzero(a) conv_b = np.count_nonzero(b) conv_c = np.count_nonzero(c) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;A </span><span class="synSpecial">\n</span><span class="synConstant">表示数: {}</span><span class="synSpecial">\n</span><span class="synConstant">購入数: {}</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>.<span class="synIdentifier">format</span>(imp_a, conv_a)) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;B </span><span class="synSpecial">\n</span><span class="synConstant">表示数: {}</span><span class="synSpecial">\n</span><span class="synConstant">購入数: {}</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>.<span class="synIdentifier">format</span>(imp_b, conv_b)) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;C </span><span class="synSpecial">\n</span><span class="synConstant">表示数: {}</span><span class="synSpecial">\n</span><span class="synConstant">購入数: {}</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>.<span class="synIdentifier">format</span>(imp_c, conv_c)) </pre><p>出力</p> <pre class="code" data-lang="" data-unlink>A 表示数: 1002 購入数: 22 B 表示数: 1200 購入数: 22 C 表示数: 1130 購入数: 18 </pre><p>早速グラフをみてみましょう。</p> <pre class="code lang-python" data-lang="python" data-unlink>abtest = BayesianAB(size=<span class="synConstant">3</span>) <span class="synComment">#今回は3パターンなのでsizeは3</span> abtest.update([[imp_a, conv_a], [imp_b, conv_b],[imp_c, conv_c]]) abtest.show_beta() </pre><p>出力<figure class="figure-image figure-image-fotolife" title="図5.最初の比較図"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180420/20180420174510.png" alt="f:id:tdualdir:20180420174510p:plain" title="f:id:tdualdir:20180420174510p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図5.最初の比較図</figcaption></figure></p><p>3つとも重なっている部分が大きいですね。<br /> 数値でも確認しましょう。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synIdentifier">print</span>(abtest.diff_prob(<span class="synConstant">1</span>,<span class="synConstant">0</span>)) <span class="synComment"># BとAの比較</span> <span class="synIdentifier">print</span>(abtest.diff_prob(<span class="synConstant">1</span>,<span class="synConstant">2</span>)) <span class="synComment">#BとCの比較</span> <span class="synIdentifier">print</span>(abtest.diff_prob(<span class="synConstant">2</span>,<span class="synConstant">0</span>)) <span class="synComment">#CとAの比較</span> </pre><p>出力</p> <pre class="code" data-lang="" data-unlink>0.72712 0.66822 0.84508</pre><p>有意差がわかりませんね。もっとデータが必要です。データが溜まるまで待ちましょう。<br /> データが溜まった想定でダミーデータの生成します。</p> <pre class="code lang-python" data-lang="python" data-unlink>a = dummy_genrator(<span class="synConstant">0.015</span>, <span class="synConstant">25100</span>) b = dummy_genrator(<span class="synConstant">0.021</span>, <span class="synConstant">22000</span>) c = dummy_genrator(<span class="synConstant">0.016</span>, <span class="synConstant">23300</span>) imp_a = <span class="synIdentifier">len</span>(a) imp_b = <span class="synIdentifier">len</span>(b) imp_c = <span class="synIdentifier">len</span>(c) conv_a = np.count_nonzero(a) conv_b = np.count_nonzero(b) conv_c = np.count_nonzero(c) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;A </span><span class="synSpecial">\n</span><span class="synConstant">表示数: {}</span><span class="synSpecial">\n</span><span class="synConstant">購入数: {}</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>.<span class="synIdentifier">format</span>(imp_a, conv_a)) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;B </span><span class="synSpecial">\n</span><span class="synConstant">表示数: {}</span><span class="synSpecial">\n</span><span class="synConstant">購入数: {}</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>.<span class="synIdentifier">format</span>(imp_b, conv_b)) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;C </span><span class="synSpecial">\n</span><span class="synConstant">表示数: {}</span><span class="synSpecial">\n</span><span class="synConstant">購入数: {}</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>.<span class="synIdentifier">format</span>(imp_c, conv_c)) </pre><p>出力</p> <pre class="code" data-lang="" data-unlink>A 表示数: 25100 購入数: 364 B 表示数: 22000 購入数: 469 C 表示数: 23300 購入数: 354</pre><p>先ほど作ったBayesianABの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>にデータの追加更新をしてやりましょう。</p> <pre class="code lang-python" data-lang="python" data-unlink>abtest.update([[imp_a, conv_a], [imp_b, conv_b],[imp_c, conv_c]]) abtest.show_beta() <span class="synIdentifier">print</span>(abtest.mean_ver()) </pre><p>出力<figure class="figure-image figure-image-fotolife" title="図6.2回目の比較図"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180420/20180420175453.png" alt="f:id:tdualdir:20180420175453p:plain" title="f:id:tdualdir:20180420175453p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図6.2回目の比較図</figcaption></figure></p> <pre class="code" data-lang="" data-unlink>[(0.014823136368344494, 5.586078465062482e-07), (0.0212059201285066, 8.839507467322899e-07), (0.01526854730312879, 6.223394152971891e-07)]</pre><p>全ての分布が最初の時よりも幅が小さくなっていることがわかります。また、パターンBが明らかに離れているので有意差があることがわかります。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synIdentifier">print</span>(abtest.diff_prob(<span class="synConstant">1</span>,<span class="synConstant">0</span>)) <span class="synComment"># BとAの比較</span> <span class="synIdentifier">print</span>(abtest.diff_prob(<span class="synConstant">1</span>,<span class="synConstant">2</span>)) <span class="synComment">#BとCの比較</span> <span class="synIdentifier">print</span>(abtest.diff_prob(<span class="synConstant">2</span>,<span class="synConstant">0</span>)) <span class="synComment">#CとAの比較</span> </pre><p>出力</p> <pre class="code" data-lang="" data-unlink>1.0 1.0 0.65888</pre><p>A,CとBは100%違うことがわかります。そして、Bのコンバージョン率の平均0.021と一番高いのでこの広告を選ぶべきだとわかります。<br /> しかし、一番効果がある広告を選ぶならこれでいいのですが、目的がA,B,Cのそれぞれの有意差を調べることならまだAとCの有意差ははっきりしていません。<br /> ですので、もうちょっとデータを溜めましょう。<br /> データが溜まった想定でダミーデータの生成します。</p> <pre class="code lang-python" data-lang="python" data-unlink>a = dummy_genrator(<span class="synConstant">0.015</span>, <span class="synConstant">251000</span>) b = dummy_genrator(<span class="synConstant">0.021</span>, <span class="synConstant">220000</span>) c = dummy_genrator(<span class="synConstant">0.016</span>, <span class="synConstant">233000</span>) imp_a = <span class="synIdentifier">len</span>(a) imp_b = <span class="synIdentifier">len</span>(b) imp_c = <span class="synIdentifier">len</span>(c) conv_a = np.count_nonzero(a) conv_b = np.count_nonzero(b) conv_c = np.count_nonzero(c) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;A </span><span class="synSpecial">\n</span><span class="synConstant">表示数: {}</span><span class="synSpecial">\n</span><span class="synConstant">購入数: {}</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>.<span class="synIdentifier">format</span>(imp_a, conv_a)) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;B </span><span class="synSpecial">\n</span><span class="synConstant">表示数: {}</span><span class="synSpecial">\n</span><span class="synConstant">購入数: {}</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>.<span class="synIdentifier">format</span>(imp_b, conv_b)) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;C </span><span class="synSpecial">\n</span><span class="synConstant">表示数: {}</span><span class="synSpecial">\n</span><span class="synConstant">購入数: {}</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>.<span class="synIdentifier">format</span>(imp_c, conv_c)) </pre><p>出力</p> <pre class="code" data-lang="" data-unlink>A 表示数: 251000 購入数: 3808 B 表示数: 220000 購入数: 4544 C 表示数: 233000 購入数: 3811</pre><p>追加更新しましょう</p> <pre class="code lang-python" data-lang="python" data-unlink>abtest.update([[imp_a, conv_a], [imp_b, conv_b],[imp_c, conv_c]]) abtest.show_beta() <span class="synIdentifier">print</span>(abtest.mean_ver()) </pre><p>出力<figure class="figure-image figure-image-fotolife" title="図7. 3回目の比較図"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180420/20180420180520.png" alt="f:id:tdualdir:20180420180520p:plain" title="f:id:tdualdir:20180420180520p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図7. 3回目の比較図</figcaption></figure></p> <pre class="code" data-lang="" data-unlink>[(0.015141034587728202, 5.332992221848848e-08), (0.0207078937798314, 8.243283715216886e-08), (0.016250559254538843, 6.199512187766625e-08)]</pre><pre class="code lang-python" data-lang="python" data-unlink>abtest.diff_prob(<span class="synConstant">2</span>,<span class="synConstant">0</span>) </pre><p>出力</p> <pre class="code" data-lang="" data-unlink>0.99964</pre><p>Cの方が良いと言う事がわかりましたね。</p><p>このように<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%B8%A5%A2%A5%F3">ベイジアン</a>A/Bテストでは予め有意差を測るためにデータ数がどの位必要なのかを知ってる必要はなくインクリメントに更新して評価することが出来きます。例えば、リアルタイムに更新をすれば有意差が出たと判断した時点ですぐにA/Bテストをやめて機会損失を最小限に抑える事ができます。<br /> これも<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>統計の強みです。<br /> <br /> </p> </div> </div> <div class="section"> <h3 id="カイ二乗検定と比較"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A5%A4%C6%F3%BE%E8%B8%A1%C4%EA">カイ二乗検定</a>と比較</h3> <p>せっかくなので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A5%A4%C6%F3%BE%E8%B8%A1%C4%EA">カイ二乗検定</a>と比較してみましょう。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> scipy.stats <span class="synPreProc">import</span> chi2_contingency <span class="synStatement">def</span> <span class="synIdentifier">chi2</span>(imp_a, conv_a, imp_b, conv_b,title=<span class="synConstant">&quot;&quot;</span>): <span class="synIdentifier">print</span>(title) metrics = [ [conv_a, imp_a - conv_a], [conv_b, imp_b - conv_b], ] <span class="synIdentifier">print</span>(metrics[<span class="synConstant">0</span>]) <span class="synIdentifier">print</span>(metrics[<span class="synConstant">1</span>]) x2, p, dof, expected = chi2_contingency(metrics) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;カイ二乗値: &quot;</span>, <span class="synIdentifier">round</span>(x2, <span class="synConstant">5</span>)) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;p値: &quot;</span>, p) <span class="synStatement">if</span> p &lt; <span class="synConstant">0.05</span>: <span class="synIdentifier">print</span>(<span class="synConstant">&quot;有意差あり。&quot;</span>) <span class="synStatement">else</span>: <span class="synIdentifier">print</span>(<span class="synConstant">&quot;有意差なし。&quot;</span>) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>) </pre><p>最初のデータのとき</p> <pre class="code lang-python" data-lang="python" data-unlink>imp_a_1 = <span class="synConstant">1002</span> conv_a_1 = <span class="synConstant">22</span> imp_b_1 = <span class="synConstant">1200</span> conv_b_1 = <span class="synConstant">22</span> imp_c_1 = <span class="synConstant">1130</span> conv_c_1 = <span class="synConstant">18</span> chi2(imp_a_1, conv_a_1, imp_b_1, conv_b_1,<span class="synConstant">&quot;###1nd A vs B ###&quot;</span>) chi2(imp_a_1, conv_a_1, imp_c_1, conv_c_1,<span class="synConstant">&quot;###1nd A vs C ###&quot;</span>) chi2(imp_c_1, conv_c_1, imp_b_1, conv_b_1,<span class="synConstant">&quot;###1nd B vs C ###&quot;</span>) </pre><p>出力</p> <pre class="code" data-lang="" data-unlink>###1nd A vs B ### [22, 980] [22, 1178] カイ二乗値: 0.20435 p値: 0.6512354862810796 有意差なし。 ###1nd A vs C ### [22, 980] [18, 1112] カイ二乗値: 0.74604 p値: 0.38773258145798684 有意差なし。 ###1nd B vs C ### [18, 1112] [22, 1178] カイ二乗値: 0.08233 p値: 0.7741616454611604 有意差なし。 </pre><p>2回目にデータが溜まった時</p> <pre class="code lang-python" data-lang="python" data-unlink>imp_a_2 = <span class="synConstant">1002</span> + <span class="synConstant">25100</span> conv_a_2 = <span class="synConstant">22</span> + <span class="synConstant">364</span> imp_b_2 = <span class="synConstant">1200</span>+ <span class="synConstant">22000</span> conv_b_2 = <span class="synConstant">22</span> + <span class="synConstant">469</span> imp_c_2 = <span class="synConstant">1130</span> + <span class="synConstant">23300</span> conv_c_2 = <span class="synConstant">18</span> + <span class="synConstant">354</span> chi2(imp_a_2, conv_a_2, imp_b_2,conv_b_2,<span class="synConstant">&quot;###2nd A vs B ###&quot;</span>) chi2(imp_a_2, conv_a_2, imp_c_2,conv_c_2,<span class="synConstant">&quot;###2nd A vs C ###&quot;</span>) chi2(imp_c_2, conv_c_2, imp_b_2,conv_b_2,<span class="synConstant">&quot;###2nd B vs C ###&quot;</span>) </pre><p>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%B8%A5%A2%A5%F3">ベイジアン</a>A/Bテストでは追加更新してたので表示数と購入数は1回目のデータとの合計になる。)</p><p>出力</p> <pre class="code" data-lang="" data-unlink>###2nd A vs B ### [386, 25716] [491, 22709] カイ二乗値: 28.2126 p値: 1.086949244640548e-07 有意差あり。 ###2nd A vs C ### [386, 25716] [372, 24058] カイ二乗値: 0.13625 p値: 0.7120340373703777 有意差なし。 ###2nd B vs C ### [372, 24058] [491, 22709] カイ二乗値: 23.24073 p値: 1.4293812107138311e-06 有意差あり。</pre><p>A,BとCは有意差があって、AとCの有意差は分からない。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%B8%A5%A2%A5%F3">ベイジアン</a>A/Bテストと結論は同じ。</p><p>3回目のデータが溜まった時</p> <pre class="code lang-python" data-lang="python" data-unlink>imp_a_3 = <span class="synConstant">1002</span> + <span class="synConstant">25100</span> + <span class="synConstant">251000</span> conv_a_3 = <span class="synConstant">22</span> + <span class="synConstant">364</span> + <span class="synConstant">3803</span> imp_b_3 = <span class="synConstant">1200</span> + <span class="synConstant">22000</span> + <span class="synConstant">220000</span> conv_b_3 = <span class="synConstant">22</span> + <span class="synConstant">469</span> + <span class="synConstant">4544</span> imp_c_3 = <span class="synConstant">1130</span> + <span class="synConstant">23300</span> + <span class="synConstant">233000</span> conv_c_3 = <span class="synConstant">18</span> + <span class="synConstant">354</span> + <span class="synConstant">3811</span> chi2(imp_a_3, conv_a_3, imp_b_3,conv_b_3,<span class="synConstant">&quot;###3rd A vs B ###&quot;</span>) chi2(imp_a_3, conv_a_3, imp_c_3,conv_c_3,<span class="synConstant">&quot;###3rd A vs C ###&quot;</span>) chi2(imp_c_3, conv_c_3, imp_b_3,conv_b_3,<span class="synConstant">&quot;###3rd B vs C ###&quot;</span>) </pre><p>出力</p> <pre class="code" data-lang="" data-unlink>###3rd A vs B ### [4189, 272913] [5035, 238165] カイ二乗値: 231.76377 p値: 2.4586705996516234e-52 有意差あり。 ###3rd A vs C ### [4189, 272913] [4183, 253247] カイ二乗値: 11.01697 p値: 0.0009028171800658043 有意差あり。 ###3rd B vs C ### [4183, 253247] [5035, 238165] カイ二乗値: 137.02089 p値: 1.1932289659422658e-31 有意差あり。</pre><p>AとCに有意差がある事がわかりましたね。</p><p>有意差を調べると言う意味では結果は同じになりましたね。<br /> <br /> <br /> </p> </div> <div class="section"> <h3 id="最後に">最後に</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%B8%A5%A2%A5%F3">ベイジアン</a>A/Bテストのメリットをまとめると、<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A5%A4%C6%F3%BE%E8%B8%A1%C4%EA">カイ二乗検定</a>は集計結果を初めから計算し直してるのに比べて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%B8%A5%A2%A5%F3">ベイジアン</a>A/Bテストはインクリメントに結果を得る事ができます。<br /> また、p値など<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%FD%B7%D7%B3%D8">統計学</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%C6%A5%E9%A5%B7%A1%BC">リテラシー</a>が高くないと扱えないものと比べて<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%B8%A5%A2%A5%F3">ベイジアン</a>A/Bテストの方が解釈しやすいって思いませんか?(人によるか・・・)</p><br /> <p>コードはここに置いてます。<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2FTdual%2FbayesianAB%2Fblob%2Fmaster%2FBayesianAB.ipynb" title="Tdual/bayesianAB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://github.com/Tdual/bayesianAB/blob/master/BayesianAB.ipynb">github.com</a></cite></p><br /> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C4%A5%A4%A5%C3%A5%BF%A1%BC">ツイッター</a>やっているのでフォローお願いします!!<p>↓今すぐフォローすべきキラキラ アカウント</p><p><a class="twitter-follow-button" href="https://twitter.com/tdualdir?ref_src=twsrc^tfw" data-show-count="false">Follow @tdualdir</a></p><p> </p><p>じゃあの。</p></p> </div> tdualdir LDAとそれでニュース記事レコメンドを作った。 hatenablog://entry/17391345971631663734 2018-04-09T13:30:00+09:00 2020-06-06T13:38:10+09:00 筆不精なのでこのブログも放置気味だったのですが、まあ流石にそろそろ少しずつでも今まで貯めた込んだものを書き残した方が良い気がしてきた。 なので、これからなんか書いていきます。最初はDeep Learningの記事にしようとも思ったけど、社内勉強会でLDAをまとめてたのを思い出したのでまずはこれから書こうと思います。 注意書き 理論 1.LDAの前に「トピックモデル」とは 2.LDAとは*2 3.LDAで使う確率分布 カテゴリカル分布(マルチヌーイ分布) Dirichlet(ディリクレ)分布 4.確率的生成モデル 5.グラフィカルモデル表現 6.LDAの解釈 7.経験ベイズ(Empirical … <p>筆不精なのでこのブログも放置気味だったのですが、まあ流石にそろそろ少しずつでも今まで貯めた込んだものを書き残した方が良い気がしてきた。<br /> なので、これからなんか書いていきます。</p><p>最初は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Deep%20Learning">Deep Learning</a>の記事にしようとも思ったけど、社内勉強会でLDAをまとめてたのを思い出したのでまずはこれから書こうと思います。</p> <ul class="table-of-contents"> <li><a href="#注意書き">注意書き</a></li> <li><a href="#理論">理論</a><ul> <li><a href="#1LDAの前にトピックモデルとは">1.LDAの前に「トピックモデル」とは</a></li> <li><a href="#2LDAとは2">2.LDAとは*2</a></li> <li><a href="#3LDAで使う確率分布">3.LDAで使う確率分布</a><ul> <li><a href="#カテゴリカル分布マルチヌーイ分布">カテゴリカル分布(マルチヌーイ分布)</a></li> <li><a href="#Dirichletディリクレ分布">Dirichlet(ディリクレ)分布</a></li> </ul> </li> <li><a href="#4確率的生成モデル">4.確率的生成モデル</a></li> <li><a href="#5グラフィカルモデル表現">5.グラフィカルモデル表現</a></li> <li><a href="#6LDAの解釈">6.LDAの解釈</a></li> <li><a href="#7経験ベイズEmpirical-Bayes">7.経験ベイズ(Empirical Bayes)</a></li> <li><a href="#8変分ベイズ法Variational-Bayesian-methods">8.変分ベイズ法(Variational Bayesian methods)</a></li> <li><a href="#9平均場近似Mean-field-approximation">9.平均場近似(Mean field approximation)</a></li> <li><a href="#10変分下限とKullback-Leibler-divergenceとの関係">10.変分下限とKullback-Leibler divergenceとの関係</a></li> <li><a href="#11変分法Calculus-of-variations">11.変分法(Calculus of variations)</a></li> <li><a href="#12パープレキシティーPerplexity">12.パープレキシティー(Perplexity)</a></li> </ul> </li> <li><a href="#実践">実践</a><ul> <li><a href="#データセットと前処理gensim使わないバージョン">データセットと前処理(gensim使わないバージョン)</a><ul> <li><a href="#データセットの取得">データセットの取得</a></li> <li><a href="#前処理用モジュールをインストール">前処理用モジュールをインストール</a></li> <li><a href="#前処理">前処理</a></li> </ul> </li> <li><a href="#学習パラメータの推定">学習(パラメータの推定)</a><ul> <li><a href="#Perplexity">Perplexity</a></li> <li><a href="#推定のコード">推定のコード</a></li> </ul> </li> <li><a href="#gensim">gensim</a></li> <li><a href="#ニュース記事レコメンド">ニュース記事レコメンド</a><ul> <li><a href="#必要なモジュールのインポート">必要なモジュールのインポート</a></li> <li><a href="#前処理with-gensim">前処理(with gensim)</a></li> <li><a href="#LDAの学習">LDAの学習</a></li> <li><a href="#可視化">可視化</a></li> <li><a href="#ニュース記事レコメンドの作成">ニュース記事レコメンドの作成</a></li> </ul> </li> </ul> </li> <li><a href="#終わりに">終わりに</a></li> </ul><p> </p><p> </p> <div class="section"> <h3 id="注意書き">注意書き</h3> <p>・理論編と実践編の二部構成になっています。</p><p>・理論編で扱うLDAの学習<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%EB%A5%B4%A5%EA%A5%BA%A5%E0">アルゴリズム</a>ですが、崩壊型ギブスサンプリングの解説や実装はWEB上にいくらでも見つかるのでこの記事では変分<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>の解説をします。</p><p>・実践編で使う<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%EC">プログラミング言語</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>3です。</p><p>・記事レコメンドの作成には主にgensimを使ってます。</p><p>・記事レコメンドのデー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%BB%A5%C3%A5%C8">タセット</a>として、<a href="https://www.rondhuit.com/download.html#ldcc">livedoor &#x30CB;&#x30E5;&#x30FC;&#x30B9;&#x30B3;&#x30FC;&#x30D1;&#x30B9;</a>を使っています。</p><p>・この記事の内容は業務とは無関係です。私の趣味の内容です。</p><p> </p> </div> <div class="section"> <h3 id="理論">理論</h3> <div class="section"> <h4 id="1LDAの前にトピックモデルとは">1.LDAの前に「トピックモデル」とは</h4> <p>LDAはトピックモデルの手法の一つです。なのでまずはトピックモデルについて理解する必要があります。</p><p>トピックモデルとはデータが「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%F8%BA%DF%C5%AA">潜在的</a>な意味のカテゴリ」から生成されると仮定したモデルです。<br /> この「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%F8%BA%DF%C5%AA">潜在的</a>な意味のカテゴリ」の事を<b>トピック</b>と呼びます。<br /> (<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%AB%C1%B3%B8%C0%B8%EC%BD%E8%CD%FD">自然言語処理</a>ではこのデータは主に文書の集合なので以降は文書を例に説明していきたいと思います。)</p><p>このトピックとは何なのか分かりにくいので具体例を考えましょう。<br /> 図1の様な二つの単語の分布があったとしましょう。<figure class="figure-image figure-image-fotolife" title="図1.単語分布例"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180406/20180406101353.png" alt="f:id:tdualdir:20180406101353p:plain" title="f:id:tdualdir:20180406101353p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図1.単語分布例</figcaption></figure></p><p>左側の「単語の分布1」を見た時に出て来ている単語に共通の意味がありそうな気がします。<br /> 「プログラミング」に関係してそうな単語が揃っていますね。<br /> 一方で右側の「単語の分布2」は「学校」に関係する単語だと気付くと思います。<br /> つまり、これらの単語の分布には何らかの意味的なカテゴリがあり、この単語の分布が<b>トピック</b>なのです。</p><p>そして重要なのは「単語の分布1」にも「単語の分布2」にも「クラス」という同じ単語がありますが、意味が全く違う物を想像したはずです。<br /> なぜ同じ「クラス」という単語を違うものとして想像したのでしょうか?<br /> 「開発」、「HTML」、「<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>」などと一緒に「クラス」という単語があるときにこの「クラス」はきっと周りの単語と似た意味を持ってるはずだと思ったからです。周りの単語と見比べてそこで意味を推し量った結果、学級の「クラス」ではなく<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%EC">プログラミング言語</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8%BB%D8%B8%FE">オブジェクト指向</a>の「クラス」だと判断したのではないでしょうか。<br /> つまり、単語には一対一に対応する意味があるのではなく、単語の共起性(co-occurrence)によって意味が作られると考えられます。</p><p>これは文書中に現れる単語に関しても同じことが言えそうです。<br /> 文書中で急に全くが異なる意味の単語が出てくるとは考えにくいです。<br /> なので、文書を単語の多重集合(Bag of Words(BOW))<a href="#f-ad40c4be" name="fn-ad40c4be" title="Bag of Words  多重集合(Bag)とは重複を許した集合  また、Bag of Wordsで表現することは単語の並び順は考慮せずに単語の出現率だけに注力する事を意味している。 ">*1</a>で表現し、単語の共起性がトピックを形成し、それを元に文書が生成されていると考えると文書の意味解析ができそうです。<br /> これがトピックモデルの考え方です。</p> </div> <div class="section"> <h4 id="2LDAとは2">2.LDAとは<a href="#f-8b94a2f2" name="fn-8b94a2f2" title="D. M. Blei, A. Y. Ng, and M. I. Jordan. Latent Dirichlet allocation.">*2</a></h4> <p>・Latent Dirichlet Allocationの略。日本語では「潜在ディリクレ分配法」<br /> ・トピックモデルの手法の一つ<br /> ・確率的生成モデル<br /> ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>推定を使う<br /> ・文書はトピックの分布から(複数のトピックから)生成され、トピック分布はDirichlet分布に従う。</p><p> これだけ見ても何もわからないので説明していきます。</p> </div> <div class="section"> <h4 id="3LDAで使う確率分布">3.LDAで使う確率分布</h4> <p>まずLDAで使う確率分布を紹介します。</p> <div class="section"> <h5 id="カテゴリカル分布マルチヌーイ分布">カテゴリカル分布(マルチヌーイ分布)</h5> <p>離散値<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cleft%281%2C2%2C...%2Ck%5Cright%29%3D%7B%5Cbf%20x%7D" alt=" \left(1,2,...,k\right)={\bf x}"/>から1つ選ぶ時にそれぞれの値が選ばれる確率を<img src="https://chart.apis.google.com/chart?cht=tx&chl=%28p_1%2Cp_2%2C...%2Cp_k%29%3D%7B%5Cbf%20p%7D" alt="(p_1,p_2,...,p_k)={\bf p}"/>とした時に次のような分布になります。(例えば目の出る確率が均等に出ないサイコロを振った時の確率)</p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20Cat_%7Bk%7D%5Cleft%28%7B%5Cbf%20x%7D%20%5Cmid%7B%5Cbf%20p%7D%20%5Cright%29%3D%5Cprod_%7Bi%3D1%7D%5Ekp_i%5E%7Bx_i%7D%20%5Ctag%7B1%7D%20%7D" alt="{\displaystyle Cat_{k}\left({\bf x} \mid{\bf p} \right)=\prod_{i=1}^kp_i^{x_i} \tag{1} }"/><br /> 但し、<img src="https://chart.apis.google.com/chart?cht=tx&chl=x_i" alt="x_i"/>は0か1の値で、k個要素の中で1となるのは唯一つだけです。また、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cbf%20p%7D" alt="{\bf p}"/>は確率なので<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20p_i%20%5Cgeq%200%2C%20%5Csum_%7Bi%3D1%7D%5Ek%20p_i%3D1" alt=" p_i \geq 0, \sum_{i=1}^k p_i=1"/>を満たします。</p><p>特に<img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cbf%20x%7D" alt="{\bf x}"/>の中からnが選ばれると言うときは次の表記が出来ますね。 <br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20Cat_k%5Cleft%28x%3Dn%20%5Cmid%7B%5Cbf%20p%7D%20%5Cright%29%3D%5Cprod_%7Bi%3D1%7D%5Ekp_i%5E%7B%5Cdelta_%7Bn%2Ci%7D%7D%20%5Ctag%7B2%7D%20%7D" alt="{\displaystyle Cat_k\left(x=n \mid{\bf p} \right)=\prod_{i=1}^kp_i^{\delta_{n,i}} \tag{2} }"/></p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cdelta_%7Bn%2Ci%7D" alt="\delta_{n,i}"/>はKronecker(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%ED%A5%CD%A5%C3%A5%AB%A1%BC">クロネッカー</a>)のデルタ<a href="#f-2c56a1b5" name="fn-2c56a1b5" title="Kroneckerのデルタ [tex:{\displaystyle \delta_{ij} = \begin{cases} 1 &amp; (i=j) \\ 0 &amp; (i \neq j ) \end{cases} }] ">*3</a>です。</p><p>ちなみにBernoulli(ベルヌーイ)分布の複数事象バージョンなのでMultinoulli(マルチヌーイ)分布と呼ばれることもあります。</p> </div> <div class="section"> <h5 id="Dirichletディリクレ分布">Dirichlet(ディリクレ)分布</h5> <p>k個の独立な事象の中でi番目の事象が<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Calpha_%7Bi%7D-1" alt=" \alpha_{i}-1"/>回起きた場合にその事象の確率が<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Ctheta_i" alt="\theta_i"/>になる確率分布をDirichlet分布と言います。</p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0ADir_k%5Cleft%28%5Ctheta%20%5Cmid%20%5Calpha%20%5Cright%29%3D%5Cfrac%7B%5CGamma%20%5Cleft%28%5Csum_%7Bi%3D1%7D%5Ek%20%5Calpha_i%20%5Cright%29%7D%7B%20%5Cprod%5Ek_%7Bi%3D1%7D%5CGamma%28%5Calpha_i%29%7D%5Cprod_%7Bi%3D1%7D%5Ek%20%5Ctheta_%7Bi%7D%5E%7B%5Calpha_i%20-%201%7D%20%5Ctag%7B3%7D%0A%7D" alt="{\displaystyle Dir_k\left(\theta \mid \alpha \right)=\frac{\Gamma \left(\sum_{i=1}^k \alpha_i \right)}{ \prod^k_{i=1}\Gamma(\alpha_i)}\prod_{i=1}^k \theta_{i}^{\alpha_i - 1} \tag{3} }"/></p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctheta" alt=" \theta"/>は確率なので、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctheta_i%20%5Cgeq%200%2C%20%5Csum_%7Bi%3D1%7D%5Ek%20%5Ctheta_i%3D1" alt=" \theta_i \geq 0, \sum_{i=1}^k \theta_i=1"/> を満たします。</p><p>係数にガンマ関数など色々付いてますが、全事象の確率を1にするための規格化係数なのであまり気にしなくても良いです。</p> </div> </div> <div class="section"> <h4 id="4確率的生成モデル">4.確率的生成モデル</h4> <p>トピックがどのような単語の分布なのか、文書とトピック分布の形などは未知であり、我々が知っているのは文書に出てくる単語だけです。なので、未知変数を確率変数とし文書を生成する過程を記述する事で未知変数を推定します。これを確率的生成モデルと言います。</p><p>LDAでは全ての文書の生成確率を次のようにします。<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20p%28D%5Cmid%5Calpha%2C%5Ceta%29%3D%5Cprod_%7Bd%3D1%7D%5EM%20%5Cint%20Dir_k%28%20%5Ctheta_d%5Cmid%5Calpha%29%5Cprod%5E%7BN_d%7D_%7Bn%3D1%7D%5Csum_%7Bz_%7Bdn%7D%7D%5Ek%5Cint%20p%5Cleft%28z_%7Bdn%7D%5Cmid%5Ctheta_d%20%5Cright%29p%5Cleft%28w_%7Bdn%7D%5Cmid%C2%A0z_%7Bdn%7D%2C%5Cbeta_%7Bz_%7Bdn%7D%7D%5Cright%29p%28%5Cbeta_%7Bz_%7Bdn%7D%7D%5Cmid%5Ceta%29d%5Cbeta_%7Bz_%7Bdn%7D%7Dd%5Ctheta_d%5Ctag%7B4%7D%7D" alt="{\displaystyle p(D\mid\alpha,\eta)=\prod_{d=1}^M \int Dir_k( \theta_d\mid\alpha)\prod^{N_d}_{n=1}\sum_{z_{dn}}^k\int p\left(z_{dn}\mid\theta_d \right)p\left(w_{dn}\mid&nbsp;z_{dn},\beta_{z_{dn}}\right)p(\beta_{z_{dn}}\mid\eta)d\beta_{z_{dn}}d\theta_d\tag{4}}"/></p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=M" alt="M"/>: 文書の数<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20N_d" alt=" N_d"/> : d番目文書に含まれる単語の数<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=k" alt="k"/>:トピックの数<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20D" alt=" D"/>:全ての文書, <img src="https://chart.apis.google.com/chart?cht=tx&chl=D%20%3D%20%5Cleft%28%7B%5Cbf%20w%7D_1%2C%20%7B%5Cbf%20w%7D_2%2C%20...%2C%7B%5Cbf%20w%7D_d%2C%20%7B%5Cbf%20w%7D_%7Bd%2B1%7D%2C...%20%7B%5Cbf%20w%7D_M%5Cright%29" alt="D = \left({\bf w}_1, {\bf w}_2, ...,{\bf w}_d, {\bf w}_{d+1},... {\bf w}_M\right)"/><br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cbf%20w%7D_d" alt="{\bf w}_d"/>: d番目の文書, <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cbf%20w%7D_d%20%3D%20%5Cleft%28w_%7Bd1%7D%2C%20w_%7Bd2%7D%2C%20...%2C%20w_%7Bdn%7D%2Cw_%7Bd%28n%2B1%29%7D%2C...%2Cw_%7BdN_%7Bd%7D%7D%20%5Cright%29" alt="{\bf w}_d = \left(w_{d1}, w_{d2}, ..., w_{dn},w_{d(n+1)},...,w_{dN_{d}} \right)"/><br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=w_%7Bdn%7D" alt="w_{dn}"/> : d番目文書のn番目単語 <br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=z_%7Bdn%7D" alt="z_{dn}"/> : d番目文書のn番目単語のトピック, <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20z_%7Bdn%7D%20%5Cin%20%5C%7B1%2C2%2C...%2Ci%2Ci%2B1%2C...%2Ck%20%5C%7D%20" alt=" z_{dn} \in \{1,2,...,i,i+1,...,k \} "/><br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20V%20" alt=" V "/> : 語彙数(全文書に現れる単語の種類)</p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=Dir_k%5Cleft%28%20%5Ctheta_d%20%5Cmid%20%5Calpha%20%5Cright%29%20" alt="Dir_k\left( \theta_d \mid \alpha \right) "/> : d番目文書のトピック分布の生成</p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=p%5Cleft%28z_%7Bdn%7D%20%5Cmid%20%5Ctheta_d%20%5Cright%29%20" alt="p\left(z_{dn} \mid \theta_d \right) "/>:トピック<img src="https://chart.apis.google.com/chart?cht=tx&chl=z_%7Bdn%7D" alt="z_{dn}"/>の生成分布<br />   ここではこの分布はカテゴリカル分布とする。<br />   <img src="https://chart.apis.google.com/chart?cht=tx&chl=p%5Cleft%28z_%7Bdn%7D%20%5Cmid%20%5Ctheta_d%20%5Cright%29%3DCat_k%5Cleft%28z_%7Bdn%7D%20%5Cmid%20%5Ctheta_d%20%5Cright%29" alt="p\left(z_{dn} \mid \theta_d \right)=Cat_k\left(z_{dn} \mid \theta_d \right)"/></p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=p%5Cleft%28w_%7Bdn%7D%20%5Cmid%20z_%7Bdn%7D%2C%5Cbeta_%7Bz_%7Bdn%7D%7D%20%5Cright%29%20" alt="p\left(w_{dn} \mid z_{dn},\beta_{z_{dn}} \right) "/>:単語<img src="https://chart.apis.google.com/chart?cht=tx&chl=w_%7Bdn%7D" alt="w_{dn}"/>の生成分布<br />   ここではこの分布はカテゴリカル分布とする。<br />   <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20p%5Cleft%28w_%7Bdn%7D%20%5Cmid%20z_%7Bdn%7D%2C%5Cbeta_%7Bz_%7Bdn%7D%7D%20%5Cright%29%3DCat_V%5Cleft%28w_%7Bdn%7D%20%5Cmid%20%5Cbeta_%7Bz_%7Bdn%7D%7D%20%5Cright%29" alt=" p\left(w_{dn} \mid z_{dn},\beta_{z_{dn}} \right)=Cat_V\left(w_{dn} \mid \beta_{z_{dn}} \right)"/></p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=p%5Cleft%28%5Cbeta_%7Bz_%7Bdn%7D%7D%20%5Cmid%20%5Ceta%20%5Cright%29" alt="p\left(\beta_{z_{dn}} \mid \eta \right)"/>:トピック<img src="https://chart.apis.google.com/chart?cht=tx&chl=z_%7Bdn%7D" alt="z_{dn}"/>の単語分布の生成<br />   ここではこの分布もDirichlet分布とする。<br />   <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20p%5Cleft%28%5Cbeta_%7Bz_%7Bdn%7D%7D%20%5Cmid%20%5Ceta%20%5Cright%29%20%3D%20Dir_V%5Cleft%28%5Cbeta_%7Bz_%7Bdn%7D%7D%20%5Cmid%20%5Ceta%20%5Cright%29" alt=" p\left(\beta_{z_{dn}} \mid \eta \right) = Dir_V\left(\beta_{z_{dn}} \mid \eta \right)"/></p><p> </p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Calpha%2C%20%5Ceta" alt="\alpha, \eta"/>がパラメータで実世界の文書を上手く表現するためにはこのパラメータの適切な値が分かれば良いという事になります。</p> </div> <div class="section"> <h4 id="5グラフィカルモデル表現">5.グラフィカルモデル表現</h4> <p> 式(4)では分かりにくいので直感的に理解する為の道具としてグラフィカルモデル表現があります。(LDAではこのグラフィカルモデルの方が有名かも?)</p><p> <figure class="figure-image figure-image-fotolife" title="図2.グラフィカルモデル表現"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180214/20180214101658.png" alt="f:id:tdualdir:20180214101658p:plain" title="f:id:tdualdir:20180214101658p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図2.グラフィカルモデル表現</figcaption></figure></p><br /> <p>円(ノード)がそれぞれ確率分布を表してます。<br /> 黒色に塗りつぶされた円が観測変数の確率分布、白色の円が未知変数の確率分布を表してます。<br /> また矢印元の円が矢印先の条件を表してます。<br /> k,N,Mと名前がついたプレートは変数の数を表してます。これで変数の数だけ矢印を伸ばすのを一回で表現しています。</p><p>(グラフィカルモデル表現のより詳しい解説は<a class="keyword" href="http://d.hatena.ne.jp/keyword/PRML">PRML</a>にあるのでそれを参照してください。)</p><p> </p> </div> <div class="section"> <h4 id="6LDAの解釈">6.LDAの解釈</h4> <p>何をしているかまだ分かりにくいので幾何的な解釈をしてみます。</p><p>簡単のためにこの世に「本」「空気」「読む」という単語しか存在しないとする。<br /> 全ての文書はこの3つの単語の分布から構成されている。<br /> それぞれの生成確率の和は1になるので、文書は(3-1)次元単体(simplex)<a href="#f-34d60474" name="fn-34d60474" title="単体(simplex)  n+1個の位置ベクトル[tex:({\bf v}_1,{\bf v}_2,...,{\bf v}_{n+1}) ]があり、それらの点がどの部分空間にも含まれない時に  [tex: \phi_i] は実数で[tex:\sum_{i=1}^{n+1}\phi_i=1]かつ[tex:\phi_1,\phi_2,...,\phi_{n+1} \geq 0]を満たす[tex: \sum_{i=1}^{n+1}\phi_{i}{\bf v}_{i}]をn次元単体(simplex)という。  0次元が点,1次元が線,2次元が三角形,3次元が四面体というように図形を分割した時の最小単位を表現しており、位相幾何学などでも使われる概念。  Dirichlet分布やカテゴリカル分布は単体を作っている。">*4</a>が上に存在することになる。</p><p><figure class="figure-image figure-image-fotolife" title="図3.単語simplex"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180326/20180326162844.png" alt="f:id:tdualdir:20180326162844p:plain:w200" title="f:id:tdualdir:20180326162844p:plain:w200" class="hatena-fotolife" style="width:200px" itemprop="image"></span><figcaption>図3.単語simplex</figcaption></figure></p><p>自然な文書の分布を取った場合にこの面上に一様に分布するでしょうか?<br /> そんなことは無さそうだと分かります。なぜなら「"本"を"読む"」「"空気"を"読む"」は頻出しそうですが、"本"と"空気"は同じ文書に現れることは稀です。<br /> simpex上で言うならそれぞれの単語軸の値を(本,空気,読む)とするなら、(1/3,1/3,1/3)や(1/2,1/2,0)よりも (1/3,0,2/3)や(0,2/3,1/3)のような値付近に文書は分布するでしょう。</p><p>おそらく図4(a)のような分布になります。<br /> この様な分布の偏りがあるなら低次元で表現できそうです。</p><p>図4(b)の様に単語simplexより低次元のsimplex(赤い線分)で表現できるでしょう。その元をβ1、β2とします。</p><p>このβ1,β2がトピックであり、文書はこの赤い線分上に射影します。LDAはこれを(V-1)次元simplexでやっているのです。</p><p>文書が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%F8%BA%DF%C5%AA">潜在的</a>(Latent)な意味(トピック)で作られるsimplex上に配置(Allocation)されています。これがLDAの名前の由来です。</p><p><figure class="figure-image figure-image-fotolife" title="図4(a). 単語simplex上の文書の分布 図4(b).低次元simplexへの写像"><div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180326/20180326163112.png" alt="f:id:tdualdir:20180326163112p:plain" title="f:id:tdualdir:20180326163112p:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180326/20180326162852.png" alt="f:id:tdualdir:20180326162852p:plain" title="f:id:tdualdir:20180326162852p:plain" class="hatena-fotolife" itemprop="image"></span></div><figcaption>図4(a). 単語simplex上の文書の分布   図4(b).低次元simplexへの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%CC%C1%FC">写像</a></figcaption></figure></p><br /> <p>同じことですが行列分解的な解釈もできます。</p><p>式(4)の中には<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctheta%2C%20%5Cbeta" alt=" \theta, \beta"/>を与えた時にd番目文書のn番目単語の生成確率があります。</p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%5Csum_%7Bz_%7Bdn%7D%7D%5Ek%20p%28z_%7Bdn%7D%20%5Cmid%20%5Ctheta_d%29%20p%28w_%7Bdn%7D%20%5Cmid%20z_%7Bdn%7D%2C%5Cbeta_%7Bz_%7Bdn%7D%7D%29%20%7D" alt="{\displaystyle \sum_{z_{dn}}^k p(z_{dn} \mid \theta_d) p(w_{dn} \mid z_{dn},\beta_{z_{dn}}) }"/></p><p>d番目文書のn番目単語をwとし、わかりやすくするために<img src="https://chart.apis.google.com/chart?cht=tx&chl=z_%7Bdn%7D%3Di" alt="z_{dn}=i"/>とラベルし直す。二つの確率分布がカテゴリカル分布なので、<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%5Csum_%7Bz_%7Bdn%7D%7D%5Ek%20p%28z_%7Bdn%7D%20%5Cmid%20%5Ctheta_d%29%20p%28w_%7Bdn%7D%20%5Cmid%20z_%7Bdn%7D%2C%5Cbeta_%7Bz_%7Bdn%7D%7D%29%20%3D%20%5Csum_%7Bi%7D%5Ek%20%5Ctheta_%7Bdi%7D%5Cbeta_%7Biw%7D%3D%5CTheta%20B%7D" alt="{\displaystyle \sum_{z_{dn}}^k p(z_{dn} \mid \theta_d) p(w_{dn} \mid z_{dn},\beta_{z_{dn}}) = \sum_{i}^k \theta_{di}\beta_{iw}=\Theta B}"/><br /> となります。</p><p>これは図5の様に(M,V)行列が低ランクの(M,i)行列と(i,V)行列に分解していると解釈できます。</p><br /> <p><figure class="figure-image figure-image-fotolife" title="図5.行列分解"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180223/20180223162022.png" alt="f:id:tdualdir:20180223162022p:plain" title="f:id:tdualdir:20180223162022p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図5.行列分解</figcaption></figure></p><p></p> </div> <div class="section"> <h4 id="7経験ベイズEmpirical-Bayes">7.経験<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>(Empirical Bayes)</h4> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Calpha%2C%20%5Ceta" alt="\alpha, \eta"/>を推定したいわけですが、経験<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>で推定したと思います。</p><p>経験<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>とは、データから事前分布を与える方法です。通常、事前分布はデータと関係なく与えるものですが経験<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>ではデータから事前分布のパラメータを推定します。(だから経験的と呼ばれてます。たぶん。)<br /> パラメータを周辺化してしまってその尤度(周辺尤度という)を最大化します。<br /> 周辺尤度は式(4)と同じですが、こんな<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%D1%CA%AC">積分</a>は計算できないので簡単な分布に近似して計算することを考えます。有名な方法にサンプリング法<a href="#f-d65d742f" name="fn-d65d742f" title="崩壊型ギブスサンプリングなど">*5</a>と「変分<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>法」がありますが、今回は変分<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>法を用います。<br /> <br /> </p> </div> <div class="section"> <h4 id="8変分ベイズ法Variational-Bayesian-methods">8.変分<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>法(Variational Bayesian methods)</h4> <p>まず後の議論を分かりやすくするために<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%EF%C0%D1%CA%AC%B4%D8%BF%F4">被積分関数</a>を簡略化して表現します。<br /> また次の様な表記を導入します。</p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Ctheta%3D%5Cleft%28%20%5Ctheta_1%2C%20%5Ctheta_2%2C...%2C%20%5Ctheta_M%5Cright%29%20" alt="\theta=\left( \theta_1, \theta_2,..., \theta_M\right) "/><br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cbeta%3D%5Cleft%28%5Cbeta_1%2C%5Cbeta_2%2C...%2C%5Cbeta_k%5Cright%29%20" alt="\beta=\left(\beta_1,\beta_2,...,\beta_k\right) "/><br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20z%3D%5Cleft%28z_%7B11%7D%2Cz_%7B12%7D%2C...%2Cz_%7B1N_%7B1%7D%7D%2Cz_%7B21%7D%2C.....%2Cz_%7BMN_%7BM%7D%7D%20%5Cright%29%20" alt=" z=\left(z_{11},z_{12},...,z_{1N_{1}},z_{21},.....,z_{MN_{M}} \right) "/><br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20p%5Cleft%28D%2C%20z%2C%20%5Ctheta%2C%20%5Cbeta%20%7C%20%5Calpha%2C%5Ceta%20%5Cright%29%20%3D%20Dir_k%28%20%5Ctheta%20%5Cmid%20%5Calpha%29%20p%5Cleft%28z%20%5Cmid%20%5Ctheta%20%5Cright%29%20p%5Cleft%28D%5Cmid%20z%2C%5Ceta%20%5Cright%29%20Dir_v%5Cleft%28%5Cbeta%20%5Cmid%20%5Ceta%20%5Cright%29" alt=" p\left(D, z, \theta, \beta | \alpha,\eta \right) = Dir_k( \theta \mid \alpha) p\left(z \mid \theta \right) p\left(D\mid z,\eta \right) Dir_v\left(\beta \mid \eta \right)"/></p><p>そして、いつものようにlogを取ります。<a href="#f-372a246f" name="fn-372a246f" title="log関数はアンダーフロー防止が出来て単調増加で滑らかな凸関数なので都合が良い。">*6</a><br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%5Clog%20p%5Cleft%28D%20%5Cmid%20%5Calpha%2C%5Ceta%20%5Cright%29%20%3D%20%5Clog%20%5Csum_z%20%5Cint%20%5Cint%20p%5Cleft%28D%2C%20z%2C%20%5Ctheta%2C%20%5Cbeta%20%7C%20%5Calpha%2C%5Ceta%20%5Cright%29%20d%5Cbeta%20d%5Ctheta%20%20%5Ctag%7B5%7D%7D" alt="{\displaystyle \log p\left(D \mid \alpha,\eta \right) = \log \sum_z \int \int p\left(D, z, \theta, \beta | \alpha,\eta \right) d\beta d\theta \tag{5}}"/></p><p>先にも話したようにこのままでは計算できないので、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20p%5Cleft%28D%2Cz%2C%20%5Ctheta%2C%20%5Cbeta%20%7C%20%5Calpha%2C%5Ceta%20%5Cright%29" alt=" p\left(D,z, \theta, \beta | \alpha,\eta \right)"/>に近いなん<br /> からかの分布を用意します。そのなんらかの分布を<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q%28z%2C%20%5Ctheta%2C%5Cbeta%29" alt=" q(z, \theta,\beta)"/>として周辺尤度に差し込みます。<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%5Clog%20p%28D%20%5Cmid%20%5Calpha%2C%5Ceta%29%20%3D%20%5Clog%20%5Csum_z%20%5Cint%20%5Cint%20q%28z%2C%20%5Ctheta%2C%5Cbeta%29%5Cfrac%7Bp%28D%2C%20z%2C%20%5Ctheta%2C%20%5Cbeta%20%5Cmid%20%5Calpha%2C%5Ceta%29%7D%7Bq%28z%2C%20%5Ctheta%2C%5Cbeta%29%7D%20d%5Cbeta%20d%5Ctheta%20%20%5Ctag%7B6%7D%7D" alt="{\displaystyle \log p(D \mid \alpha,\eta) = \log \sum_z \int \int q(z, \theta,\beta)\frac{p(D, z, \theta, \beta \mid \alpha,\eta)}{q(z, \theta,\beta)} d\beta d\theta \tag{6}}"/><br /> ここでJensenの不等式<a href="#f-94602951" name="fn-94602951" title="Jensenの不等式とは  f(x)が上に凸で、[tex:\int p(x) dx = 1]の時、次の不等式が成り立つ  [tex:{\displaystyle f\left( \int y(x)p(x) dx \right) \ge \int f\left(y(x) \right)p(x) dx}] ">*7</a>を使うと下限が存在することがわかります。</p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%5Clog%20%5Cleft%28%5Csum_z%20%5Cint%20%5Cint%20q%28z%2C%20%5Ctheta%2C%5Cbeta%29%5Cfrac%7Bp%28D%2Cz%2C%20%5Ctheta%2C%20%5Cbeta%20%5Cmid%20%5Calpha%2C%5Ceta%29%7D%7Bq%28z%2C%20%5Ctheta%2C%5Cbeta%29%7Dd%5Cbeta%20d%5Ctheta%20%5Cright%29%20%5Cgeq%20%5Csum_z%20%5Cint%20%5Cint%20q%28z%2C%20%5Ctheta%2C%5Cbeta%29%20%5Clog%20%5Cfrac%7Bp%5Cleft%28D%2C%20z%2C%20%5Ctheta%2C%20%5Cbeta%20%5Cmid%20%5Calpha%2C%5Ceta%20%5Cright%29%7D%7Bq%28z%2C%20%5Ctheta%2C%5Cbeta%29%7Dd%5Cbeta%20d%5Ctheta%20%5Ctag%7B7%7D%7D" alt="{\displaystyle \log \left(\sum_z \int \int q(z, \theta,\beta)\frac{p(D,z, \theta, \beta \mid \alpha,\eta)}{q(z, \theta,\beta)}d\beta d\theta \right) \geq \sum_z \int \int q(z, \theta,\beta) \log \frac{p\left(D, z, \theta, \beta \mid \alpha,\eta \right)}{q(z, \theta,\beta)}d\beta d\theta \tag{7}}"/><br /> この下限を変分下限(Variational Lower Bound)やELBO(Evidence Lower Bound)と言います。(以降この変分下限を<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cmathcal%20L" alt=" \mathcal L"/>と表記します。)</p><p>周辺尤度を大きくしたければ変分下限を最大化すれば良いことが分かります。</p><p> </p> </div> <div class="section"> <h4 id="9平均場近似Mean-field-approximation">9.平均場近似(Mean field approximation)</h4> <p>しかしまだ計算が面倒臭いので思い切って、qをそれぞれのパラメータで独立な確率分布とします。これを平均場近似と言います。</p><p> <img src="https://chart.apis.google.com/chart?cht=tx&chl=q%28z%2C%20%5Ctheta%2C%5Cbeta%29%20%3D%20q%28z%29q%28%20%5Ctheta%29q%28%5Cbeta%29%20%5Ctag%7B8%7D" alt="q(z, \theta,\beta) = q(z)q( \theta)q(\beta) \tag{8}"/></p><p> 但し、確率分布なので全て足し合わせると1になります。<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0A%5Csum_z%20q%28z%29%20%3D%201%2C%20%5Cint%20q%28%5Ctheta%29d%5Ctheta%3D1%2C%20%5Cint%20q%28%5Cbeta%29d%5Cbeta%3D1%20%5Ctag%7B9%7D%0A%7D" alt="{\displaystyle \sum_z q(z) = 1, \int q(\theta)d\theta=1, \int q(\beta)d\beta=1 \tag{9} }"/><br /> これを変分下限<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cmathcal%20L" alt="\mathcal L"/>に代入して最大となる <img src="https://chart.apis.google.com/chart?cht=tx&chl=q%28z%29q%28%5Ctheta%29q%28%5Cbeta%29" alt="q(z)q(\theta)q(\beta)"/>を求めます。 </p> </div> <div class="section"> <h4 id="10変分下限とKullback-Leibler-divergenceとの関係">10.変分下限とKullback-Leibler divergenceとの関係</h4> <p>Kullback–Leibler divergence(カルバック・ライブラー・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%D0%A1%BC%A5%B8%A5%A7%A5%F3%A5%B9">ダイバージェンス</a> 以降、KL divergenceと呼ぶ)<a href="#f-e1d2bc64" name="fn-e1d2bc64" title="  Kullback–Leibler divergenceは確率分布の類似度。  xが連続変数の時, [tex: D_{KL}\left(q(x)\mid p(x) \right)= \int q(x)\log \frac{q(x)}{p(x)}dx ]  xが離散変数の時, [tex: D_{KL}\left(q(x)\mid p(x) \right)= \sum_x q(x)\log \frac{q(x)}{p(x)}]  [tex:q(x)]と[tex:p(x)]が同じ分布である必要十分条件はKL divergenceが0">*8</a>との関係を見るために変分下限を少し式変形します。</p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cbegin%7Balign%7D%20%0A%5Cmathcal%20L%20%26%3D%20%5Csum_z%20%5Cint%20%5Cint%20q%28z%2C%20%5Ctheta%2C%5Cbeta%29%20%5Clog%5Cfrac%7Bp%5Cleft%28D%2Cz%2C%20%5Ctheta%2C%5Cbeta%5Cmid%5Calpha%2C%CE%B7%20%5Cright%29%7D%7Bq%28z%2C%20%5Ctheta%2C%5Cbeta%29%7D%20d%5Cbeta%20d%20%5Ctheta%20%5C%5C%5C%0A%26%3D%5Csum_z%20%5Cint%20%5Cint%20q%28z%2C%20%5Ctheta%2C%5Cbeta%29%C2%A0%20%5Clog%20%5Cfrac%7Bp%5Cleft%28z%2C%20%5Ctheta%2C%5Cbeta%5Cmid%20D%2C%20%5Calpha%2C%CE%B7%20%5Cright%29p%5Cleft%28D%5Cmid%20%5Calpha%2C%CE%B7%20%5Cright%29%7D%7Bq%28z%2C%20%5Ctheta%2C%5Cbeta%29%7D%20%20d%5Cbeta%20d%20%5Ctheta%5C%5C%5C%0A%26%3D%20%5Csum_z%20%5Cint%20%5Cint%20q%28z%2C%20%5Ctheta%2C%5Cbeta%29%C2%A0%20%5Clog%20%5Cfrac%7Bp%5Cleft%28z%2C%20%5Ctheta%2C%5Cbeta%7CD%2C%5Calpha%2C%CE%B7%20%5Cright%29%7D%7Bq%28z%2C%20%5Ctheta%2C%5Cbeta%29%7D%20d%5Cbeta%20d%20%5Ctheta%20%2B%20%5Csum_z%20%5Cint%20%5Cint%20q%28z%2C%20%5Ctheta%2C%5Cbeta%29%20%5Clog%20p%5Cleft%28D%5Cmid%20%5Calpha%2C%CE%B7%20%5Cright%29d%5Ctheta%20d%5Cbeta%5C%5C%5C%0A%26%3D%20-%20D_%7BKL%7D%28q%28z%2C%20%5Ctheta%2C%5Cbeta%29%20%5Cmid%20p%5Cleft%28z%2C%20%5Ctheta%2C%5Cbeta%5Cmid%20D%2C%20%5Calpha%2C%CE%B7%20%5Cright%29%29%20%2B%20%5Clog%C2%A0p%5Cleft%28D%5Cmid%20%5Calpha%2C%CE%B7%20%5Cright%29%20%5Csum_z%20q%28z%29%20%20%5Cint%20q%28%5Cbeta%29%20d%5Cbeta%5Cint%20q%28%20%5Ctheta%29d%20%5Ctheta%20%5C%5C%5C%0A%26%3D%20-%20D_%7BKL%7D%28q%28z%2C%20%5Ctheta%2C%5Cbeta%29%20%7Cp%5Cleft%28z%2C%20%5Ctheta%2C%5Cbeta%5Cmid%20D%2C%20%5Calpha%2C%CE%B7%20%5Cright%29%29%20%2B%20%5Clog%C2%A0p%5Cleft%28D%5Cmid%5Calpha%2C%CE%B7%20%5Cright%29%0A%5Cend%7Balign%7D%20" alt=" \begin{align} \mathcal L &amp;= \sum_z \int \int q(z, \theta,\beta) \log\frac{p\left(D,z, \theta,\beta\mid\alpha,&eta; \right)}{q(z, \theta,\beta)} d\beta d \theta \\\ &amp;=\sum_z \int \int q(z, \theta,\beta)&nbsp; \log \frac{p\left(z, \theta,\beta\mid D, \alpha,&eta; \right)p\left(D\mid \alpha,&eta; \right)}{q(z, \theta,\beta)} d\beta d \theta\\\ &amp;= \sum_z \int \int q(z, \theta,\beta)&nbsp; \log \frac{p\left(z, \theta,\beta|D,\alpha,&eta; \right)}{q(z, \theta,\beta)} d\beta d \theta + \sum_z \int \int q(z, \theta,\beta) \log p\left(D\mid \alpha,&eta; \right)d\theta d\beta\\\ &amp;= - D_{KL}(q(z, \theta,\beta) \mid p\left(z, \theta,\beta\mid D, \alpha,&eta; \right)) + \log&nbsp;p\left(D\mid \alpha,&eta; \right) \sum_z q(z) \int q(\beta) d\beta\int q( \theta)d \theta \\\ &amp;= - D_{KL}(q(z, \theta,\beta) |p\left(z, \theta,\beta\mid D, \alpha,&eta; \right)) + \log&nbsp;p\left(D\mid\alpha,&eta; \right) \end{align} "/></p><p>1項目にKL divergence、2項目に周辺尤度が出てくることに気付きます。</p><p>周辺尤度は<img src="https://chart.apis.google.com/chart?cht=tx&chl=q%28z%29q%28%20%5Ctheta%29q%28%5Cbeta%29" alt="q(z)q( \theta)q(\beta)"/>に依存してないので、変分下限を大きくすることはKL divergenceをなるべく小さくすることに相当します。つまり、用意したなんかよくわからん分布<img src="https://chart.apis.google.com/chart?cht=tx&chl=q%5Cleft%28z%2C%20%5Ctheta%2C%5Cbeta%20%5Cright%29" alt="q\left(z, \theta,\beta \right)"/>を<img src="https://chart.apis.google.com/chart?cht=tx&chl=p%5Cleft%28D%2Cz%2C%20%5Ctheta%2C%20%5Cbeta%20%5Cmid%20%5Calpha%2C%5Ceta%20%5Cright%29" alt="p\left(D,z, \theta, \beta \mid \alpha,\eta \right)"/>に近づけることに他なりません。</p><p> </p> </div> <div class="section"> <h4 id="11変分法Calculus-of-variations">11.<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%D1%CA%AC%CB%A1">変分法</a>(Calculus of variations)</h4> <p>式からわかるように<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cmathcal%20L" alt="\mathcal L"/>は<img src="https://chart.apis.google.com/chart?cht=tx&chl=q%28z%29%2C%20q%28%20%5Ctheta%29%2C%20q%28%5Cbeta%29" alt="q(z), q( \theta), q(\beta)"/>に依存するので次のように書くべきです。<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0A%5Cmathcal%20L%3D%5Cmathcal%20L%5Cleft%28q%28z%29%2Cq%28%20%5Ctheta%29%2Cq%28%5Cbeta%29%20%5Cright%29%20%5Ctag%7B10%7D%0A%7D" alt="{\displaystyle \mathcal L=\mathcal L\left(q(z),q( \theta),q(\beta) \right) \tag{10} }"/><br /> この<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cmathcal%20L%5Cleft%28q%28z%29%2Cq%28%20%5Ctheta%29%2Cq%28%5Cbeta%29%20%5Cright%29" alt="\mathcal L\left(q(z),q( \theta),q(\beta) \right)"/>の様な「関数の関数」のことを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%C6%B4%D8%BF%F4">汎関数</a><a href="#f-a6454cc7" name="fn-a6454cc7" title="汎関数のちゃんとした定義はベクトル空間から体への写像です。">*9</a>といい、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%C6%B4%D8%BF%F4">汎関数</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B6%CB%C3%CD">極値</a>になる時の関数を求める方法を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%D1%CA%AC%CB%A1">変分法</a>と言います。具体的に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%D1%CA%AC%CB%A1">変分法</a>を計算するにはEuler-Lagrange方程式<a href="#f-494337e5" name="fn-494337e5" title="Euler-Lagrange方程式   汎関数を[tex:I\left(x(t),\dot{x}(t) \right) = \int L \left(x(t),\dot{x}(t) \right) dt ]  とした時、(但し、[tex:\dot{x}(t) = \frac{dx(t)}{dt}]) [tex:{\displaystyle \frac{d}{dt}\frac{\partial L}{\partial \dot{x}(t)} -\frac{\partial L}{\partial  x(t)} = 0 }]  (詳細や導出などはPRMLにあった気がする。) ">*10</a>という<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC%CA%FD%C4%F8%BC%B0">微分方程式</a>を使います。ここで、<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0A%5Cmathcal%20L%5Cleft%28q%28z%29%2Cq%28%20%5Ctheta%29%2Cq%28%5Cbeta%29%20%5Cright%29%3D%5Csum_z%5Cint%5Cint%20L%5Cleft%28q%28z%29%2Cq%28%20%5Ctheta%29%2Cq%28%5Cbeta%29%20%5Cright%29d%5Cbeta%20d%5Ctheta%20%5Ctag%7B11%7D%0A%7D" alt="{\displaystyle \mathcal L\left(q(z),q( \theta),q(\beta) \right)=\sum_z\int\int L\left(q(z),q( \theta),q(\beta) \right)d\beta d\theta \tag{11} }"/><br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0AL%5Cleft%28q%28z%29%2Cq%28%20%5Ctheta%29%2Cq%28%5Cbeta%29%20%5Cright%29%20%3D%20q%28z%29q%28%20%5Ctheta%29q%28%5Cbeta%29%20%5Clog%20%5Cfrac%7Bp%5Cleft%28D%2Cz%2C%20%5Ctheta%2C%20%5Cbeta%20%5Cmid%20%5Calpha%2C%5Ceta%20%5Cright%29%7D%7Bq%28z%29q%28%20%5Ctheta%29q%28%5Cbeta%29%7D%20%5Ctag%7B12%7D%0A%7D" alt="{\displaystyle L\left(q(z),q( \theta),q(\beta) \right) = q(z)q( \theta)q(\beta) \log \frac{p\left(D,z, \theta, \beta \mid \alpha,\eta \right)}{q(z)q( \theta)q(\beta)} \tag{12} }"/></p><p>とします。また、確率分布には(9)という拘束条件があるのでLagrangeの未定乗数法<a href="#f-9a584bc1" name="fn-9a584bc1" title="Lagrangeの未定乗数法  xに[tex:g(x) = 0 ]という拘束条件がある場合は定数[tex: \lambda]を使い  [tex:L' = L + \lambda g(x)]  としてL'について解くことで拘束条件の下での変分問題を解くことが出来る。  (この詳細もPRMLに有った気がする。) ">*11</a>よりLは<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0AL%27%20%3D%20L%20%2B%5Clambda_1%5Cleft%28%5Csum_z%20q%28z%29%20-%201%20%5Cright%29%20%2B%20%5Clambda_2%5Cleft%28%5Cint%20q%28%20%5Ctheta%29d%5Ctheta-1%20%5Cright%29%20%2B%5Clambda_3%5Cleft%28%5Cint%20q%28%5Cbeta%29d%5Cbeta-1%20%5Cright%29%20%5Ctag%7B13%7D%0A%7D" alt="{\displaystyle L&#39; = L +\lambda_1\left(\sum_z q(z) - 1 \right) + \lambda_2\left(\int q( \theta)d\theta-1 \right) +\lambda_3\left(\int q(\beta)d\beta-1 \right) \tag{13} }"/><br /> となります。それぞれの確率分布に付いてEuler-Lagrange方程式を書くと</p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q%28%5Ctheta%29" alt=" q(\theta)"/>については<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0A%5Csum_z%20%5Cint%20%5Cfrac%7B%5Cpartial%20L%27%7D%7B%5Cpartial%20q%28%20%5Ctheta%29%7D%20d%5Cbeta%20%3D%200%20%5Ctag%7B14%7D%0A%7D" alt="{\displaystyle \sum_z \int \frac{\partial L&#39;}{\partial q( \theta)} d\beta = 0 \tag{14} }"/></p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q%28%5Cbeta%29" alt=" q(\beta)"/>については<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0A%5Csum_z%20%5Cint%20%5Cfrac%7B%5Cpartial%20L%27%7D%7B%5Cpartial%20q%28%5Cbeta%29%7Dd%20%5Ctheta%20%3D%200%20%5Ctag%7B15%7D%0A%7D" alt="{\displaystyle \sum_z \int \frac{\partial L&#39;}{\partial q(\beta)}d \theta = 0 \tag{15} }"/></p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q%28z%29" alt=" q(z)"/>については<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0A%5Cint%20%5Cint%20%5Cfrac%7B%5Cpartial%20L%27%7D%7B%5Cpartial%20q%28z%29%7D%20d%5Cbeta%20d%5Ctheta%20%3D%200%20%5Ctag%7B16%7D%0A%7D" alt="{\displaystyle \int \int \frac{\partial L&#39;}{\partial q(z)} d\beta d\theta = 0 \tag{16} }"/></p><p>となる。(いずれも関数のパラメータの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC">微分</a>が無いので簡単な式になる。)</p><p>(14)をさらに計算する。</p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0A%5Csum_z%20%5Cint%20q%28z%29q%28%5Cbeta%29%5Clog%20p%28D%2C%20z%2C%20%5Ctheta%2C%20%5Cbeta%20%5Cmid%20%5Calpha%2C%20%5Ceta%29%20d%5Cbeta%20-%20%5Clog%20q%28%5Ctheta%29%20%5Csum_z%20q%28z%29%5Cint%20q%28%5Cbeta%29%20d%5Cbeta%20%2B%20C%20%2B%5Clambda_2%3D%200%0A%7D" alt="{\displaystyle \sum_z \int q(z)q(\beta)\log p(D, z, \theta, \beta \mid \alpha, \eta) d\beta - \log q(\theta) \sum_z q(z)\int q(\beta) d\beta + C +\lambda_2= 0 }"/></p><p>Cは定数</p><p>(例えば、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cint%20q%28%5Cbeta%29%5Clog%20q%28%5Cbeta%29%20d%5Cbeta" alt="\int q(\beta)\log q(\beta) d\beta"/>みたいな式などが出てくるけど<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctheta" alt=" \theta"/>にとっては所詮定数なので全てCにまとめました。<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Clambda_2" alt="\lambda_2"/>もCに入れてしまって、以降すべての定数は値が違ってもCと表記します。)</p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q%28%5Ctheta%29" alt=" q(\theta)"/>について解くと<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0Aq%28%5Ctheta%29%20%3D%20C%5Cexp%5Cleft%28%5Csum_z%20%5Cint%20q%28z%29q%28%5Cbeta%29%5Clog%20p%28D%2C%20z%2C%20%5Ctheta%2C%20%5Cbeta%20%5Cmid%20%5Calpha%2C%20%5Ceta%29%20d%5Cbeta%20%5Cright%29%20%5Ctag%7B14%27%7D%0A%7D" alt="{\displaystyle q(\theta) = C\exp\left(\sum_z \int q(z)q(\beta)\log p(D, z, \theta, \beta \mid \alpha, \eta) d\beta \right) \tag{14&#39;} }"/></p><p>同様に、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q%28%5Cbeta%29" alt=" q(\beta)"/>について解くと<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0Aq%28%5Cbeta%29%20%3D%20C%5Cexp%5Cleft%28%5Csum_z%20%5Cint%20q%28z%29q%28%5Ctheta%29%5Clog%20p%28D%2C%20z%2C%20%5Ctheta%2C%20%5Cbeta%20%5Cmid%20%5Calpha%2C%20%5Ceta%29%20d%5Ctheta%20%5Cright%29%20%5Ctag%7B15%27%7D%0A%7D" alt="{\displaystyle q(\beta) = C\exp\left(\sum_z \int q(z)q(\theta)\log p(D, z, \theta, \beta \mid \alpha, \eta) d\theta \right) \tag{15&#39;} }"/></p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q%28z%29" alt=" q(z)"/>についても解くと<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0Aq%28z%29%20%3D%20C%5Cexp%5Cleft%28%5Cint%20%5Cint%20q%28%5Ctheta%29q%28%5Cbeta%29%5Clog%20p%28D%2C%20z%2C%20%5Ctheta%2C%20%5Cbeta%20%5Cmid%20%5Calpha%2C%20%5Ceta%29%20d%5Cbeta%20d%5Ctheta%20%5Cright%29%20%5Ctag%7B16%27%7D%0A%7D" alt="{\displaystyle q(z) = C\exp\left(\int \int q(\theta)q(\beta)\log p(D, z, \theta, \beta \mid \alpha, \eta) d\beta d\theta \right) \tag{16&#39;} }"/></p><p>また、<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0Ap%5Cleft%28D%2C%20z%2C%20%5Ctheta%2C%20%5Cbeta%20%5Cmid%20%5Calpha%2C%5Ceta%20%5Cright%29%20%3DDir_k%28%20%5Ctheta%20%5Cmid%20%5Calpha%29%20p%5Cleft%28z%20%5Cmid%20%5Ctheta%20%5Cright%29%20p%5Cleft%28D%20%5Cmid%20z%2C%5Ceta%20%5Cright%29%20Dir_v%5Cleft%28%5Cbeta%20%5Cmid%20%5Ceta%20%5Cright%29%0A%7D" alt="{\displaystyle p\left(D, z, \theta, \beta \mid \alpha,\eta \right) =Dir_k( \theta \mid \alpha) p\left(z \mid \theta \right) p\left(D \mid z,\eta \right) Dir_v\left(\beta \mid \eta \right) }"/><br /> だったので(14')をさらに計算すると以下のようになります。</p><p>\begin{align} <br /> q(\theta) &= C\exp\left(\sum_z \int q(z)q(\beta)\log Dir_k( \theta \mid \alpha) d\beta +\sum_z \int q(z)q(\beta)\log p\left(z \mid \theta \right)d\beta \right)\\<br /> &= C\exp\left(\log Dir_k( \theta \mid \alpha) + E_{q(z)}\left[\log p\left(z \mid \theta \right) \right] \right)\\<br /> &=C\exp\left(\sum_{d=1}^M\log \frac{\Gamma \left(\sum_i^k \alpha_i \right)}{\prod^k_i\Gamma(\alpha_i)}\prod_i^k \theta_{di}^{\alpha_i - 1} + E_{q(z)}\left[\log \prod_{d=1}^M\prod_{n=1}^{N_d}p\left(z_{dn} \mid \theta_d \right) \right] \right)\\<br /> &=C\exp\left(\sum_{d=1}^M\log \prod_i^k \theta_{di}^{\alpha_i - 1} + E_{q(z)}\left[\log \prod_{d=1}^M\prod_{n=1}^{N_d}\prod_{i=1}^k \theta_{di}^{\delta_{z_{dn},i}} \right] \right)\\<br /> &=C\exp\left(\sum_{d=1}^M\sum_{i=1}^k\log \theta_{di}^{\alpha_i - 1} + \sum_z\left[q(z)\sum_{d=1}^M\sum_{n=1}^{N_d}\sum_{i=1}^k\delta_{z_{dn},i}\log \theta_{di} \right] \right)\\<br /> &=C\exp\left(\sum_{d=1}^M\sum_{i=1}^k\log \theta_{di}^{\alpha_i - 1} + \sum_{d=1}^M\sum_{i=1}^k\sum_{n=1}^{N_d}q(z_{dn}=i)\log \theta_{di} \right)\\<br /> &=C\exp\left(\sum_{d=1}^M\sum_{i=1}^k\log \theta_{di}^{\alpha_i - 1} + \sum_{d=1}^M\sum_{i=1}^k\log \theta_{di}^{\sum_{n=1}^{N_d}q(z_{dn}=i)} \right)\\<br /> &=C\prod_{d=1}^M\prod_{i=1}^k \theta_{di}^{\alpha_i+\sum_{n=1}^{N_d}q(z_{dn}=i)-1}\\<br /> &=\prod_{d=1}^M Dir_k( \theta_d\mid\gamma_d)<br /> \end{align}</p><p>但し、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cgamma_d%3D%28%5Cgamma_%7Bd1%7D%2C%5Cgamma_%7Bd2%7D%2C...%2C%5Cgamma_%7Bdk%7D%29" alt="\gamma_d=(\gamma_{d1},\gamma_{d2},...,\gamma_{dk})"/>,<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0A%5Cgamma_%7Bdi%7D%3D%5Calpha_i%2B%5Csum_%7Bn%3D1%7D%5E%7BN_d%7Dq%28z_%7Bdn%7D%3Di%29%20%5Ctag%7B17%7D%0A%7D" alt="{\displaystyle \gamma_{di}=\alpha_i+\sum_{n=1}^{N_d}q(z_{dn}=i) \tag{17} }"/><br /> 3行目から4行目への変換はDirichlet分布の係数をCに入れてしまいました。また、</p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=p%5Cleft%28z_%7Bdn%7D%20%5Cmid%20%5Ctheta_d%20%5Cright%29" alt="p\left(z_{dn} \mid \theta_d \right)"/>がカテゴリカル分布なので、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20p%5Cleft%28z_%7Bdn%7D%20%5Cmid%20%5Ctheta_d%20%5Cright%29%20%3Dprod_%7Bi%3D1%7D%5Ek%20p%5Cleft%28z_%7Bdn%7D%3Di%20%5Cmid%20%5Ctheta_d%20%5Cright%29%3D%5Cprod_%7Bi%3D1%7D%5Ek%20%5Ctheta_%7Bdi%7D%5E%7B%5Cdelta_%7Bz_%7Bdn%7D%2Ci%7D%7D%20" alt=" p\left(z_{dn} \mid \theta_d \right) =prod_{i=1}^k p\left(z_{dn}=i \mid \theta_d \right)=\prod_{i=1}^k \theta_{di}^{\delta_{z_{dn},i}} "/>となる。</p><p>また、最後の式は規格化するようにCを選びました。</p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=q%28%5Ctheta%29" alt="q(\theta)"/>はDirichlet分布になりました。</p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=q%28%5Cbeta%29" alt="q(\beta)"/>の(13')に付いても計算すると、</p><p>\begin{align} <br /> q(\beta) &= C\exp\left( \sum_z \int q(x) q(\theta) \log p(D\mid z,\beta)d\theta + \log Dir_v(\beta \mid η) \right)\\<br /> &=C\exp\left(E_{q(z)}\left[\log p(D\mid z,\beta) \right]+\log \prod_{i=1}^k Dir_v(\beta_i\mid η) \right)\\<br /> &=C\exp\left(E_{q(z)}\left[\log \prod_{d=1}^M\prod_{n=1}^{N_{d}} p(w_{dn} \mid z_{dn},\beta_{z_{dn}})\right]+\sum_{i=1}^k\log \frac{\Gamma \left(\sum_{w}^{V}η_{w} \right)}{\prod^{V}_{w}\Gamma(η_{w})}\prod_{w=1}^{V}\beta_{iw}^{η_{w} - 1} \right)\\<br /> &=C\exp\left(E_{q(z)}\left[\log \prod_{d=1}^M\prod_{n=1}^{N_{d}}\prod_{i=1}^k\beta_{iw_{dn}}^{\delta_{z_{dn},i}} \right]+\sum_{i=1}^k\sum_{w=1}^V\log\beta_{iw}^{η_w - 1} \right)\\<br /> &=C\exp\left(\sum_zq(z)\sum_{d=1}^M\sum_{n=1}^{N_{d}}\sum_{i=1}^k\delta_{z_{dn},i}\log\beta_{iw_{dn}}+\sum_{i=1}^k\sum_{w=1}^V\log\beta_{iw}^{η_w - 1} \right)\\<br /> &=C\exp\left(\sum_{d=1}^M\sum_{n=1}^{N_{d}}\sum_{i=1}^kq(z_{dn}=i)\log\beta_{iw_{dn}}+\sum_{i=1}^k\sum_{w=1}^V\log\beta_{iw}^{η_w - 1} \right)\\<br /> &=C\exp\left(\sum_{d=1}^M\sum_{n=1}^{N_{d}}\sum_{i=1}^k\sum_{w=1}^V\delta_{w, w_{dn}}q(z_{dn}=i)\log\beta_{iw}+\sum_{i=1}^k\sum_{w=1}^V\log\beta_{iw}^{η_w - 1} \right)\\<br /> &=C\exp\left(\sum_{i=1}^k\sum_{w=1}^V\log\beta_{iw}^{\sum_{d=1}^M\sum_{n=1}^{N_{d}}\delta_{w, w_{dn}}q(z_{dn}=i)}+\sum_{i=1}^k\sum_{w=1}^V\log\beta_{iw}^{η_w - 1} \right)\\<br /> &=C\prod_{i=1}^k\prod_{w=1}^V\beta_{iw}^{η_w+\sum_{d=1}^M\sum_{n=1}^{N_{d}}\delta_{w, w_{dn}}q(z_{dn}=i)-1}\\<br /> &=\prod_{i=1}^kDir_{V}\left(\beta_i\mid\lambda \right)<br /> \end{align} </p><p>但し、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Clambda%3D%28%5Clambda_1%2C%5Clambda_2%2C...%2C%5Clambda_V%29" alt="\lambda=(\lambda_1,\lambda_2,...,\lambda_V)"/>,<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0A%5Clambda_w%3D%CE%B7_w%2B%5Csum_%7Bd%3D1%7D%5EM%5Csum_%7Bn%3D1%7D%5E%7BN_%7Bd%7D%7D%5Cdelta_%7Bw%2C%20w_%7Bdn%7D%7Dq%28z_%7Bdn%7D%3Di%29%20%5Ctag%7B18%7D%0A%7D" alt="{\displaystyle \lambda_w=&eta;_w+\sum_{d=1}^M\sum_{n=1}^{N_{d}}\delta_{w, w_{dn}}q(z_{dn}=i) \tag{18} }"/><br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=q%28%5Cbeta%29" alt="q(\beta)"/>もDirechlet分布になりました。</p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=q%28z%29" alt="q(z)"/>の(16')についても計算すると、</p><p>\begin{align} <br /> q(z) &= C\exp\left(\int \int q(\theta)q(\beta)\log p(D, z, \theta,\beta\mid\alpha,η)d\beta d\theta \right)\\<br /> &=C\exp\left(\int \int q( \theta)q(\beta)(\log p(z\mid \theta)+\log p(D\mid z,\beta)) \right)\\<br /> &=C\exp\left(E_{q(\theta)}\left[\log p(z\mid \theta) \right] +E_{q(\beta)}\left[\log p(D \mid z,\beta) \right] \right)\\<br /> &=C\exp\left(E_{q( \theta)}\left[\log\prod_{d=1}^M\prod_{n=1}^{N_{d}} \theta_{dz_{dn}}) \right] +E_{q(\beta)}\left[\log\prod_{d=1}^M\prod_{n=1}^{N_{d}}\beta_{z_{dn}w_{dn}} \right] \right)\\<br /> &=C\prod_{d=1}^M\prod_{n=1}^{N_d}\exp\left(E_{q( \theta)}\left[\log \theta_{dz_{dn}} \right]+E_{q(\beta)}\left[\log\beta_{z_{dn}w_{dn}} \right] \right)\\<br /> &=C\prod_{d=1}^M\prod_{n=1}^{N_d}\exp\left(\int q( \theta)\log \theta_{dz_{dn}}d \theta+\int q(\beta)\log\beta_{z_{dn}w_{dn}}d\beta \right)\\<br /> &=C\prod_{d=1}^M\prod_{n=1}^{N_d}\exp\left(\prod_{d'=1}^M\int Dir_k( \theta_{d'}\mid\gamma_{d'}) \log \theta_{dz_{dn}}d \theta_{d'}+\prod_{i=1}^{k}\int \log Dir_{V}(\beta_i\mid\lambda)\log\beta_{z_{dn}w_{dn}}d\beta_i \right)\\<br /> &=C\prod_{d=1}^M\prod_{n=1}^{N_d}\exp\left(\int Dir_k( \theta_{d}\mid\gamma_{d}) \log \theta_{dz_{dn}}d \theta_{d}+\int \log Dir_{V}(\beta_{z_{dn}}\mid\lambda)\log\beta_{z_{dn}w_{dn}}d\beta_{z_{dn}} \right)<br /> \end{align} </p><p>ここで確率密度がDirechlet分布の時の公式を導入します。<br /> i番目変数の対数の期待は次のように書けます。<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0A%5Cint%20Dir_k%28%20%5Ctheta%5Cmid%5Calpha%29%5Clog%20%5Ctheta_i%20d%20%5Ctheta%20%3D%20%5CPsi%5Cleft%28%5Calpha_i%20%5Cright%29-%5CPsi%5Cleft%28%5Csum_%7Bi%3D1%7D%5Ek%5Calpha_i%20%5Cright%29%20%5Ctag%7B19%7D%0A%7D" alt="{\displaystyle \int Dir_k( \theta\mid\alpha)\log \theta_i d \theta = \Psi\left(\alpha_i \right)-\Psi\left(\sum_{i=1}^k\alpha_i \right) \tag{19} }"/><br /> 但し、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5CPsi%28x%29" alt="\Psi(x)"/>はディガンマと呼ばれ、ガンマ関数のログの一階<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC">微分</a>です。<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5CPsi%28x%29%3D%5Cfrac%7Bd%5Clog%5CGamma%28x%29%7D%7Bdx%7D" alt="\Psi(x)=\frac{d\log\Gamma(x)}{dx}"/></p><p>(17)を使いq(z)をさらに計算すると<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0Aq%28z%29%3DC%5Cprod_%7Bd%3D1%7D%5EM%5Cprod_%7Bn%3D1%7D%5E%7BN_d%7D%5Cexp%5Cleft%28%5CGamma%5Cleft%28%5Cgamma_%7Bd%20z_%7Bdn%7D%7D%20%5Cright%29-%5CGamma%5Cleft%28%5Csum_%7Bi%3D1%7D%5Ek%5Cgamma_%7Bdi%7D%20%5Cright%29%20%2B%5CGamma%5Cleft%28%5Clambda_%7Bz_%7Bdn%7Dw_%7Bdn%7D%7D%20%5Cright%29-%5CGamma%5Cleft%28%5Csum_%7Bw%3D1%7D%5EV%5Clambda_%7Bz_%7Bdn%7Dw%7D%20%5Cright%29%20%5Cright%29%0A%7D" alt="{\displaystyle q(z)=C\prod_{d=1}^M\prod_{n=1}^{N_d}\exp\left(\Gamma\left(\gamma_{d z_{dn}} \right)-\Gamma\left(\sum_{i=1}^k\gamma_{di} \right) +\Gamma\left(\lambda_{z_{dn}w_{dn}} \right)-\Gamma\left(\sum_{w=1}^V\lambda_{z_{dn}w} \right) \right) }"/><br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=q%28z%29%20%3DC%5Cprod_%7Bd%3D1%7D%5EM%5Cprod_%7Bn%3D1%7D%5E%7BN_d%7D%5Cprod_%7Bi%3D1%7D%5Ekq%28z_%7Bdn%7D%3Di%29" alt="q(z) =C\prod_{d=1}^M\prod_{n=1}^{N_d}\prod_{i=1}^kq(z_{dn}=i)"/>とすると、<br /> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0Aq%28z_%7Bdn%7D%3Di%29%3D%5Cexp%5Cleft%28%5CPsi%5Cleft%28%5Cgamma_%7Bd%20i%7D%20%5Cright%29-%5CPsi%5Cleft%28%5Csum_%7Bj%3D1%7D%5Ek%5Cgamma_%7Bdj%7D%20%5Cright%29%20%2B%5CPsi%5Cleft%28%5Clambda_%7Biw_%7Bdn%7D%7D%20%5Cright%29-%5CPsi%5Cleft%28%5Csum_%7Bw%3D1%7D%5EV%5Clambda_%7Biw%7D%20%5Cright%29%20%5Cright%29%20%5Ctag%7B20%7D%0A%7D" alt="{\displaystyle q(z_{dn}=i)=\exp\left(\Psi\left(\gamma_{d i} \right)-\Psi\left(\sum_{j=1}^k\gamma_{dj} \right) +\Psi\left(\lambda_{iw_{dn}} \right)-\Psi\left(\sum_{w=1}^V\lambda_{iw} \right) \right) \tag{20} }"/></p><p>(17),(18),(20)より</p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cgamma_%7Bdi%7D" alt=" \gamma_{di}"/>,<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Clambda_w" alt="\lambda_w"/>をランダムに初期化した後に<img src="https://chart.apis.google.com/chart?cht=tx&chl=q%28z_%7Bdn%7D%3Di%29" alt="q(z_{dn}=i)"/>を求めて、その<img src="https://chart.apis.google.com/chart?cht=tx&chl=q%28z_%7Bdn%7D%3Di%29" alt="q(z_{dn}=i)"/>を使って<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cgamma_%7Bdi%7D" alt="\gamma_{di}"/>,<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Clambda_w" alt="\lambda_w"/>を更新する。これを繰り返す事で、適切な<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cgamma_%7Bdi%7D" alt="\gamma_{di}"/>,<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Clambda_w" alt="\lambda_w"/>,<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q%28z_%7Bdn%7D%3Di%29" alt=" q(z_{dn}=i)"/>が求まり、そこから<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Calpha%2C%20%5Ceta" alt="\alpha, \eta"/>が求まります。</p><p> </p> </div> <div class="section"> <h4 id="12パープレキシティーPerplexity">12.パープレキシ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C6%A5%A3%A1%BC">ティー</a>(Perplexity)</h4> <p>パラメータを推定するコードを書く前にモデルの性能の評価指標を紹介します。</p><p>Perplexityという指標です。テスト用の文書数を<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20M_%7Btest%7D" alt=" M_{test}"/>、各文書の長さを<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20N_d%5E%7Btest%7D" alt=" N_d^{test}"/>、文書セットを <img src="https://chart.apis.google.com/chart?cht=tx&chl=D_%7Btest%7D%3D%28%7B%5Cbf%20w%7D_%7B1%7D%5E%7Btest%7D%2C%7B%5Cbf%20w%7D_%7B2%7D%5E%7Btest%7D%2C...%2C%7B%5Cbf%20w%7D_%7BM_%7Btest%7D%7D%5E%7Btest%7D%29" alt="D_{test}=({\bf w}_{1}^{test},{\bf w}_{2}^{test},...,{\bf w}_{M_{test}}^{test})"/>,文書を<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%7B%5Cbf%20w%7D_d%5E%7Btest%7D%3D%28w_%7Bd1%7D%5E%7Btest%7D%2C%20w_%7Bd2%7D%5E%7Btest%7D%2C...%2Cw_%7BdN_d%5E%7Btest%7D%7D%5E%7Btest%7D%29%20" alt=" {\bf w}_d^{test}=(w_{d1}^{test}, w_{d2}^{test},...,w_{dN_d^{test}}^{test}) "/>とすると次の式で表現されます。</p><p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0APerplexity%28D_%7Btest%7D%29%3D%5Cexp%5Cleft%28-%20%5Cfrac%7B%5Csum_%7Bd%3D1%7D%5E%7BM_%7Btest%7D%7D%5Csum_%7Bn%3D1%7D%5E%7BN_d%5E%7Btest%7D%7D%5Clog%20p%28w_%7Bdn%7D%5E%7Btest%7D%29%7D%7B%5Csum_%7Bd%3D1%7D%5E%7BM_%7Btest%7D%7DN_d%5E%7Btest%7D%7D%20%5Cright%29%20%5Ctag%7B21%7D%0A%7D" alt="{\displaystyle Perplexity(D_{test})=\exp\left(- \frac{\sum_{d=1}^{M_{test}}\sum_{n=1}^{N_d^{test}}\log p(w_{dn}^{test})}{\sum_{d=1}^{M_{test}}N_d^{test}} \right) \tag{21} }"/></p><p>この式だけ見るとわかりにくいですが、ちょっと式変形をすると</p><p>\begin{align} <br /> Perplexity(D_{test}) &= \left(\exp\left(-\sum_{d=1}^{M_{test}}\sum_{n=1}^{N_d^{test}}\log p(w_{dn}^{test}) \right) \right)^{\frac{1}{ \sum_{d=1}^{M_{test}}N_{d}^{test} }}\\<br /> &= \left(\prod_{d=1}^{M_{test}}\prod_{n=1}^{N_d^{test}}\frac{1}{p(w_{dn}^{test})} \right)^{\frac{1}{ \sum_{d=1}^{M_{test}}N_{d}^{test} }}\tag{22}<br /> \end{align} </p><p>となります。これは単語の生成確率 <img src="https://chart.apis.google.com/chart?cht=tx&chl=p%28w_%7Bdn%7D%5E%7Btest%7D%29" alt="p(w_{dn}^{test})"/>の逆数の幾何平均になっていることがわかります。</p><p>そして単語の生成確率の逆数は選択肢の数を表しています。(例えば、<img src="https://chart.apis.google.com/chart?cht=tx&chl=p%28w_%7Bdn%7D%5E%7Btest%7D%29%3D%5Cfrac%7B1%7D%7B1000%7D" alt="p(w_{dn}^{test})=\frac{1}{1000}"/>とかの場合は1000個の単語の中から選ぶ事を意味してるので。)<br /> ですので、ランダム場合はPerprexityは出現単語数<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Csum_%7Bd%3D1%7D%5E%7BM_%7Btest%7D%7DN_%7Bd%7D%5E%7Btest%7D" alt=" \sum_{d=1}^{M_{test}}N_{d}^{test}"/>になり、完全に予測できるなら1になります。</p><p>ランダムに単語を生成するのではなく文書に現れる単語を限られた単語の中から選ぶ方が良いモデル(汎化性能が高い)だと言えるのでPerplexityが小さいほど良いモデル(汎化性能が高い)だと言えます。</p><p> </p> </div> </div> <div class="section"> <h3 id="実践">実践</h3> <div class="section"> <h4 id="データセットと前処理gensim使わないバージョン">デー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%BB%A5%C3%A5%C8">タセット</a>と前処理(gensim使わないバージョン)</h4> <div class="section"> <h5 id="データセットの取得">デー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%BB%A5%C3%A5%C8">タセット</a>の取得</h5> <p>デー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%BB%A5%C3%A5%C8">タセット</a>として、<a href="https://www.rondhuit.com/download.html#ldcc">livedoor &#x30CB;&#x30E5;&#x30FC;&#x30B9;&#x30B3;&#x30FC;&#x30D1;&#x30B9;</a>を使います。<br /> デー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%BB%A5%C3%A5%C8">タセット</a>をダウンロードして解凍しましょう。</p> <pre class="code" data-lang="" data-unlink>wget https://www.rondhuit.com/download/ldcc-20140209.tar.gz tar xvzf ldcc-20140209.tar.gz</pre> </div> <div class="section"> <h5 id="前処理用モジュールをインストール">前処理用モジュールをインストール</h5> <p>日本語は単語ごとに分ける作業(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%AC%A4%AB%A4%C1%BD%F1%A4%AD">分かち書き</a>)をしなければなりません。今回は<a href="http://taku910.github.io/mecab/">MeCab</a>という<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B7%C1%C2%D6%C1%C7%B2%F2%C0%CF">形態素解析</a>ツールを使います。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>では<a class="keyword" href="http://d.hatena.ne.jp/keyword/brew">brew</a>でインストール出来ます。</p> <pre class="code" data-lang="" data-unlink>brew install mecab mecab-ipadic </pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/MeCab">MeCab</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B7%C1%C2%D6%C1%C7%B2%F2%C0%CF">形態素解析</a>に辞書を使っています。<a class="keyword" href="http://d.hatena.ne.jp/keyword/MeCab">MeCab</a>にも辞書は付いているのですが、日本語の新語や<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%C7%CD%AD%C3%CD">固有値</a>表現に強いNEologdという辞書を使う事をオススメします。<br /> インストールしましょう。</p> <pre class="code" data-lang="" data-unlink>git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git cd mecab-ipadic-neologd ./bin/install-mecab-ipadic-neologd -n</pre><p>これらを<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>から使うためのモジュールをインストールします。</p> <pre class="code" data-lang="" data-unlink>pip install mecab-python3</pre><p>また、この後に使う必要なモジュールもインストールしときます。</p> <pre class="code" data-lang="" data-unlink>pip install scipy numpy</pre> </div> <div class="section"> <h5 id="前処理">前処理</h5> <p>準備が出来たので<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>で前処理をしていきましょう。</p><p>▪️やること</p><p> 1. データの確認</p><p> 2. <a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%AC%A4%AB%A4%C1%BD%F1%A4%AD">分かち書き</a></p><p> 3. 必要な単語だけを抽出(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%C8%A5%C3%A5%D7%A5%EF%A1%BC%A5%C9">ストップワード</a>除外など)</p><p> 4. 数値化</p><p>まずは、必要モジュールをインポートします。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> itertools <span class="synPreProc">import</span> random <span class="synPreProc">import</span> MeCab <span class="synPreProc">from</span> urllib <span class="synPreProc">import</span> request <span class="synPreProc">from</span> pathlib <span class="synPreProc">import</span> Path <span class="synPreProc">import</span> re <span class="synPreProc">import</span> numpy <span class="synStatement">as</span> np <span class="synPreProc">from</span> scipy.special <span class="synPreProc">import</span> digamma </pre><p><br /> 1.データの確認</p><p>データを"./text"のパスに解凍したとします。</p> <pre class="code lang-python" data-lang="python" data-unlink>doc_path = <span class="synConstant">&quot;./text/&quot;</span> doc_dir = Path(doc_path) dirs = [i <span class="synStatement">for</span> i <span class="synStatement">in</span> doc_dir.iterdir() <span class="synStatement">if</span> i.is_dir()] <span class="synIdentifier">print</span>(dirs) articles = [a <span class="synStatement">for</span> categ <span class="synStatement">in</span> dirs <span class="synStatement">for</span> a <span class="synStatement">in</span> categ.iterdir()] <span class="synIdentifier">print</span>(articles[:<span class="synConstant">3</span>]) num_docs = <span class="synIdentifier">len</span>(articles) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;# of docs:&quot;</span>, num_docs) </pre><p>出力</p> <pre>[PosixPath('text/movie-enter'), PosixPath('text/it-life-hack'), PosixPath('text/kaden-channel'), PosixPath('text/topic-news'), PosixPath('text/<a class="keyword" href="http://d.hatena.ne.jp/keyword/livedoor">livedoor</a>-homme'), PosixPath('text/peachy'), PosixPath('text/sports-<a class="keyword" href="http://d.hatena.ne.jp/keyword/watch">watch</a>'), PosixPath('text/dokujo-tsushin'), PosixPath('text/smax')] [PosixPath('text/movie-enter/movie-enter-5978741.txt'), PosixPath('text/movie-enter/movie-enter-6322901.txt'), PosixPath('text/movie-enter/movie-enter-6176324.txt')] # of docs: 7376 </pre><p>カテゴリーごとに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リが別れていて、その下にtxtファイルのニュース記事が入っています。<br /> 記事の数は7376ですね。</p><p>記事の中身を確認します。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synStatement">class</span> <span class="synIdentifier">Doc_manager</span>(): <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self, docs): self.docs = docs <span class="synStatement">def</span> <span class="synIdentifier">read_doc</span>(self, doc_id): <span class="synStatement">with</span> self.docs[doc_id].open() <span class="synStatement">as</span> f: <span class="synIdentifier">print</span>(f.read()) dm = Doc_manager(articles) dm.read_doc(<span class="synConstant">0</span>) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;=================&quot;</span>) dm.read_doc(<span class="synConstant">1</span>) </pre><p>出力</p> <pre><a href="http://news.livedoor.com/article/detail/5978741/">http://news.livedoor.com/article/detail/5978741/</a> 2011-10-30T10:15:00+0900 【DVDエンター!】誘拐犯に育てられた女が目にした真実は、孤独か幸福か  2005年11月から翌2006年7月まで読売新聞にて連載された、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C4%BE%CC%DA%BE%DE">直木賞</a>作家・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%D1%C5%C4%B8%F7%C2%E5">角田光代</a>による初の長編サスペンス『八日目の蝉』。2010年に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C3%C9%A4%EC%A4%A4">檀れい</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CB%CC%C7%B5%A4%AD%A4%A4">北乃きい</a>の出演によりテレビドラマ化された同作が、2011年4月に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%CA%BA%EE%C7%EE%C8%FE">永作博美</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B0%E6%BE%E5%BF%BF%B1%FB">井上真央</a>の出演によって映画化。そして、劇場公開から半年が過ぎた10月28日、DVD&ブルーレイとなって発売されました。 八日目の蝉  妻子ある男と愛し合い、その子を身ごもりながら、あきらめざるをえなかった女。彼女は同時に、男の妻が子供を産んだことを知る。その赤ん坊を見に行った女は、突発的にその子を連れ去り、逃避行を続けた挙句、小豆島に落ち着き、母と娘として暮らしはじめる。 不倫相手の子供を誘拐し、4年間育てた女  <a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%CA%BA%EE%C7%EE%C8%FE">永作博美</a>が演じる野々宮希和子は、不倫相手の子を宿しながらも、彼の「いずれ妻と別れるから、それまで待ってくれ」という常套句を信じて、中絶。後遺症により、二度と子供を産めない身体となってしまいます。その後、不倫相手から彼の妻が出産したことを知らされ、別れを決意。最後に諦めをつけるため、彼らの生後6ヶ月の赤ん坊・恵理菜の顔を見た希和子でしたが、自分に笑顔で向けた恵理菜を見て、思わず誘拐。名前を変えて恵理菜を薫と名付けると、人目を避けて各地を転々とし、二人で幸せな時間を過ごしますが、辿り着いた最後の場所・小豆島で4年の逃避行に終止符を打ちます。 誘拐犯に育てられた女  4歳になって実の両親と再会を果たした後も、世間から言われの無い中傷を受け、本当の両親との関係を築けないまま、21歳の大学生へと成長した恵理菜。過去と向き合うことを避けてきた恵理菜でしたが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B7%E0%C3%C4%A4%D2%A4%C8%A4%EA">劇団ひとり</a>が演じる不倫相手・岸田孝史の子を宿し、ずっと憎み続けてきた希和子と同じ道を歩んでいることに気付いた彼女は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%AE%C3%D3%B1%C9%BB%D2">小池栄子</a>が演じる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EB%A5%DD%A5%E9%A5%A4%A5%BF%A1%BC">ルポライター</a>・安藤千草と共に、4年間の逃亡生活を追憶する旅に出ます。希和子との幸せだった時間に触れながら、最終地・小豆島に辿り着いた恵理菜が見た真実とは? 八日目の蝉は幸せなのだろうか?  蝉は俗説として、一生の大半を幼虫として地下で費やし、地上に出て羽化からわずか1週間程度で死ぬと言われています。八日目まで生き残ってしまった蝉が目にしたのは、孤独か、あるいは誰も目にすることのできなかった世界なのでしょうか。中絶によって二度と子供を埋めない身体になった希和子が、恵理菜と過ごした4年間の“八日目”は、希和子だけでなく、恵理菜にとっても幸せな時間だったのではないでしょうか。  主題歌は、デビュー10年目に突入した2010年10月より、耳管開放症のため音楽活動を休止していた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C3%E6%C5%E7%C8%FE%B2%C5">中島美嘉</a>の復帰第一弾(通算33作目)シングル『Dear』。原作に深い感銘を受けた彼女が、本作のために提供した楽曲となっています。 ・八日目の蝉 - 作品情報 八日目の蝉 通常版 [DVD]posted with amazlet at 11.10.29<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%DF%A5%E5%A1%BC%A5%BA%A5%BD%A5%D5%A5%C8%A5%A8%A5%F3%A5%BF%A5%C6%A5%A4%A5%F3%A5%E1%A5%F3%A5%C8">アミューズソフトエンタテインメント</a> (2011-10-28) 売り上げランキング: 266 Amazon.co.jp で詳細を見る ■関連記事 ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B0%E6%BE%E5%BF%BF%B1%FB">井上真央</a>が逃避行?永作、森口、小池も頭を悩ます映画とは ================= <a href="http://news.livedoor.com/article/detail/6322901/">http://news.livedoor.com/article/detail/6322901/</a> 2012-02-29T11:45:00+0900 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%A3%B8%B6%CE%B5%CC%E9">藤原竜也</a>、中学生とともにロケット打ち上げに成功  「アンテナを張りながら生活をしていけばいい」  2月28日、映画『<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%AA%A4%AB%A4%A8%A4%EA%A1%A2%A4%CF%A4%E4%A4%D6%A4%B5">おかえり、はやぶさ</a>』(3月10日より公開)と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%B8%C9%F4%B2%CA%B3%D8%BE%CA">文部科学省</a>とのタイアップとして、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%E9%C2%E5%C5%C4%B6%E8">千代田区</a>立神田一橋中学校に通う中学三年生と“宇宙”をテーマにした特別授業を行った。本作で主演を務める<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%A3%B8%B6%CE%B5%CC%E9">藤原竜也</a>がサプライズで登場し、イベントを盛り上げた。  イベントの挨拶で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%FC%C2%BC%C5%B8%BB%B0">奥村展三</a>文部科学<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C9%FB%C2%E7%BF%C3">副大臣</a>は「みなさんは大きな夢を持っているということで、実現するために、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%B8%C9%F4%B2%CA%B3%D8%BE%CA">文部科学省</a>も環境を作り応援していますので、チャレンジ精神で頑張ってください。」と参加した生徒たちにエールを送った。  今回の特別授業は、2部制で行われた。第1部では、ロケットの中はどうなっているのか、発射した時の音の大きさなど、ロケットの不思議を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%FC%CB%DC%B1%A7%C3%E8%BE%AF%C7%AF%C3%C4">日本宇宙少年団</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/JAXA">JAXA</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%A7%C3%E8%B9%D2%B6%F5%B8%A6%B5%E6%B3%AB%C8%AF%B5%A1%B9%BD">宇宙航空研究開発機構</a>)が説明。参加した生徒は興味深く授業を受けていた。講義の最後に藤原が登場すると、何も知らなかった生徒から大きな歓声が上がり、会場はさらに盛り上がった。  第2部では、藤原も参加し、生徒とともにアルコールロケットを発射させた。ロケットと同じ原理で飛ばすことで、さらに理解を深めるというもの。実際の燃料は水素と酸素だが、今回は、水素が危険を伴うためアルコールで代用。発射させたアルコールロケットが見事にくす玉に命中すると、中から“祝! 卒業「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%AA%A4%AB%A4%A8%A4%EA%A1%A2%A4%CF%A4%E4%A4%D6%A4%B5">おかえり、はやぶさ</a>」大ヒット祈願”という垂れ幕が登場した。参加した生徒132名との記念撮影も行われ、驚きと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%BF%B4%EE">歓喜</a>の中、イベントは終了した。  藤原から今回のイベントについてコメントも届いている。 ——『<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%AA%A4%AB%A4%A8%A4%EA%A1%A2%A4%CF%A4%E4%A4%D6%A4%B5">おかえり、はやぶさ</a>』完成しましたね。 藤原:素敵な映画ができました。今日集まってくれているのは中学三年生ということで、卒業を控えて大変なこともたくさんあると思います。でも諦めず前に進んでください。 ——久しぶりの学校だと思いますが、いかがですか? 藤原:学校ってこんなに寒かったっけ?(笑)でも、そんな寒い中を友達と遊んだ事を思いだし、興奮しています。 ——藤原さんは宇宙に興味がありましたか? 藤原:かなり興味があります。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%E4%A4%D6%A4%B5">はやぶさ</a>もリアルタイムで見たり調べたりしていましたし、宇宙だけでなく、生物や生命体にも興味がありました。往復7年間、60億キロの宇宙の旅を、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%E4%A4%D6%A4%B5">はやぶさ</a>は帰ってきたんですけど、今回、本作に出演しなければわからなかった、<a class="keyword" href="http://d.hatena.ne.jp/keyword/JAXA">JAXA</a>の人達のすごく大変な苦労を知ることができました。僕も含め普通の人だったらこんな絶望的な出来事は諦めてしまと思いますが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/JAXA">JAXA</a>の人達は、数センチ、数ミリの希望を奇跡的にキャッチすることで帰還させたわけですから、すごいことですよね。 ——主演された役は夢と希望を持った役でしたが、中学三年生のみなさんと通じるところはありますか? 藤原:すごくあると思います。映画の中で「成功とは意欲を失わずに、失敗に次ぐ失敗を繰りかえすことである。」という<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A6%A5%A3%A5%F3%A5%B9%A5%C8%A5%F3%A1%A6%A5%C1%A5%E3%A1%BC%A5%C1%A5%EB">ウィンストン・チャーチル</a>の言葉があるんですが、まさに多くの経験をして失敗をしてもらって、意欲を失わないで次に繋げるということは、通じるところだと思います。 ——藤原さんの中学三年生の時の夢は何でしたか? 藤原:僕はずっとサッカーしかしていませんでした。勉強もろくにやらなくて、学校へは給食を食べに行っているだけでした(笑)。サッカー選手になりたかったんですが、ある時に演劇の世界に入ることになり、気が付いたら演劇の世界に引っ張られていました。みなさんもどこでどんな道が待っているかわからないので、アンテナを張りながら生活をしていけばいいと思います。あとは、自分を変えたりするのは人との出会いだと思うので、たくさんの人と出会って、たくさん恋愛もして(笑)。楽に楽しく過ごすことが大事ですよね。 ——日本の宇宙開発プロジェクトに今後期待することは? 藤原:日本の開発技術はアジアで1位でなくてはいけないという大変な状況の中で、多くの国民に希望を与えてくれた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%E4%A4%D6%A4%B5">はやぶさ</a>ですから、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%E4%A4%D6%A4%B52">はやぶさ2</a>号機に関しても、もっともっと国民一人一人が応援していければ、活気がでるんじゃないかなと思います。 ——最後に一言お願いします。 藤原:<a class="keyword" href="http://d.hatena.ne.jp/keyword/JAXA">JAXA</a>の奇跡の物語を実感できますし、もう一つのテーマの、家族や仲間の絆というところもありますので、たくさんのみなさんに観てもらって、もっと宇宙へ興味を持ってもらいたいです。そして夢へ向かって少し光を射してくれるような映画になっていればいいなと思っています。  本作は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/JAXA">JAXA</a>の協力のもと、2011年6月13日に約60億キロの飛行の末、地球へと帰還した<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%AE%CF%C7%C0%B1">小惑星</a>探査機“<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%E4%A4%D6%A4%B5">はやぶさ</a>”にまつわるさまざまなエピソードを3D映画化したもの。出演には、藤原を始め、杏、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BB%B0%B1%BA%CD%A7%CF%C2">三浦友和</a>、まえだまえだの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%B0%C5%C4%B2%A2%BB%D6%CF%BA">前田旺志郎</a>など各年代のキャストが勢揃いし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%E4%A4%D6%A4%B5">はやぶさ</a>と人々の冒険の旅を描く。  映画『<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%AA%A4%AB%A4%A8%A4%EA%A1%A2%A4%CF%A4%E4%A4%D6%A4%B5">おかえり、はやぶさ</a>』は、3月10日(土)より3D&2D同時公開。 ・映画『<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%AA%A4%AB%A4%A8%A4%EA%A1%A2%A4%CF%A4%E4%A4%D6%A4%B5">おかえり、はやぶさ</a>』 - 作品情報 【関連記事】 ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%A3%B8%B6%CE%B5%CC%E9">藤原竜也</a>、杏ら日本の俳優のスケールでは宇宙に行けない ・「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%E4%A4%D6%A4%B5">はやぶさ</a>」のグルメ登場! <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%A6%A4%CA%BD%C5">うな重</a>にカレーにケーキまで </pre><p>1行目がURLで2行目が投稿日時になっているのがわかります。<br /> これらはあまり意味が無いので、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%AC%A4%AB%A4%C1%BD%F1%A4%AD">分かち書き</a>の処理をする前に1行目と2行目を抜きます。</p><p>2.<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%AC%A4%AB%A4%C1%BD%F1%A4%AD">分かち書き</a></p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/MeCab">MeCab</a>とNEologdを使ってみます。</p> <pre class="code lang-python" data-lang="python" data-unlink>mecab = MeCab.Tagger(<span class="synConstant">&quot;-Ochasen -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/&quot;</span>) w = mecab.parse(<span class="synConstant">&quot;認めたくないものだな。自分自身の若さ故の過ちというものを。&quot;</span>) <span class="synIdentifier">print</span>(w) </pre><p>出力</p> <pre>認め ミトメ 認める 動詞-自立 一段 連用形 たく タク たい 助動詞 特殊・タイ 連用テ接続 ない ナイ ない 助動詞 特殊・ナイ 基本形 もの モノ もの 名詞-非自立-一般 だ ダ だ 助動詞 特殊・ダ 基本形 な ナ な 助詞-終助詞 。 。 。 記号-句点 自分自身 ジブンジシン 自分自身 名詞-固有名詞-一般 の ノ の 助詞-連体化 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%E3%A4%B5%B8%CE%A4%CE%B2%E1%A4%C1">若さ故の過ち</a> ワカサユエノアヤマチ <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%E3%A4%B5%B8%CE%A4%CE%B2%E1%A4%C1">若さ故の過ち</a> 名詞-固有名詞-一般 という トイウ という 助詞-格助詞-連語 もの モノ もの 名詞-非自立-一般 を ヲ を 助詞-格助詞-一般 。 。 。 記号-句点 EOS </pre><p>上手く分けられてますね。</p><p>実はNEologdはかなり多くの分野の固有名詞や新語をカバーしているので次のような有名な(?)アニメのフレーズにも対応してます。</p> <pre class="code lang-python" data-lang="python" data-unlink>w = mecab.parse(<span class="synConstant">&quot;今日も一日がんばるぞい&quot;</span>) <span class="synIdentifier">print</span>(w) </pre><p>出力</p> <pre><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BA%A3%C6%FC%A4%E2%B0%EC%C6%FC%A4%AC%A4%F3%A4%D0%A4%EB%A4%BE%A4%A4">今日も一日がんばるぞい</a> キョウモイチニチガンバルゾイ <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BA%A3%C6%FC%A4%E2%B0%EC%C6%FC%A4%AC%A4%F3%A4%D0%A4%EB%A4%BE%A4%A4">今日も一日がんばるぞい</a> 名詞-固有名詞-一般 EOS </pre><p>3. 必要な単語だけを抽出(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%C8%A5%C3%A5%D7%A5%EF%A1%BC%A5%C9">ストップワード</a>除外など)</p><p>文書の中にはその文書の意味を表現しない単語も存在しています。<br /> 例えば、「あそこ」とか「あれ」や「わたし」や「あなた」などはどの文書にも同等に出てきそうですね。これらの単語は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%C8%A5%C3%A5%D7%A5%EF%A1%BC%A5%C9">ストップワード</a>と呼ばれ除外処理をかけます。</p><p>日本語の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%C8%A5%C3%A5%D7%A5%EF%A1%BC%A5%C9">ストップワード</a>は検索すればいくらでも出てきますし、HTTPリク<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>トで取得などでも取得できます。</p> <pre class="code lang-python" data-lang="python" data-unlink>res = request.urlopen(<span class="synConstant">&quot;http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/Japanese.txt&quot;</span>) stopwords = [line.decode(<span class="synConstant">&quot;utf-8&quot;</span>).strip() <span class="synStatement">for</span> line <span class="synStatement">in</span> res] <span class="synIdentifier">print</span>(<span class="synIdentifier">len</span>(stopwords)) <span class="synIdentifier">print</span>(stopwords[:<span class="synConstant">3</span>]) </pre><p>出力</p> <pre>330 ['あそこ', 'あたり', 'あちら'] </pre><p>330個の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%C8%A5%C3%A5%D7%A5%EF%A1%BC%A5%C9">ストップワード</a>がありますね。<br /> また日本語の特徴ですが、かなりの頻度で英単語も出てきます。なので英語の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%C8%A5%C3%A5%D7%A5%EF%A1%BC%A5%C9">ストップワード</a>も使いましょう。</p> <pre class="code lang-python" data-lang="python" data-unlink>res = request.urlopen(<span class="synConstant">&quot;http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/English.txt&quot;</span>) stopwords += [line.decode(<span class="synConstant">&quot;utf-8&quot;</span>).strip() <span class="synStatement">for</span> line <span class="synStatement">in</span> res] <span class="synIdentifier">print</span>(<span class="synIdentifier">len</span>(stopwords)) <span class="synIdentifier">print</span>(stopwords[-<span class="synConstant">3</span>:]) </pre><p>出力</p> <pre>910 ["you've", 'z', 'zero'] </pre><p>ここまで出来たら、必要な単語だけを抽出する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A1%BC%A5%AF">トーク</a>ナイザーを作りましょう。 </p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synStatement">class</span> <span class="synIdentifier">Tokenizer</span>: <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self, stopwords, parser=<span class="synIdentifier">None</span>, include_pos=<span class="synIdentifier">None</span>, exclude_posdetail=<span class="synIdentifier">None</span>, exclude_reg=<span class="synIdentifier">None</span>): self.stopwords = stopwords self.include_pos = include_pos <span class="synStatement">if</span> include_pos <span class="synStatement">else</span> [<span class="synConstant">&quot;名詞&quot;</span>, <span class="synConstant">&quot;動詞&quot;</span>, <span class="synConstant">&quot;形容詞&quot;</span>] self.exclude_posdetail = exclude_posdetail <span class="synStatement">if</span> exclude_posdetail <span class="synStatement">else</span> [<span class="synConstant">&quot;接尾&quot;</span>, <span class="synConstant">&quot;数&quot;</span>] self.exclude_reg = exclude_reg <span class="synStatement">if</span> exclude_reg <span class="synStatement">else</span> <span class="synConstant">r&quot;$^&quot;</span> <span class="synComment"># no matching reg</span> <span class="synStatement">if</span> parser: self.parser = parser <span class="synStatement">else</span>: mecab = MeCab.Tagger(<span class="synConstant">&quot;-Ochasen -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/&quot;</span>) self.parser = mecab.parse <span class="synStatement">def</span> <span class="synIdentifier">tokenize</span>(self, text, show_pos=<span class="synIdentifier">False</span>): text = re.sub(<span class="synConstant">r&quot;https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+&quot;</span>, <span class="synConstant">&quot;&quot;</span>, text) <span class="synComment">#URL</span> text = re.sub(<span class="synConstant">r&quot;\&quot;?([-a-zA-Z0-9.`?{}]+\.jp)\&quot;?&quot;</span> ,<span class="synConstant">&quot;&quot;</span>, text) <span class="synComment"># xxx.jp </span> text = text.lower() l = [line.split(<span class="synConstant">&quot;</span><span class="synSpecial">\t</span><span class="synConstant">&quot;</span>) <span class="synStatement">for</span> line <span class="synStatement">in</span> self.parser(text).split(<span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>)] res = [ i[<span class="synConstant">2</span>] <span class="synStatement">if</span> <span class="synStatement">not</span> show_pos <span class="synStatement">else</span> (i[<span class="synConstant">2</span>],i[<span class="synConstant">3</span>]) <span class="synStatement">for</span> i <span class="synStatement">in</span> l <span class="synStatement">if</span> <span class="synIdentifier">len</span>(i) &gt;=<span class="synConstant">4</span> <span class="synComment"># has POS.</span> <span class="synStatement">and</span> i[<span class="synConstant">3</span>].split(<span class="synConstant">&quot;-&quot;</span>)[<span class="synConstant">0</span>] <span class="synStatement">in</span> self.include_pos <span class="synStatement">and</span> i[<span class="synConstant">3</span>].split(<span class="synConstant">&quot;-&quot;</span>)[<span class="synConstant">1</span>] <span class="synStatement">not</span> <span class="synStatement">in</span> self.exclude_posdetail <span class="synStatement">and</span> <span class="synStatement">not</span> re.search(<span class="synConstant">r&quot;(-|−)\d&quot;</span>, i[<span class="synConstant">2</span>]) <span class="synStatement">and</span> <span class="synStatement">not</span> re.search(self.exclude_reg, i[<span class="synConstant">2</span>]) <span class="synStatement">and</span> i[<span class="synConstant">2</span>] <span class="synStatement">not</span> <span class="synStatement">in</span> self.stopwords ] <span class="synStatement">return</span> res t = Tokenizer(stopwords, mecab.parse, exclude_reg=<span class="synConstant">r&quot;\d(年|月|日)&quot;</span>) </pre><p>処理としては<br /> URLを除き、<br /> 英単語は全て小文字に変え、<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%AC%A4%AB%A4%C1%BD%F1%A4%AD">分かち書き</a>をして、<br /> 必要な品詞の単語だけを抽出し、<br /> ニュース記事なので年月日は除いて、<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%C8%A5%C3%A5%D7%A5%EF%A1%BC%A5%C9">ストップワード</a>の単語を除いています。</p><p>必要な単語は扱うデー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%BB%A5%C3%A5%C8">タセット</a>によって変わるので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A1%BC%A5%AF">トーク</a>ナイザーは適宜作る必要があります。(これも抽出された単語などを見たりしてかなり試行錯誤しました。)</p><p>また、この先に実装するパラメータの推定のコードではメモリの事を考慮してないのであまり大きなデータは扱えません。(涙)<br /> なので、今回は50記事だけ扱いましょう。(ニュース記事レコメンドの実装では全部の記事を使います。)</p> <pre class="code lang-python" data-lang="python" data-unlink>articles = articles[:<span class="synConstant">50</span>] </pre><p>文書を読み込んで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A1%BC%A5%AF">トーク</a>ナイザーで処理をしましょう。</p> <pre class="code lang-python" data-lang="python" data-unlink>docs = [] <span class="synStatement">for</span> a <span class="synStatement">in</span> articles: <span class="synStatement">with</span> a.open() <span class="synStatement">as</span> f: f.readline() f.readline() docs.append(t.tokenize(f.read())) </pre><p>先に話したように1行目と2行目を抜いています。(これもデー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%BB%A5%C3%A5%C8">タセット</a>によって変わることですね。)</p><p>4. 数値化</p><p>計算で扱えるように単語の数値化しましょう。</p><p>いろんなやり方がありますが、ここでは出現順に番号を振っていくシンプルな方法にします。(あとでもっと便利なモジュール(gensim)でのやり方も紹介します。)</p> <pre class="code lang-python" data-lang="python" data-unlink>vocab = <span class="synIdentifier">set</span>(w <span class="synStatement">for</span> d <span class="synStatement">in</span> docs <span class="synStatement">for</span> w <span class="synStatement">in</span> d) word2id = <span class="synIdentifier">dict</span>(<span class="synIdentifier">zip</span>(vocab, itertools.count())) id2word = <span class="synIdentifier">dict</span>(<span class="synIdentifier">list</span>(<span class="synIdentifier">enumerate</span>(vocab))) corpus = [] <span class="synStatement">for</span> d <span class="synStatement">in</span> docs: corpus.append([word2id[w] <span class="synStatement">for</span> w <span class="synStatement">in</span> d]) random.shuffle(corpus) </pre> </div> </div> <div class="section"> <h4 id="学習パラメータの推定">学習(パラメータの推定)</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%D1%CA%AC%CB%A1">変分法</a>で(15),(16),(18)を導出して、推定方法を導いたのでコードを書きます。<br /> まず、訓練データとテストデータに分けます。</p> <pre class="code lang-python" data-lang="python" data-unlink>test_size = <span class="synIdentifier">int</span>(<span class="synIdentifier">len</span>(corpus) * <span class="synConstant">0.2</span>) test_corpus = corpus[:test_size] train_corpus = corpus[test_size:] </pre> <div class="section"> <h5 id="Perplexity">Perplexity</h5> <p>まずは評価するためにPerplexityのコードは次のようになりますね。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synStatement">def</span> <span class="synIdentifier">get_per</span>(corpus, alpha, eta, n_itr=<span class="synConstant">100</span>): perplexity = <span class="synConstant">0.0</span> N = <span class="synConstant">0</span> <span class="synStatement">for</span> d <span class="synStatement">in</span> corpus: N += <span class="synIdentifier">len</span>(d) <span class="synStatement">for</span> _ <span class="synStatement">in</span> <span class="synIdentifier">range</span>(n_itr): theta = np.array([np.random.dirichlet(a) <span class="synStatement">for</span> a <span class="synStatement">in</span> alpha]) beta = np.array([np.random.dirichlet(e) <span class="synStatement">for</span> e <span class="synStatement">in</span> eta.T]) m = np.inner(theta, beta.T) log_p = <span class="synConstant">0.0</span> <span class="synStatement">for</span> i, d <span class="synStatement">in</span> <span class="synIdentifier">enumerate</span>(corpus): log_p += np.log(m[i][d]).sum() perplexity += np.exp(-log_p/N) perplexity = perplexity/n_itr <span class="synStatement">return</span> perplexity </pre><p>テスト用の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A1%BC%A5%D1%A5%B9">コーパス</a>と<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Calpha%2C%5Ceta" alt=" \alpha,\eta"/>を入れるとperplexityを返します。</p> </div> <div class="section"> <h5 id="推定のコード">推定のコード</h5> <p>訓練用の文書数、語彙数、トピック数を設定します。</p> <pre class="code lang-python" data-lang="python" data-unlink>M = <span class="synIdentifier">len</span>(train_corpus) V = <span class="synIdentifier">len</span>(vocab) k = <span class="synConstant">10</span> </pre><p>トピック数はハイパーパラメータなので今回は適当に10に設定します。</p><p>そして、推定のコードですが、愚直に書くと以下のようになります。</p> <pre class="code lang-python" data-lang="python" data-unlink>gamma_ = np.random.rand(M, k) lambda_ = np.random.rand(V, k) q_ = np.random.rand(M,V,k) <span class="synStatement">for</span> itr <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">50</span>): <span class="synStatement">for</span> d <span class="synStatement">in</span> <span class="synIdentifier">range</span>(M): doc = train_corpus[d] N_d = <span class="synIdentifier">len</span>(doc) <span class="synStatement">for</span> n <span class="synStatement">in</span> <span class="synIdentifier">range</span>(N_d): gamma_sum = gamma_.sum(axis=<span class="synConstant">1</span>) lambda_sum = lambda_.sum(axis=<span class="synConstant">0</span>) w = <span class="synIdentifier">int</span>(doc[n]) q_[d,w] = np.exp(digamma(gamma_[d]) - digamma(gamma_sum)[d] + digamma(lambda_[w]) - digamma(lambda_sum)) q_ = q_/q_.sum() gamma_[d] += q_.sum(axis=<span class="synConstant">1</span>)[d] lambda_[w] += q_.sum(axis=<span class="synConstant">0</span>)[w] alpha = gamma_ - q_.sum(axis=<span class="synConstant">1</span>) eta = lambda_ - q_.sum(axis=<span class="synConstant">0</span>) perplexity = get_per(test_corpus, alpha, eta, n_itr=<span class="synConstant">200</span>) <span class="synIdentifier">print</span>(itr, <span class="synConstant">&quot;: &quot;</span>, perplexity) </pre><p>コードはすごい短いですがちゃんと学習してることがわかります。<br /> 出力</p> <pre>0 : 5674.503062673437 1 : 5584.766914247157 2 : 5511.157678168981 3 : 5458.629214717671 4 : 5418.940672207456 5 : 5379.257701873946 6 : 5328.143392841107 7 : 5297.88857102558 8 : 5264.242833398944 9 : 5235.628752569887 10 : 5199.703462080557 11 : 5156.645192115948 12 : 5123.23351388193 13 : 5092.54674403159 14 : 5050.536784773745 15 : 5018.391691114887 16 : 4985.750386617771 17 : 4945.832561518353 18 : 4906.42566531194 19 : 4868.334885573498 20 : 4842.070715295144 21 : 4802.508475658399 22 : 4753.586082804895 23 : 4719.6031370937 24 : 4682.7992544631115 25 : 4645.03757931315 26 : 4604.155215611624 27 : 4567.416380723154 28 : 4532.778039892515 29 : 4490.754145540746 30 : 4454.957132518847 31 : 4424.7972241131565 32 : 4384.09769409566 33 : 4357.054906748676 34 : 4326.873841218807 35 : 4292.199106543804 36 : 4270.729563402634 37 : 4239.36314904691 38 : 4218.57396129725 39 : 4203.02290208137 40 : 4185.588207515016 41 : 4178.228522783321 42 : 4171.95975328867 43 : 4159.8373245942 44 : 4161.101756829013 45 : 4170.555677440166 46 : 4173.87798817788 47 : 4191.880166832307 48 : 4210.302445744775 49 : 4227.922383412469 </pre><p>また、テストデータの出現単語数を調べます。</p> <pre class="code lang-python" data-lang="python" data-unlink>N = <span class="synConstant">0</span> <span class="synStatement">for</span> d <span class="synStatement">in</span> test_corpus: N += <span class="synIdentifier">len</span>(d) <span class="synIdentifier">print</span>(N) </pre><p>出力</p> <pre>4906 </pre><p>ランダムだとPerplexityは出現単語数と一致する事を思い出すと、出現単語数より小さくなっているのでちゃんと学習できたことがわかりますね。<br /> 途中からPerplexityが大きくなって<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%E1%B3%D8%BD%AC">過学習</a>をしているので本来は途中で学習をやめるべきでした。</p><p>上手く学習できているのでこれを使ってニュース記事レコメンドを作りたいのですが、この推定法はあまり精度が出ないことが知られています。<a href="#f-f054e6bf" name="fn-f054e6bf" title=" T. L. Griffiths and M. Steyvers. Finding scientific topics.">*12</a><br /> また、同じ変分<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%BA">ベイズ</a>を使いオンライン学習を可能にしたOnlineLDAという実装<a href="#f-28715f56" name="fn-28715f56" title="Matthew D. Hoffman,David M. Blei,Francis Bach Online Learning for Latent Dirichlet Allocation">*13</a>もあり、そちらの方が精度が良いです。<br /> さらに実装に当たってはメモリのことや速度のことも考えなければなりません。<br /> なのでだいたいどういう事をしているのか理解は出来たと思うので、ここからは人類の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BD%B8%B9%E7%C3%CE">集合知</a>の恩恵を受ける事にしてgensimというライブラリを使います。(gensimのLDAはOnlineLDA実装です。)</p> </div> </div> <div class="section"> <h4 id="gensim">gensim</h4> <p>公式サイト<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fradimrehurek.com%2Fgensim%2F" title="gensim: topic modelling for humans" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://radimrehurek.com/gensim/">radimrehurek.com</a></cite></p><p>800以上の商用・アカデミックアプリケーションで使われている<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%AF%A5%C8%A5%EB%B6%F5%B4%D6%A5%E2%A5%C7%A5%EB">ベクトル空間モデル</a>、トピックモデル用の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>ライブラリです。<br /> 公式サイトにはtopic modeling for humansと書いてますが、トピックモデル以外の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%AB%C1%B3%B8%C0%B8%EC%BD%E8%CD%FD">自然言語処理</a>に関わる様々な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%EB%A5%B4%A5%EA%A5%BA%A5%E0">アルゴリズム</a>を試すことが出来ます。(word2vec, doc2vec,fasttextなどなど)</p><p>また、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%E9%A5%A4%A5%EA%A1%BC">オライリー</a>の『ハイパフォーマンス<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>』の中で開発者のŘehůřekさんがgensimの開発の際(主にword2vec)の最適化についてインタビューを受けているので興味ある人は読んでみてください。</p><p>インストールはpipで出来ます。</p> <pre class="code" data-lang="" data-unlink>pip install gensim</pre> </div> <div class="section"> <h4 id="ニュース記事レコメンド">ニュース記事レコメンド</h4> <p><a href="https://www.rondhuit.com/download.html#ldcc">livedoor &#x30CB;&#x30E5;&#x30FC;&#x30B9;&#x30B3;&#x30FC;&#x30D1;&#x30B9;</a>のニュース記事1つを選んだ時に似た記事をレコメンドするエンジンを作ります。<br /> gensimを使います。</p> <div class="section"> <h5 id="必要なモジュールのインポート">必要なモジュールのインポート</h5> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> urllib <span class="synPreProc">import</span> request <span class="synPreProc">import</span> logging <span class="synPreProc">from</span> pathlib <span class="synPreProc">import</span> Path <span class="synPreProc">import</span> numpy <span class="synStatement">as</span> np <span class="synPreProc">import</span> re <span class="synPreProc">import</span> MeCab <span class="synPreProc">import</span> random <span class="synPreProc">from</span> gensim <span class="synPreProc">import</span> corpora, models </pre> </div> <div class="section"> <h5 id="前処理with-gensim">前処理(with gensim)</h5> <p>数値化する前までは基本的には上で紹介した方法と同じです。</p> <pre class="code lang-python" data-lang="python" data-unlink>res = request.urlopen(<span class="synConstant">&quot;http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/Japanese.txt&quot;</span>) stopwords = [line.decode(<span class="synConstant">&quot;utf-8&quot;</span>).strip() <span class="synStatement">for</span> line <span class="synStatement">in</span> res] res = request.urlopen(<span class="synConstant">&quot;http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/English.txt&quot;</span>) stopwords += [line.decode(<span class="synConstant">&quot;utf-8&quot;</span>).strip() <span class="synStatement">for</span> line <span class="synStatement">in</span> res] <span class="synStatement">class</span> <span class="synIdentifier">Tokenizer</span>: <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self, stopwords, parser=<span class="synIdentifier">None</span>, include_pos=<span class="synIdentifier">None</span>, exclude_posdetail=<span class="synIdentifier">None</span>, exclude_reg=<span class="synIdentifier">None</span>): self.stopwords = stopwords self.include_pos = include_pos <span class="synStatement">if</span> include_pos <span class="synStatement">else</span> [<span class="synConstant">&quot;名詞&quot;</span>, <span class="synConstant">&quot;動詞&quot;</span>, <span class="synConstant">&quot;形容詞&quot;</span>] self.exclude_posdetail = exclude_posdetail <span class="synStatement">if</span> exclude_posdetail <span class="synStatement">else</span> [<span class="synConstant">&quot;接尾&quot;</span>, <span class="synConstant">&quot;数&quot;</span>] self.exclude_reg = exclude_reg <span class="synStatement">if</span> exclude_reg <span class="synStatement">else</span> <span class="synConstant">r&quot;$^&quot;</span> <span class="synComment"># no matching reg</span> <span class="synStatement">if</span> parser: self.parser = parser <span class="synStatement">else</span>: mecab = MeCab.Tagger(<span class="synConstant">&quot;-Ochasen -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/&quot;</span>) self.parser = mecab.parse <span class="synStatement">def</span> <span class="synIdentifier">tokenize</span>(self, text, show_pos=<span class="synIdentifier">False</span>): text = re.sub(<span class="synConstant">r&quot;https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+&quot;</span>, <span class="synConstant">&quot;&quot;</span>, text) <span class="synComment">#URL</span> text = re.sub(<span class="synConstant">r&quot;\&quot;?([-a-zA-Z0-9.`?{}]+\.jp)\&quot;?&quot;</span> ,<span class="synConstant">&quot;&quot;</span>, text) <span class="synComment"># xxx.jp </span> text = text.lower() l = [line.split(<span class="synConstant">&quot;</span><span class="synSpecial">\t</span><span class="synConstant">&quot;</span>) <span class="synStatement">for</span> line <span class="synStatement">in</span> self.parser(text).split(<span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>)] res = [ i[<span class="synConstant">2</span>] <span class="synStatement">if</span> <span class="synStatement">not</span> show_pos <span class="synStatement">else</span> (i[<span class="synConstant">2</span>],i[<span class="synConstant">3</span>]) <span class="synStatement">for</span> i <span class="synStatement">in</span> l <span class="synStatement">if</span> <span class="synIdentifier">len</span>(i) &gt;=<span class="synConstant">4</span> <span class="synComment"># has POS.</span> <span class="synStatement">and</span> i[<span class="synConstant">3</span>].split(<span class="synConstant">&quot;-&quot;</span>)[<span class="synConstant">0</span>] <span class="synStatement">in</span> self.include_pos <span class="synStatement">and</span> i[<span class="synConstant">3</span>].split(<span class="synConstant">&quot;-&quot;</span>)[<span class="synConstant">1</span>] <span class="synStatement">not</span> <span class="synStatement">in</span> self.exclude_posdetail <span class="synStatement">and</span> <span class="synStatement">not</span> re.search(<span class="synConstant">r&quot;(-|−)\d&quot;</span>, i[<span class="synConstant">2</span>]) <span class="synStatement">and</span> <span class="synStatement">not</span> re.search(self.exclude_reg, i[<span class="synConstant">2</span>]) <span class="synStatement">and</span> i[<span class="synConstant">2</span>] <span class="synStatement">not</span> <span class="synStatement">in</span> self.stopwords ] <span class="synStatement">return</span> res t = Tokenizer(stopwords + [<span class="synConstant">&quot;…。&quot;</span>] , mecab.parse, exclude_reg=<span class="synConstant">r&quot;\d(年|月|日)&quot;</span>) </pre><pre class="code lang-python" data-lang="python" data-unlink>doc_path = <span class="synConstant">&quot;./text/&quot;</span> doc_dir = Path(doc_path) dirs = [i <span class="synStatement">for</span> i <span class="synStatement">in</span> doc_dir.iterdir() <span class="synStatement">if</span> i.is_dir()] articles = [a <span class="synStatement">for</span> categ <span class="synStatement">in</span> dirs <span class="synStatement">for</span> a <span class="synStatement">in</span> categ.iterdir()] random.shuffle(articles) <span class="synStatement">class</span> <span class="synIdentifier">Doc_manager</span>(): <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self, docs): self.docs = docs <span class="synStatement">def</span> <span class="synIdentifier">read_doc</span>(self, doc_id): <span class="synStatement">with</span> self.docs[doc_id].open() <span class="synStatement">as</span> f: <span class="synIdentifier">print</span>(f.read()) dm = Doc_manager(articles) </pre><pre class="code lang-python" data-lang="python" data-unlink>docs = [] <span class="synStatement">for</span> a <span class="synStatement">in</span> articles: <span class="synStatement">with</span> a.open() <span class="synStatement">as</span> f: f.readline() f.readline() docs.append(tokenize(f.read())) </pre><p>ここからgensimを使います。gensimにはcorpora.Dictionaryという単語とIDの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%C3%A5%D4%A5%F3%A5%B0">マッピング</a>を扱う便利なツールが用意されています。</p> <pre class="code lang-python" data-lang="python" data-unlink>d = corpora.Dictionary(docs) </pre><p>使い方は以下の様になります。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synIdentifier">print</span>(d[<span class="synConstant">1000</span>]) <span class="synIdentifier">print</span>(d.token2id[<span class="synConstant">&quot;長い&quot;</span>]) <span class="synIdentifier">print</span>(d.doc2bow([<span class="synConstant">&quot;長い&quot;</span>,<span class="synConstant">&quot;長い&quot;</span>,<span class="synConstant">&quot;短い&quot;</span>])) </pre><p>出力</p> <pre>長い 1000 [(1000, 2), (4362, 1)] </pre><p>IDが1000の単語を取得したいときはインデックスでアクセスすればよくて、"長い"という単語のIDを取得したい場合はtoken2idが使えます。また、doc2bowを使ってBOWを取得することもできます。(ID, 出現回数)の形です。</p><p>また、フィルター機能もあります。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%C8%A5%C3%A5%D7%A5%EF%A1%BC%A5%C9">ストップワード</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A1%BC%A5%AF">トーク</a>ナイザーの処理で取り除くことが出来なかった不要な単語を除去できます。</p> <pre class="code lang-python" data-lang="python" data-unlink>d.filter_extremes(no_below=<span class="synConstant">5</span>, no_above=<span class="synConstant">0.2</span>) d.compactify() </pre><p>使われいる文書の数がno_belowより少ない単語を無視し、no_aboveの割合以上の文書に出てくる単語を無視しています。<br /> また、compactifyでIDを振り直してコンパクトにしてます。</p><p>LDAの学習に使う<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A1%BC%A5%D1%A5%B9">コーパス</a>を作ります。</p> <pre class="code lang-python" data-lang="python" data-unlink>corpus = [d.doc2bow(w) <span class="synStatement">for</span> w <span class="synStatement">in</span> docs] test_size = <span class="synIdentifier">int</span>(<span class="synIdentifier">len</span>(corpus) * <span class="synConstant">0.1</span>) test_corpus = corpus[:test_size] train_corpus = corpus[test_size:] </pre><p>ここまで出来たらLDAの学習が出来ます。</p> </div> <div class="section"> <h5 id="LDAの学習">LDAの学習</h5> <p>学習状況を見るためにlogの設定をする事をオススメします。</p> <pre class="code lang-python" data-lang="python" data-unlink>logging.basicConfig(<span class="synIdentifier">format</span>=<span class="synConstant">'%(message)s'</span>, level=logging.INFO) </pre><p>トピック数を適当に50に設定して学習を開始します。</p> <pre class="code lang-python" data-lang="python" data-unlink>lda = models.ldamodel.LdaModel(corpus=corpus, id2word=d, num_topics=<span class="synConstant">50</span>, passes=<span class="synConstant">10</span>) </pre><p>出力(ログの)</p> <pre>using symmetric alpha at 0.02 using symmetric <a class="keyword" href="http://d.hatena.ne.jp/keyword/eta">eta</a> at 0.02 using serial LDA version on this node running online (multi-pass) LDA training, 50 topics, 10 passes over the supplied corpus of 6639 documents, updating model once every 2000 documents, evaluating perplexity every 6639 documents, iterating 50x with a convergence threshold of 0.001000 PROGRESS: pass 0, at document #2000/6639 merging changes from 2000 documents into a model of 6639 documents topic #20 (0.020): 0.005*"映画" + 0.003*"<a class="keyword" href="http://d.hatena.ne.jp/keyword/iphone">iphone</a>" + 0.003*"気持ち" + 0.002*"写真" + 0.002*"いく" + 0.002*"対応" + 0.002*"チェック" + 0.002*"<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>" + 0.002*"仕事" + 0.002*"相手" topic #22 (0.020): 0.004*"結婚" + 0.003*"利用" + 0.003*"しまう" + 0.003*"思う" + 0.003*"アプリ" + 0.003*"更新" + 0.003*"サービス" + 0.002*"浮気" + 0.002*"ください" + 0.002*"現在" topic #15 (0.020): 0.007*"ご" + 0.005*"機能" + 0.005*"<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>" + 0.004*"ください" + 0.004*"対応" + 0.004*"写真" + 0.004*"当選" + 0.003*"応募" + 0.003*"映画" + 0.003*"プレゼント" topic #31 (0.020): 0.003*"対応" + 0.003*"映画" + 0.002*"<a class="keyword" href="http://d.hatena.ne.jp/keyword/flash">flash</a>" + 0.002*"人気" + 0.002*"max" + 0.002*"<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>" + 0.002*"ユーザー" + 0.002*"機能" + 0.002*"画面" + 0.002*"搭載" topic diff=25.199308, rho=1.000000 PROGRESS: pass 0, at document #4000/6639 merging changes from 2000 documents into a model of 6639 documents topic #4 (0.020): 0.021*"アプリ" + 0.006*"<a class="keyword" href="http://d.hatena.ne.jp/keyword/android">android</a>" + 0.006*"表示" + 0.005*"max" + 0.005*"画面" + 0.005*"登録" + 0.004*"<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>マックス" + 0.004*"利用" + 0.004*"store" + 0.004*"更新" topic #8 (0.020): 0.009*"肌" + 0.008*"<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A5%D5%A5%C8%A5%D0%A5%F3%A5%AF">ソフトバンク</a>" + 0.005*"ゴルフ" + 0.004*"選手" + 0.003*"ファン" + 0.003*"美人" + 0.003*"思う" + 0.003*"いく" + 0.003*"出" + 0.003*"ゴルファー" topic #48 (0.020): 0.009*"映画" + 0.006*"結婚" + 0.005*"くれ" + 0.003*"言わ" + 0.003*"仕事" + 0.003*"気持ち" + 0.003*"心" + 0.003*"公開" + 0.003*"作品" + 0.003*"監督" topic #39 (0.020): 0.006*"男性" + 0.005*"声" + 0.004*"知っ" + 0.004*"得" + 0.004*"てる" + 0.004*"結婚" + 0.003*"思う" + 0.003*"イベント" + 0.003*"韓国" + 0.003*"好き" topic #20 (0.020): 0.004*"映画" + 0.003*"気持ち" + 0.003*"仕事" + 0.003*"相手" + 0.003*"いく" + 0.002*"写真" + 0.002*"女子" + 0.002*"しまう" + 0.002*"特集" + 0.002*"発言" topic diff=3.696819, rho=0.707107 ~~~(略)~~~ </pre><p>この様なログが出力され、学習途中のパラメータやトピックを確認できます。<br /> このデータ量だったので<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a> book Pro(プロセッサ Corei7 メモリ16G)で数分程度で学習は終わりました。<br /> 学習が終わったらテスト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A1%BC%A5%D1%A5%B9">コーパス</a>でPerplexityを確認しましょう。</p> <pre class="code lang-python" data-lang="python" data-unlink>N = <span class="synIdentifier">sum</span>(count <span class="synStatement">for</span> doc <span class="synStatement">in</span> test_corpus <span class="synStatement">for</span> <span class="synIdentifier">id</span>, count <span class="synStatement">in</span> doc) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;N: &quot;</span>,N) perplexity = np.exp2(-lda.log_perplexity(test_corpus)) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;perplexity:&quot;</span>, perplexity) </pre><p>出力</p> <pre>N: 139057 perplexity: 1855.2785790213302 </pre><p>出現単語数Nに比べて非常に小さな値になっているので良いモデルになっていることが確認できます。</p><p>トピックを確認して見ましょう。(10個ぐらい)</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synStatement">def</span> <span class="synIdentifier">get_topic_words</span>(topic_id): <span class="synStatement">for</span> t <span class="synStatement">in</span> lda.get_topic_terms(topic_id): <span class="synIdentifier">print</span>(<span class="synConstant">&quot;{}: {}&quot;</span>.format(d[t[<span class="synConstant">0</span>]], t[<span class="synConstant">1</span>])) <span class="synStatement">for</span> t <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">10</span>): <span class="synIdentifier">print</span>(<span class="synConstant">&quot;Topic # &quot;</span>,t) get_topic_words(t) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>) </pre><p>出力</p> <pre>Topic # 0 ヒーロー: 0.023730993270874023 公開: 0.015601863153278828 最強: 0.015375325456261635 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%D9%A5%F3%A5%B8%A5%E3%A1%BC%A5%BA">アベンジャーズ</a>: 0.014256509020924568 人類: 0.011246700771152973 記録: 0.010951797477900982 地球: 0.009402085095643997 映画: 0.007777830585837364 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AD%A5%E3%A5%D7%A5%C6%A5%F3%A1%A6%A5%A2%A5%E1%A5%EA%A5%AB">キャプテン・アメリカ</a>: 0.0076071820221841335 世界: 0.0074112629517912865 Topic # 1 仕事: 0.01630249060690403 結果: 0.010680487379431725 考え: 0.008862967602908611 会社: 0.008609889075160027 調査: 0.007379303686320782 必要: 0.005950006190687418 年収: 0.005934941116720438 ビジネス: 0.005180467385798693 いく: 0.0046653421595692635 高い: 0.0045888046734035015 Topic # 2 肌: 0.06868039816617966 韓国: 0.02120852842926979 成分: 0.01797901839017868 配合: 0.016065062955021858 ケア: 0.015182935632765293 コスメ: 0.01265209261327982 geforce gtx: 0.01075231097638607 毛穴: 0.01063121110200882 クリーム: 0.010575288906693459 スキンケア: 0.00983455590903759 Topic # 3 転職: 0.05346670374274254 livedoor: 0.02633664198219776 仕事: 0.023270638659596443 求人: 0.020375752821564674 悩み: 0.019349485635757446 会社: 0.017803464084863663 活動: 0.014538266696035862 コンテンツ: 0.013969127088785172 説教: 0.012373720295727253 判断: 0.011847401969134808 Topic # 4 アプリ: 0.0694742500782013 android: 0.02808075211942196 max: 0.016350433230400085 画面: 0.015707241371273994 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>マックス: 0.01357377041131258 表示: 0.01272848155349493 iphone: 0.012610442005097866 無料: 0.012191498652100563 twitter: 0.010832356289029121 タップ: 0.010797367431223392 Topic # 5 pc: 0.015194461680948734 搭載: 0.014297448098659515 対応: 0.014269378036260605 製品: 0.012111667543649673 機能: 0.010044978931546211 可能: 0.009972632862627506 接続: 0.00836364645510912 usb: 0.006858081556856632 シリーズ: 0.006152425426989794 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>: 0.005825271364301443 Topic # 6 デジ: 0.018907519057393074 機能: 0.01732938550412655 デジタル: 0.014969095587730408 ユーザー: 0.010697913356125355 サービス: 0.010371265932917595 パソコン: 0.009319713339209557 提供: 0.009241793304681778 使える: 0.009118852205574512 機器: 0.008886301890015602 現在: 0.0088787991553545 Topic # 7 映画: 0.04781694337725639 公開: 0.020408974960446358 作品: 0.018162159249186516 監督: 0.01602139323949814 本作: 0.013156397268176079 演じる: 0.007427051197737455 特集: 0.007043853402137756 movie: 0.006705742795020342 主演: 0.005962018854916096 大: 0.0059361811727285385 Topic # 8 て: 0.010121898725628853 監督: 0.009650022722780704 sports: 0.009441154077649117 watch: 0.008757323957979679 ゴルフ: 0.0084562161937356 放送: 0.007622931618243456 ボール: 0.007172265090048313 チーム: 0.006855555344372988 やっ: 0.0067366985604166985 練習: 0.006228393409401178 Topic # 9 ツイート: 0.024701008573174477 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C4%A5%A4%A5%C3%A5%BF%A1%BC">ツイッター</a>: 0.02284015715122223 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%CB%CC%C4%AB%C1%AF">北朝鮮</a>: 0.014550372026860714 tbs: 0.008325724862515926 ローラ: 0.008248904719948769 松井: 0.007412313483655453 言い訳: 0.006594712845981121 内田: 0.006575769279152155 てる: 0.0060353041626513 不倫: 0.005640488117933273 </pre><p>"単語:割合"という形式で出力してます。それぞれのトピックが近い意味の単語分布になっている様に見えますね。</p><p>また、文書のトピック分布は次の様に確認できます。</p> <pre class="code lang-python" data-lang="python" data-unlink>topics = <span class="synIdentifier">sorted</span>(lda.get_document_topics(corpus[<span class="synConstant">0</span>]), key=<span class="synStatement">lambda</span> t:t[<span class="synConstant">1</span>], reverse=<span class="synIdentifier">True</span>) <span class="synStatement">for</span> t <span class="synStatement">in</span> topics[:<span class="synConstant">10</span>]: <span class="synIdentifier">print</span>(<span class="synConstant">&quot;{}: {}&quot;</span>.format(t[<span class="synConstant">0</span>], t[<span class="synConstant">1</span>])) </pre><p>出力</p> <pre>10: 0.4286927580833435 16: 0.19554442167282104 28: 0.09656607359647751 33: 0.05863435938954353 44: 0.047012779861688614 5: 0.04349694028496742 1: 0.03415320813655853 15: 0.028384555131196976 13: 0.02286113239824772 41: 0.01004168763756752 </pre><p>これも"トピックの番号:割合"という形式で出力してます。<br /> 主にトピック10で構成さていて、そのあとにトピック16、28と続いてますね。<br /> このトピックの単語分布も確認しましょう。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synStatement">for</span> t <span class="synStatement">in</span> topics[:<span class="synConstant">10</span>]: <span class="synIdentifier">print</span>(<span class="synConstant">&quot;Topic # &quot;</span>,t[<span class="synConstant">0</span>]) get_topic_words(t[<span class="synConstant">0</span>]) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>) </pre><p>出力</p> <pre>Topic # 10 搭載: 0.02390816994011402 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>: 0.021327851340174675 対応: 0.021220998838543892 nttドコモ: 0.012328347191214561 機能: 0.011351358145475388 モデル: 0.011222900822758675 max: 0.011020414531230927 cpu: 0.009783013723790646 カメラ: 0.009003721177577972 ディスプレイ: 0.00869847647845745 Topic # 16 htc: 0.021657699719071388 line: 0.013200951740145683 子供: 0.009489757940173149 老人ホーム: 0.007789401803165674 妊娠: 0.007769452873617411 detail: 0.006128225941210985 脳: 0.00582770723849535 年金: 0.005326862912625074 ジャニーズ: 0.005224371794611216 処分: 0.004653443582355976 Topic # 28 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>: 0.02225065976381302 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A5%D5%A5%C8%A5%D0%A5%F3%A5%AF">ソフトバンク</a>: 0.022145671769976616 max: 0.022095773369073868 ドコモ: 0.015159054659307003 sc: 0.013579449616372585 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>マックス: 0.01169624924659729 購入: 0.011320103891193867 対応: 0.010671828873455524 galaxy s: 0.010225505568087101 キャンペーン: 0.009902272373437881 Topic # 33 撮影: 0.07201525568962097 動画: 0.04066493734717369 カメラ: 0.038062382489442825 写真: 0.023346638306975365 レンズ: 0.011216390877962112 映像: 0.01105312816798687 機能: 0.01095964852720499 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CB%A5%B3%A5%CB%A5%B3%C6%B0%B2%E8">ニコニコ動画</a>: 0.010317344218492508 ビデオ: 0.007901370525360107 画像: 0.007722283713519573 Topic # 44 画面: 0.02682238444685936 表示: 0.02116880752146244 facebook: 0.016731226816773415 設定: 0.01661299169063568 ニュース: 0.012996634468436241 得: 0.012161778286099434 知っ: 0.011591647751629353 クリック: 0.01136905886232853 入力: 0.011217259801924229 便利: 0.011154274456202984 Topic # 5 pc: 0.015194461680948734 搭載: 0.014297448098659515 対応: 0.014269378036260605 製品: 0.012111667543649673 機能: 0.010044978931546211 可能: 0.009972632862627506 接続: 0.00836364645510912 usb: 0.006858081556856632 シリーズ: 0.006152425426989794 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>: 0.005825271364301443 Topic # 1 仕事: 0.01630249060690403 結果: 0.010680487379431725 考え: 0.008862967602908611 会社: 0.008609889075160027 調査: 0.007379303686320782 必要: 0.005950006190687418 年収: 0.005934941116720438 ビジネス: 0.005180467385798693 いく: 0.0046653421595692635 高い: 0.0045888046734035015 Topic # 15 商品: 0.017195843160152435 イベント: 0.012727107852697372 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D3%A5%C7%A5%AAsalon">ビデオsalon</a>: 0.012197132222354412 開催: 0.010742572136223316 デザイン: 0.009651359170675278 チェック: 0.008599182590842247 ブランド: 0.007262687664479017 新: 0.007121855393052101 販売: 0.006953767500817776 限定: 0.006405428983271122 Topic # 13 充電: 0.035104893147945404 iphone: 0.028389062732458115 バッテリー: 0.026957286521792412 ケース: 0.021976225078105927 ipad: 0.015676002949476242 容量: 0.013837297447025776 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A5%DB">スマホ</a>: 0.011868351139128208 大: 0.011050853878259659 装着: 0.01052774116396904 イケショップ: 0.010489579290151596 Topic # 41 更新: 0.10627567023038864 ソフトウェア: 0.07545258849859238 ください: 0.028703970834612846 ダウンロード: 0.015537954866886139 ご: 0.014859003946185112 表示: 0.014070549048483372 設定: 0.010349449701607227 行う: 0.01013778056949377 操作: 0.009964043274521828 実施: 0.009850624948740005 </pre><p>確認してみましょう。</p> <pre class="code lang-python" data-lang="python" data-unlink>dm.read_doc(<span class="synConstant">0</span>) </pre><p>出力</p> <pre><a href="http://news.livedoor.com/article/detail/6668229/">http://news.livedoor.com/article/detail/6668229/</a> 2012-06-18T11:55:00+0900 海外向け<a class="keyword" href="http://d.hatena.ne.jp/keyword/SIM%A5%D5%A5%EA%A1%BC">SIMフリー</a>モデル「HTC One V T320e」を使ってみよう!<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A5%D5%A5%C8%A5%D0%A5%F3%A5%AF">ソフトバンク</a>の「HTC Desire X06HT」と比較した【レビュー】 およそ2年で何が変わった?Desireとの比較 ローエンドからミドルエンドユーザーをターゲットにしたHTC製の「HTC One V T320e」(以下、HTC One V)は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a> 4.0.3(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%AB%C8%AF%A5%B3%A1%BC%A5%C9%CC%BE">開発コード名</a>:IceCream Sandwich;ICS)を採用した<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>で、グローバル市場では4月に発売されているが日本向けには発売されていない。 前回は外観や同梱品をチェックしたが、今回は、およそ2年前に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A5%D5%A5%C8%A5%D0%A5%F3%A5%AF">ソフトバンク</a>から発売された「HTC Desire X06HT」(以下、X06HT)と比較してみる。外観やディスプレイをチェックし、X06HTが発売してから2年経過して何が変わったかを見ていこう。 本体正面。左がHTC One V、右がX06HT 本体背面 どちらもディスプレイサイズは約3.7インチと同等のため本体サイズも近い。X06HTが全体的に丸みを帯びたラウンドフォルムのため、並べて比較するとHTC One Vはスクエアなデザインに見えるが、単体で持ってみるとHTC One Vも角の取れたデザインや、しゃくれた部分のカーブなど曲線ラインを多用しており、角ばったイメージはほとんどしない。 本体向かって左側面(画像上)と右側面(画像下) 左右の側面を比較すると色々な違いが分かる。まずは、X06HTでは左側面に搭載されていた+−キー(上下キー)が、HTC One Vでは右側面に搭載されている。microUSB端子もHTC One Vでは左側面に搭載されている。 そして、本体の高さがHTC One Vでは大きくなっており、厚みはHTC One Vが薄くなっていることも分かる。実際の厚みはX06HTが11.9mm、HTC One Vが9.24mm、重量もX06HTは約135gでHTC One Vは約115gとなっており、薄型化・軽量化され手に持った際の印象が全く異なる。 本体向かって上部側面(画像上)と下部側面(画像下) 上下の側面も全て変更されている。上部側面の電源キーと3.5mmイヤホンジャックの位置が逆になっているほか、X06HTではディスプレイ上部に搭載されていたお知らせ用のLEDランプがHTC One Vでは上部側面に搭載されている。 このLEDランプは充電中、充電完了、不在着信、メールなどの通知時に光る。内容としてはどちらも同じ役割を担っているが位置と形状が変わった。 背面のカメラ部分。手前がHTC One Vで奥がX06HT カメラの位置や周囲のデザインも変わりよりスタイリッシュさが増したといえる。HTC One Vのカメラ位置は本体背面向かって左側に寄せられており、これは右側の上部にある3.5mmイヤホンジャックにイヤホンを挿した際にケーブルがカメラにかからないようなっているため、イヤホンをつないだままでも撮影がしやすい。 反面、横撮りをする際に左手の指の位置を考えないと写り込んでしまう点がネックだ。縦撮りがメインの場合は特に気にならないだろう。 また、X06HTでは上部に搭載されているスピーカーが、HTC One Vでは下部のしゃくれた部分に搭載されている。 本体正面下部を比較。手前がHTC One Vで奥がX06HT デザイン的に最も違いが分かる本体正面の下部。X06HTではディスプレイ直下にホーム、menu、バック、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Google">Google</a>検索の物理キーに加え、光学<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B8%A5%E7%A5%A4%A5%B9">ジョイス</a>ティックを備えているが、HTC One Vはバック、ホーム、タスクのセンサーキーのみとなっている。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>のバージョンが異なる点も変更の要因でもあるが、できれば物理キー、光学<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B8%A5%E7%A5%A4%A5%B9">ジョイス</a>ティックは継承して欲しところだ。特に光学<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B8%A5%E7%A5%A4%A5%B9">ジョイス</a>ティックは非常に便利で「これがあるからX06HTを使っている!」というユーザーも少なくない。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>端末の主流ではないが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%E9%A5%A6%A5%B8%A5%F3%A5%B0">ブラウジング</a>、メールなどの操作において利用価値が高いのは間違いない。 ディスプレイの比較。左がHTC One V、右がX06HT X06HTは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CD%AD%B5%A1EL">有機EL</a>を搭載しており、非常に鮮やかな表示をするが、HTC One Vではさらに明るく綺麗なディスプレイになっている。解像度はどちらも480×800ドットのワイド<a class="keyword" href="http://d.hatena.ne.jp/keyword/VGA">VGA</a>。画像では分かり難いがHTC One VはX06HTに比べ、液晶パネルが前に出てきているため明るく綺麗に見える。 明るさを一番低くして比較 明るさを一番低くしたまま角度を付けて比較 明るさ調整で一番暗い状態にして比較したところその違いがよく分かった。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CD%AD%B5%A1EL">有機EL</a>から<a class="keyword" href="http://d.hatena.ne.jp/keyword/TFT">TFT</a>液晶に変更されているが、ディスプレイの表示においてはHTC One Vはとても明るく鮮やかになっている。 X06HTは、当時としてはハイスペックでありながらスタイリッシュなデザインだったが、それでもHTC One Vと比べてしまうとぽってり感が否めない。逆にHTC One Vは、より洗練されたデザインと言えるだろう。 記事執筆:2106bpm(つとむびーぴーえむ) ■関連リンク ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>マックス(S-MAX) ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>マックス(S-MAX) smaxjp on <a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> ・海外向け<a class="keyword" href="http://d.hatena.ne.jp/keyword/SIM%A5%D5%A5%EA%A1%BC">SIMフリー</a>モデル「HTC One V T320e」を使ってみよう!写真で外観チェック【レビュー】 - S-MAX - <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%A4%A5%D6%A5%C9%A5%A2%A5%D6%A5%ED%A5%B0">ライブドアブログ</a> ・HTCの新グローバル端末「HTC One」シリーズ3機種を実際に触ってみた「HTC One V編」【レポート】 - S-MAX - <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%A4%A5%D6%A5%C9%A5%A2%A5%D6%A5%ED%A5%B0">ライブドアブログ</a> ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/HTC%20Nippon">HTC Nippon</a>、グローバルモデル「HTC One」シリーズの説明会を開催!日本への投入や<a class="keyword" href="http://d.hatena.ne.jp/keyword/KDDI">KDDI</a>との協業については言及せず - S-MAX - <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%A4%A5%D6%A5%C9%A5%A2%A5%D6%A5%ED%A5%B0">ライブドアブログ</a> ・HTC、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a> 4.0 ICS搭載「HTC Oneシリーズ」を4機種発表!One X、One XL、One S、One Vが登場 - S-MAX - <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%A4%A5%D6%A5%C9%A5%A2%A5%D6%A5%ED%A5%B0">ライブドアブログ</a> ・【最近のオススメ「<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>アプリ」特集:2012年6月4〜10日編】 - S-MAX - <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%A4%A5%D6%A5%C9%A5%A2%A5%D6%A5%ED%A5%B0">ライブドアブログ</a> ・HTC One V Product Overview(HTC Corporation.) ・HTC 日本 </pre><p>予測通り<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A5%DB">スマホ</a>のレビューでした。文書を形成するトピック分布の方も良さそうですね。</p> </div> <div class="section"> <h5 id="可視化">可視化</h5> <p>全体的に問題無いか確認するために可視化します。<br /> 文書をトピックによって張られるベクトル空間(今回は50次元)だとしてそれを次元圧縮で3次元と2次元にして確認して見ましょう。<br /> (以降、トピックによって張られるベクトル空間のことをトピック空間と呼ぶ)<br /> 先ずは全ての文書のトピックを取得しましょう。</p> <pre class="code lang-python" data-lang="python" data-unlink>all_topics = lda.get_document_topics(corpus, minimum_probability=<span class="synConstant">0</span>) &lt;|| 試しに<span class="synConstant">0</span>番目の文書のトピックを見ましょう。 &gt;|python| <span class="synIdentifier">print</span>(all_topics[<span class="synConstant">0</span>]) </pre><p>出力</p> <pre class="code" data-lang="" data-unlink>[(0, 4.6838402e-05), (1, 0.03413247), (2, 4.6838402e-05), (3, 0.0029260195), (4, 0.009185041), (5, 0.043502126), (6, 4.6838402e-05), (7, 4.6838402e-05), (8, 4.6838402e-05), (9, 4.6838402e-05), (10, 0.42869237), (11, 4.6838402e-05), (12, 4.6838402e-05), (13, 0.02286147), (14, 4.6838402e-05), (15, 0.028384523), (16, 0.19554703), (17, 4.6838402e-05), (18, 4.6838402e-05), (19, 0.0042972392), (20, 4.6838402e-05), (21, 4.6838402e-05), (22, 4.6838402e-05), (23, 4.6838402e-05), (24, 4.6838402e-05), (25, 4.6838402e-05), (26, 4.6838402e-05), (27, 4.6838402e-05), (28, 0.096573636), (29, 4.6838402e-05), (30, 0.003768291), (31, 4.6838402e-05), (32, 4.6838402e-05), (33, 0.058640447), (34, 4.6838402e-05), (35, 0.006743891), (36, 0.006086506), (37, 4.6838402e-05), (38, 4.6838402e-05), (39, 4.6838402e-05), (40, 4.6838402e-05), (41, 0.010041841), (42, 4.6838402e-05), (43, 4.6838402e-05), (44, 0.047024604), (45, 4.6838402e-05), (46, 4.6838402e-05), (47, 4.6838402e-05), (48, 4.6838402e-05), (49, 4.6838402e-05)]</pre><p>出力は(トピックの番号,割合)ですが、これを(基底の番号,成分)とみなすことでトピック空間を作ります。</p><p>可視化にはEmbedding Projectorを使います。<br /> サイト:<br /> <iframe src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Fprojector.tensorflow.org%2F" title="Embedding projector - visualization of high-dimensional data" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="http://projector.tensorflow.org/">projector.tensorflow.org</a></cite></p><p>ブラウザ上からデータをアップロードして簡単に次元圧縮ができる便利なサイトです。</p><p>まずはアップロードするためのtsvファイルを作ります。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synStatement">with</span> <span class="synIdentifier">open</span>(<span class="synConstant">'doc_lda_tensor.tsv'</span>,<span class="synConstant">'w'</span>) <span class="synStatement">as</span> w: <span class="synStatement">for</span> doc_topics <span class="synStatement">in</span> all_topics: <span class="synStatement">for</span> topics <span class="synStatement">in</span> doc_topics: w.write(<span class="synIdentifier">str</span>(topics[<span class="synConstant">1</span>])+ <span class="synConstant">&quot;</span><span class="synSpecial">\t</span><span class="synConstant">&quot;</span>) w.write(<span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>) </pre><p>また、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%BF%A5%C7%A1%BC%A5%BF">メタデータ</a>を作りそれぞれのデータにタイトルをつけることが出来るのですが、元々のデー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%BB%A5%C3%A5%C8">タセット</a>が記事のテーマごとに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リに分けられていたので、タイトルにはテーマ名をつけてトピックが元のテーマをちゃんと再現できているか確認します。</p> <pre class="code lang-python" data-lang="python" data-unlink>meta = [<span class="synIdentifier">str</span>(a).split(<span class="synConstant">&quot;/&quot;</span>) <span class="synStatement">for</span> a <span class="synStatement">in</span> articles] <span class="synStatement">with</span> <span class="synIdentifier">open</span>(<span class="synConstant">'doc_lda_metadata.tsv'</span>,<span class="synConstant">'w'</span>) <span class="synStatement">as</span> w: w.write(<span class="synConstant">'Titles</span><span class="synSpecial">\t</span><span class="synConstant">Genres</span><span class="synSpecial">\n</span><span class="synConstant">'</span>) <span class="synStatement">for</span> m <span class="synStatement">in</span> meta: w.write(<span class="synConstant">&quot;%s</span><span class="synSpecial">\t</span><span class="synConstant">%s</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span> % (m[<span class="synConstant">1</span>].split(<span class="synConstant">&quot;-&quot;</span>)[<span class="synConstant">0</span>], m[<span class="synConstant">1</span>])) </pre><p>Embedding Projectorを開いて左側の"Load data"ボタンからそれぞれのtsvファイルをアップロードしましょう。<br /> PCAの3次元圧縮では次のような感じになりました。<figure class="figure-image figure-image-fotolife" title="図6.3次元圧縮"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180405/20180405192735.gif" alt="f:id:tdualdir:20180405192735g:plain" title="f:id:tdualdir:20180405192735g:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図6.3次元圧縮</figcaption></figure></p><p>t-SNEの2次元圧縮では次のようになりました。<figure class="figure-image figure-image-fotolife" title="図7.2次元圧縮"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/tdualdir/20180406/20180406153810.png" alt="f:id:tdualdir:20180406153810p:plain" title="f:id:tdualdir:20180406153810p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>図7.2次元圧縮</figcaption></figure></p><p>テーマごとに別れていますね。<br /> なので生成したトピックは単語からちゃんとテーマを捉えることが出来ている事がわかりました。</p> </div> <div class="section"> <h5 id="ニュース記事レコメンドの作成">ニュース記事レコメンドの作成</h5> <p>実はgensimにはsimilaritiesというメソッドがあるのでここまでくればサクッと作れます。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> gensim <span class="synPreProc">import</span> similarities doc_index = similarities.docsim.MatrixSimilarity(lda[corpus]) </pre><p>これでコサイン類似度<a href="#f-58e74fad" name="fn-58e74fad" title="コサイン類似度  ベクトル化した情報の類似度を測る指標で、二つのベクトル[tex:{\bf u},{\bf v}]の類似は  [tex: \frac{{\bf u} \cdot {\bf v}} {{||{\bf v}||}_2 {||{\bf v}||}_2}]">*14</a>を保持したオブジェクトが作られたので、記事のインデックスを指定することでトピック空間のベクトルが取得できます。</p> <pre class="code lang-python" data-lang="python" data-unlink>target_article = <span class="synConstant">0</span> vec_lda = lda[target_article]  </pre><p>vec_ldaは先ほどのall_topic[0]の値と同じです。<br /> __getitem__でこのベクトルを指定することで 類似度を取得できます。<a href="#f-92cf025c" name="fn-92cf025c" title="類似度を取得する関数としてget_similaritiesメソッドも用意されているが、ソースコードを見ると「直接使うな」と書いています。">*15</a></p> <pre class="code lang-python" data-lang="python" data-unlink>s = doc_index.__getitem__(vec_lda) s = <span class="synIdentifier">sorted</span>(<span class="synIdentifier">enumerate</span>(s), key=<span class="synStatement">lambda</span> t: t[<span class="synConstant">1</span>], reverse=<span class="synIdentifier">True</span>) s[:<span class="synConstant">10</span>] </pre><p>出力</p> <pre>[(0, 0.99995905), (1881, 0.95702314), (6841, 0.92270225), (935, 0.9120116), (5687, 0.9099416), (2380, 0.90439415), (706, 0.90099066), (6336, 0.89967924), (20, 0.8994651), (528, 0.8989129)] </pre><p>(記事のインデックス,類似度)の形式で出力してます。類似度が大きい順にソートして上から10個まで表示しています。<br /> 一番上は入力したベクトルなので一番類似しているのは1881で、6841,935,...と続く結果になっています。<br /> これらのニュース記事を見て見ましょう。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synStatement">for</span> doc_id <span class="synStatement">in</span> [<span class="synConstant">1881</span>,<span class="synConstant">6841</span>,<span class="synConstant">935</span>]: <span class="synStatement">with</span> articles[doc_id].open() <span class="synStatement">as</span> f: <span class="synIdentifier">print</span>(<span class="synConstant">&quot;#&quot;</span>, doc_id) <span class="synIdentifier">print</span>(f.read()) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;===========&quot;</span>) </pre><p>出力</p> <pre># 1881 <a href="http://news.livedoor.com/article/detail/6656576/">http://news.livedoor.com/article/detail/6656576/</a> 2012-06-14T09:55:00+0900 海外向け<a class="keyword" href="http://d.hatena.ne.jp/keyword/SIM%A5%D5%A5%EA%A1%BC">SIMフリー</a>モデル「HTC One V T320e」を使ってみよう!写真で外観チェック【レビュー】 HTC製のコンパクト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>「HTC One V T320e」をチェック! 「HTC One V T320e」(以下、HTC One V)は、今年の2月27日に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%EB%A5%BB%A5%ED%A5%CA">バルセロナ</a>(スペイン)で開催された「Mobile World Congress 2012(MWC2012)」において、HTCがグローバルモデルの新製品「HTCOneシリーズ」として発表したモデルの1つ。3月27日には<a class="keyword" href="http://d.hatena.ne.jp/keyword/HTC%20Nippon">HTC Nippon</a>が、このHTC Oneシリーズの製品説明会を都内で開催しているが、日本向けには発売していない。 グローバル市場では4月に発売されているHTC One Vだが、ネット通販では販売価格が2万円台と既に大幅に値下がりしてきているので入手してみた。数回に渡ってこのHTC One Vのレビューを行っていく。まずは外観をチェックしてみる。 パッケージ表面(左)と裏面(右) パッケージ裏面の表記 ご開帳 パッケージに記載されている仕様は以下の通り。 Model T320e CPU 1GHz Platform <a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a> with HTC Sense Memory 512MB RAM, Storage:4GB Total / up to 1.1GB Available Display and sound 3.7-inch touch screen, Beats Audio support Camera 5 megapixel camera, F2.0 28mm lens, auto focus, LED <a class="keyword" href="http://d.hatena.ne.jp/keyword/flash">flash</a>, 720p HD video recording Connectivity 3.5mm stereo audio jack and microUSB, <a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>, <a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>, <a class="keyword" href="http://d.hatena.ne.jp/keyword/GPS">GPS</a> / <a class="keyword" href="http://d.hatena.ne.jp/keyword/GLONASS">GLONASS</a> Expansion slot <a class="keyword" href="http://d.hatena.ne.jp/keyword/microSD">microSD</a> card カラーはBlackで、HTCの本国である<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C2%E6%CF%D1%C0%BD">台湾製</a>(Made in Taiwan)の記載もある。 本体および同梱品 ガイドブックらしきものが同梱されているが、全て英語表記となっており、筆者では歯が立たないのでスルーする。コンセントプラグとUSBケーブルが同梱されているが、コンセントプラグは日本で使えるものと形状が違うのでこれもスルー。ただし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%CF%B9%D2">渡航</a>する際は別途用意しなくても持っていくと使えるので便利だろう(多分<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%E1%A5%EA">アメリ</a>カとかで使えるもののはず=よくワカリマセン)。さらに、HTCのロゴが入ったイヤホンマイクも同梱する。 Beats Audio(ビーツ・オーディオ)のイヤホンでもなく、特に電話としても使わないのでこちらもスルーし、そっと箱の中にしまっておく。 本体正面(左)と背面(右) 本体サイズは幅59.7×高さ120.3×厚み9.2mm、重量は115g、ディスプレイは3.7インチの<a class="keyword" href="http://d.hatena.ne.jp/keyword/TFT">TFT</a>液晶で解像度は480×800ドットとなる。コンパクトで軽量、片手で操作しやすく、手にも馴染みやすいサイズ。 CPUは1GHzのシングルコア(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Qualcomm">Qualcomm</a> Scorpion)、<a class="keyword" href="http://d.hatena.ne.jp/keyword/GPU">GPU</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Qualcomm">Qualcomm</a> Adreno 205、ROMが4GB、RAMは512MBの本体メモリを搭載している。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>のバージョンは4.0.3(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%AB%C8%AF%A5%B3%A1%BC%A5%C9%CC%BE">開発コード名</a>:IceCream Sandwich;ICS)を採用し、独自UIのHTC Senseはバージョン4.0を搭載。スペック上はローエンドからミドルエンドユーザー向けと言えるモデルだ。 本体向かって左側面(画像上)と右側面(画像下) 本体向かって上部側面(画像上)と下部側面(画像下) 本体左側面にはmicroUSB端子を、右側面には上下キーを備える。本体上部側面には3.5mmのイヤホンジャックと電源キー、下部側面にはマイクを搭載している。 本体背面 国内で行った製品説明会ではブラウンが展示されていたため、ブラックの本体は初めて見たが想像を絶するカッコ良さだ。写真では伝わり難いのが残念。 背面のカメラ部分 背面のカメラは約500万画素の<a class="keyword" href="http://d.hatena.ne.jp/keyword/CMOS">CMOS</a>(裏面照射型)を搭載し、カメラモジュールの横にフォトライトを備える。画<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%C7%BF%F4">素数</a>による<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%D1%A5%AF">インパク</a>トはないが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/F%C3%CD">F値</a>2.0という明るいレンズを搭載し、暗い場所でも明るく綺麗に撮影ができる。 背面の下部には Beats Audioのロゴとスピーカー その部分のみがカバーとなっており外れる 背面下部のカバーを外すと、SIMスロットと<a class="keyword" href="http://d.hatena.ne.jp/keyword/microSD">microSD</a>カードスロットが見える。<a class="keyword" href="http://d.hatena.ne.jp/keyword/microSD">microSD</a>は最大32GBのmicroSDHCに対応し、<a class="keyword" href="http://d.hatena.ne.jp/keyword/SIM%A5%AB%A1%BC%A5%C9">SIMカード</a>はmicroSIMではなく通常サイズの<a class="keyword" href="http://d.hatena.ne.jp/keyword/SIM%A5%AB%A1%BC%A5%C9">SIMカード</a>が装着できる。 電池パックは内蔵タイプで、公式に発表されている電池パック容量は1500mAh。電池パックの交換できないが、フリーズした場合などは電源キーを長押下することで再起動ができる。 シャクレ! デザイン面での最大の特長は、正面下部が手前にカーブを描いて出っ張っている(しゃくれている)部分だろう。筆者が持った際は小指が丁度このしゃくれた部分に乗り心地よく休めるため、勝手に“小指やすめ”と呼んでいるw ディスプレイ直下にあるバック、ホーム、タスクキーを押す際もこの出っ張り部分があるため押しやすく、背面の質感もHTCならではのマットな仕上がり。<a class="keyword" href="http://d.hatena.ne.jp/keyword/SIM%A5%D5%A5%EA%A1%BC">SIMフリー</a>モデルのためキャリア(通信事業者)のロゴも入っていない。 HTC One V First look 記事執筆:2106bpm(つとむびーぴーえむ) ■関連リンク ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>マックス(S-MAX) ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>マックス(S-MAX) smaxjp on <a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> ・HTCの新グローバル端末「HTC One」シリーズ3機種を実際に触ってみた「HTC One V編」【レポート】 - S-MAX - <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%A4%A5%D6%A5%C9%A5%A2%A5%D6%A5%ED%A5%B0">ライブドアブログ</a> ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/HTC%20Nippon">HTC Nippon</a>、グローバルモデル「HTC One」シリーズの説明会を開催!日本への投入や<a class="keyword" href="http://d.hatena.ne.jp/keyword/KDDI">KDDI</a>との協業については言及せず - S-MAX - <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%A4%A5%D6%A5%C9%A5%A2%A5%D6%A5%ED%A5%B0">ライブドアブログ</a> ・HTC、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a> 4.0 ICS搭載「HTC Oneシリーズ」を4機種発表!One X、One XL、One S、One Vが登場 - S-MAX - <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%A4%A5%D6%A5%C9%A5%A2%A5%D6%A5%ED%A5%B0">ライブドアブログ</a> ・【最近のオススメ「<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>アプリ」特集:2012年6月4〜10日編】 - S-MAX - <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%A4%A5%D6%A5%C9%A5%A2%A5%D6%A5%ED%A5%B0">ライブドアブログ</a> ・HTC One V Product Overview(HTC Corporation.) ・HTC 日本 =========== # 6841 <a href="http://news.livedoor.com/article/detail/6713879/">http://news.livedoor.com/article/detail/6713879/</a> 2012-07-02T12:55:00+0900 Meizu、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%A2%A5%C3%A5%C9%A5%B3%A5%A2">クアッドコア</a>CPU搭載<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a> 4.0 ICS<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>「Meizu MX Quadcore」を香港で発売 ゼロから始める<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a> 中国メーカー「Meizu」は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%A2%A5%C3%A5%C9%A5%B3%A5%A2">クアッドコア</a>CPUを搭載した<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>「Meixu MX Quadcore」を2012年6月30日(土)に香港で発売開始しています。 当日販売は事前予約分のみということですが、売り場は入場制限がかかるほどのもの凄い人だかりができたそうです。 SoCは「GALAXY SIII」のグローバルモデルと同じ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A5%E0%A5%B9%A5%F3%C5%C5%BB%D2">サムスン電子</a>製「Exynos 4412」を採用し、最大周波数1.4GHzの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%A2%A5%C3%A5%C9%A5%B3%A5%A2">クアッドコア</a>CPUを搭載しています。RAMは1GBで、ROMは32GBと64GBの2モデルが存在。かなりのハイスペック機種となります。OSは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a> 4.0(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%AB%C8%AF%A5%B3%A1%BC%A5%C9%CC%BE">開発コード名</a>:IceCream Sandwich;ICS)をベースに独自にカスタマイズした「Flyme OS 1.0」を採用します。 その他、ディスプレイはシャープ製の4.0インチDoubleVGA(960×640)液晶、カメラは背面800万画素(裏面照射型<a class="keyword" href="http://d.hatena.ne.jp/keyword/CMOS">CMOS</a>)/前面30万画素、バッテリー容量は1,700mAhという構成。対応周波数は2G(<a class="keyword" href="http://d.hatena.ne.jp/keyword/GSM">GSM</a>):850/900/1800/1900、3G(WCDMA):850/900/1700/1900/2100。端末サイズは121.3×63.3×10.3mm、重さは139gとなっています。 なお、情報元のショップ「KAIMONOTAI」では、販売および日本への発送も行なっています。価格は32GBモデルで38,300円、64GBモデルで48,300円。取り寄せ商品となり、入金確認後、6日〜7日後の発送になるということです。 記事執筆:ゼロから始める<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a> ■ゼロから始める<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a> ■中国Meizuが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%A2%A5%C3%A5%C9%A5%B3%A5%A2">クアッドコア</a>CPU搭載<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>「Meizu MX Quadcore」を香港で発売 | ゼロから始める<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a> ■関連リンク ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>マックス(S-MAX) ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>マックス(S-MAX) smaxjp on <a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> ・MEIZU ・Kaimonotai Blog ≫ Blog Archive ≫ Meizuの人気モデルMeizu MXにハイエンドの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%A2%A5%C3%A5%C9%A5%B3%A5%A2">クアッドコア</a>端末Meizu MX Quadcoreが登場。本日より香港にて一斉に発売開始 - すごい人だかりです. =========== # 935 <a href="http://news.livedoor.com/article/detail/6781727/">http://news.livedoor.com/article/detail/6781727/</a> 2012-07-23T09:55:00+0900 HTC、「HTC Desire HD」への<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a> 4.0 ICSアップデートを断念!パフォーマンス維持できない ゼロから始める<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a> HTCは、同社公式ブログ「HTC Blog — Inside Views & Breakthroughs from HTC」にて公開している同社製<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>に対する<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a> 4.0(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%AB%C8%AF%A5%B3%A1%BC%A5%C9%CC%BE">開発コード名</a>:IceCream Sandwich;ICS)へのOSバージョンアップ対象機種リストの中から「HTC Desire HD」を除外しています。 除外に際し、注釈にて「現在の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>バージョンおよびHTC Senseバージョンの状態が最も良いユーザー体験を与えられるということが、テストの結果わかった」と示し、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a> 4.0へのアップデートを断念したことと、その理由を記しています。 After extensive testing, we’ve determined that the current version of HTC Sense with <a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a> provides customers with the best experience on the HTC Desire HD. When we consider new versions of software, we weigh a number of factors, but ultimately the customer experience on the product is the deciding factor. We apologize for any confusion this change may have caused our customers. HTC Desire HDは日本でも<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A5%D5%A5%C8%A5%D0%A5%F3%A5%AF%A5%E2%A5%D0%A5%A4%A5%EB">ソフトバンクモバイル</a>から「HTC Desire HD 001HT」として発売されています。CPUはシングルコアの1.0GHz(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Qualcomm">Qualcomm</a> Snapdragon MSM8255)ながら、RAMサイズは768MBとなっており、同時期に発売された他メーカーの機種よりもスペック的には若干優れていました。 しかしながら、それでも<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a> 4.0では十分なパフォーマンスが得られず、最終的にアップデートされないという結果となってしまいました。非常に残念なところです。 記事執筆:ゼロから始める<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a> ■ゼロから始める<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a> ■HTC、「HTC Desire HD」へのAndroid4.0 ICSアップデートを断念、パフォーマンス維持できない | ゼロから始める<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a> ■関連リンク ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>マックス(S-MAX) ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>マックス(S-MAX) smaxjp on <a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a> 4.0, Ice Cream Sandwich Updates =========== </pre><p>いずれも非常に近い内容の記事が表示されています。</p><p>ある記事のidを入力すればそれに近いニュース記事が類似度が近い順に出てくるのはまさにレコメンドです。</p><p>学習したモデル達を保存するのは以下のようにします。</p> <pre class="code lang-python" data-lang="python" data-unlink>d.save_as_text(<span class="synConstant">&quot;dict.txt&quot;</span>) corpora.MmCorpus.serialize(<span class="synConstant">&quot;cop.mm&quot;</span>, corpus) lda.save(<span class="synConstant">&quot;lda.model&quot;</span>) doc_index.save(<span class="synConstant">&quot;sim&quot;</span>) </pre><p>レコメンドを組み込みたいアプリケーションでロードする場合は以下のようします。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> gensim <span class="synPreProc">import</span> models, corpora, similarities corpus = corpora.MmCorpus(<span class="synConstant">&quot;cop.mm&quot;</span>) lda = models.ldamodel.LdaModel.load(<span class="synConstant">&quot;lda.model&quot;</span>) d = corpora.Dictionary.load_from_text(<span class="synConstant">&quot;dict.txt&quot;</span>) doc_index = similarities.docsim.MatrixSimilarity.load(<span class="synConstant">&quot;sim&quot;</span>) </pre><p>ニュース記事レコメンドを作る事が出来ました!!</p> </div> </div> </div> <div class="section"> <h3 id="終わりに">終わりに</h3> <p>こんなに簡単にニュース記事レコメンドが出来るとは良い時代じゃな。<br /> notebookはここに置いてます。<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2FTdual%2Ftopic_model%2Fblob%2Fmaster%2Fnotebook%2FLDA_gensim.ipynb" title="Tdual/topic_model" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://github.com/Tdual/topic_model/blob/master/notebook/LDA_gensim.ipynb">github.com</a></cite></p><br /> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C4%A5%A4%A5%C3%A5%BF%A1%BC">ツイッター</a>やっているのでフォローお願いします!!<p>↓今すぐフォローすべきキラキラ アカウント</p><p><a class="twitter-follow-button" href="https://twitter.com/tdualdir?ref_src=twsrc^tfw" data-show-count="false">Follow @tdualdir</a></p><p> </p><p>じゃあの。</p><p> </p><p>参考書</p><p> <a href="https://www.amazon.co.jp/gp/product/4339027588/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=4339027588&amp;linkCode=as2&amp;tag=tdual-22&amp;linkId=293c8859c090bbdb30950e4a5bde867f" target="_blank" rel="noopener"><img src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=4339027588&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL160_&amp;tag=tdual-22" border="0" /></a><img style="border: none !important; margin: 0px !important;" src="//ir-jp.amazon-adsystem.com/e/ir?t=tdual-22&amp;l=am2&amp;o=9&amp;a=4339027588" alt="" width="1" height="1" border="0" /> <a href="https://www.amazon.co.jp/gp/product/4621061224/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=4621061224&amp;linkCode=as2&amp;tag=tdual-22&amp;linkId=cc9d0e9c2964274d27807f974ba44ba0" target="_blank" rel="noopener"><img src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=4621061224&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL160_&amp;tag=tdual-22" border="0" /></a><img style="border: none !important; margin: 0px !important;" src="//ir-jp.amazon-adsystem.com/e/ir?t=tdual-22&amp;l=am2&amp;o=9&amp;a=4621061224" alt="" width="1" height="1" border="0" /> <a href="https://www.amazon.co.jp/gp/product/4621061240/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=4621061240&amp;linkCode=as2&amp;tag=tdual-22&amp;linkId=809aafa6ac6beeba8f3ea2b804b1f3c3" target="_blank" rel="noopener"><img src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=4621061240&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL160_&amp;tag=tdual-22" border="0" /></a><img style="border: none !important; margin: 0px !important;" src="//ir-jp.amazon-adsystem.com/e/ir?t=tdual-22&amp;l=am2&amp;o=9&amp;a=4621061240" alt="" width="1" height="1" border="0" /> <a href="https://www.amazon.co.jp/gp/product/4061529048/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=4061529048&amp;linkCode=as2&amp;tag=tdual-22&amp;linkId=cee389723f6fcec4e15c69fbc2f0444f" target="_blank" rel="noopener"><img src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=4061529048&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL160_&amp;tag=tdual-22" border="0" /></a><img style="border: none !important; margin: 0px !important;" src="//ir-jp.amazon-adsystem.com/e/ir?t=tdual-22&amp;l=am2&amp;o=9&amp;a=4061529048" alt="" width="1" height="1" border="0" /><br /> <a target="_blank" href="https://www.amazon.co.jp/gp/product/4873117402/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873117402&linkCode=as2&tag=tdual-22&linkId=b2a8b145f6e022a0b099566dba4cee07"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4873117402&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL160_&tag=tdual-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=tdual-22&l=am2&o=9&a=4873117402" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /><br /> </p></p> </div><div class="footnote"> <p class="footnote"><a href="#fn-ad40c4be" name="f-ad40c4be" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">Bag of Words  多重集合(Bag)とは重複を許した集合  また、Bag of Wordsで表現することは単語の並び順は考慮せずに単語の出現率だけに注力する事を意味している。 </span></p> <p class="footnote"><a href="#fn-8b94a2f2" name="f-8b94a2f2" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">D. M. Blei, A. Y. Ng, and M. I. Jordan. Latent Dirichlet allocation.</span></p> <p class="footnote"><a href="#fn-2c56a1b5" name="f-2c56a1b5" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">Kroneckerのデルタ <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0A%5Cdelta_%7Bij%7D%20%3D%20%5Cbegin%7Bcases%7D%201%20%26%20%28i%3Dj%29%20%5C%5C%200%20%26%20%28i%20%5Cneq%20j%20%29%20%5Cend%7Bcases%7D%0A%7D" alt="{\displaystyle \delta_{ij} = \begin{cases} 1 &amp; (i=j) \\ 0 &amp; (i \neq j ) \end{cases} }"/> </span></p> <p class="footnote"><a href="#fn-34d60474" name="f-34d60474" class="footnote-number">*4</a><span class="footnote-delimiter">:</span><span class="footnote-text">単体(simplex)  n+1個の位置ベクトル<img src="https://chart.apis.google.com/chart?cht=tx&chl=%28%7B%5Cbf%20v%7D_1%2C%7B%5Cbf%20v%7D_2%2C...%2C%7B%5Cbf%20v%7D_%7Bn%2B1%7D%29%20" alt="({\bf v}_1,{\bf v}_2,...,{\bf v}_{n+1}) "/>があり、それらの点がどの部分空間にも含まれない時に  <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cphi_i" alt=" \phi_i"/> は実数で<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Csum_%7Bi%3D1%7D%5E%7Bn%2B1%7D%5Cphi_i%3D1" alt="\sum_{i=1}^{n+1}\phi_i=1"/>かつ<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cphi_1%2C%5Cphi_2%2C...%2C%5Cphi_%7Bn%2B1%7D%20%5Cgeq%200" alt="\phi_1,\phi_2,...,\phi_{n+1} \geq 0"/>を満たす<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Csum_%7Bi%3D1%7D%5E%7Bn%2B1%7D%5Cphi_%7Bi%7D%7B%5Cbf%20v%7D_%7Bi%7D" alt=" \sum_{i=1}^{n+1}\phi_{i}{\bf v}_{i}"/>をn次元単体(simplex)という。  0次元が点,1次元が線,2次元が三角形,3次元が四面体というように図形を分割した時の最小単位を表現しており、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B0%CC%C1%EA%B4%F6%B2%BF%B3%D8">位相幾何学</a>などでも使われる概念。  Dirichlet分布やカテゴリカル分布は単体を作っている。</span></p> <p class="footnote"><a href="#fn-d65d742f" name="f-d65d742f" class="footnote-number">*5</a><span class="footnote-delimiter">:</span><span class="footnote-text">崩壊型ギブスサンプリングなど</span></p> <p class="footnote"><a href="#fn-372a246f" name="f-372a246f" class="footnote-number">*6</a><span class="footnote-delimiter">:</span><span class="footnote-text">log関数はアンダーフロー防止が出来て単調増加で滑らかな凸関数なので都合が良い。</span></p> <p class="footnote"><a href="#fn-94602951" name="f-94602951" class="footnote-number">*7</a><span class="footnote-delimiter">:</span><span class="footnote-text">Jensenの不等式とは  f(x)が上に凸で、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cint%20p%28x%29%20dx%20%3D%201" alt="\int p(x) dx = 1"/>の時、次の不等式が成り立つ  <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20f%5Cleft%28%20%5Cint%20y%28x%29p%28x%29%20dx%20%5Cright%29%20%5Cge%20%5Cint%20f%5Cleft%28y%28x%29%20%5Cright%29p%28x%29%20dx%7D" alt="{\displaystyle f\left( \int y(x)p(x) dx \right) \ge \int f\left(y(x) \right)p(x) dx}"/> </span></p> <p class="footnote"><a href="#fn-e1d2bc64" name="f-e1d2bc64" class="footnote-number">*8</a><span class="footnote-delimiter">:</span><span class="footnote-text"> Kullback–Leibler divergenceは確率分布の類似度。  xが連続変数の時, <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20D_%7BKL%7D%5Cleft%28q%28x%29%5Cmid%20p%28x%29%20%5Cright%29%3D%20%5Cint%20q%28x%29%5Clog%20%5Cfrac%7Bq%28x%29%7D%7Bp%28x%29%7Ddx%20" alt=" D_{KL}\left(q(x)\mid p(x) \right)= \int q(x)\log \frac{q(x)}{p(x)}dx "/>  xが離散変数の時, <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20D_%7BKL%7D%5Cleft%28q%28x%29%5Cmid%20p%28x%29%20%5Cright%29%3D%20%5Csum_x%20q%28x%29%5Clog%20%5Cfrac%7Bq%28x%29%7D%7Bp%28x%29%7D" alt=" D_{KL}\left(q(x)\mid p(x) \right)= \sum_x q(x)\log \frac{q(x)}{p(x)}"/>  <img src="https://chart.apis.google.com/chart?cht=tx&chl=q%28x%29" alt="q(x)"/>と<img src="https://chart.apis.google.com/chart?cht=tx&chl=p%28x%29" alt="p(x)"/>が同じ分布である<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C9%AC%CD%D7%BD%BD%CA%AC%BE%F2%B7%EF">必要十分条件</a>はKL divergenceが0</span></p> <p class="footnote"><a href="#fn-a6454cc7" name="f-a6454cc7" class="footnote-number">*9</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%C6%B4%D8%BF%F4">汎関数</a>のちゃんとした定義はベクトル空間から体への<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%CC%C1%FC">写像</a>です。</span></p> <p class="footnote"><a href="#fn-494337e5" name="f-494337e5" class="footnote-number">*10</a><span class="footnote-delimiter">:</span><span class="footnote-text">Euler-Lagrange方程式   <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%C6%B4%D8%BF%F4">汎関数</a>を<img src="https://chart.apis.google.com/chart?cht=tx&chl=I%5Cleft%28x%28t%29%2C%5Cdot%7Bx%7D%28t%29%20%5Cright%29%20%3D%20%5Cint%20L%20%5Cleft%28x%28t%29%2C%5Cdot%7Bx%7D%28t%29%20%5Cright%29%20dt%20" alt="I\left(x(t),\dot{x}(t) \right) = \int L \left(x(t),\dot{x}(t) \right) dt "/>  とした時、(但し、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cdot%7Bx%7D%28t%29%20%3D%20%5Cfrac%7Bdx%28t%29%7D%7Bdt%7D" alt="\dot{x}(t) = \frac{dx(t)}{dt}"/>) <img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cdisplaystyle%20%0A%5Cfrac%7Bd%7D%7Bdt%7D%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20%5Cdot%7Bx%7D%28t%29%7D%20-%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%C2%A0%20x%28t%29%7D%20%3D%200%0A%7D" alt="{\displaystyle \frac{d}{dt}\frac{\partial L}{\partial \dot{x}(t)} -\frac{\partial L}{\partial&nbsp; x(t)} = 0 }"/>  (詳細や導出などは<a class="keyword" href="http://d.hatena.ne.jp/keyword/PRML">PRML</a>にあった気がする。) </span></p> <p class="footnote"><a href="#fn-9a584bc1" name="f-9a584bc1" class="footnote-number">*11</a><span class="footnote-delimiter">:</span><span class="footnote-text">Lagrangeの未定乗数法  xに<img src="https://chart.apis.google.com/chart?cht=tx&chl=g%28x%29%20%3D%200%20" alt="g(x) = 0 "/>という拘束条件がある場合は定数<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Clambda" alt=" \lambda"/>を使い  <img src="https://chart.apis.google.com/chart?cht=tx&chl=L%27%20%3D%20L%20%2B%20%5Clambda%20g%28x%29" alt="L&#39; = L + \lambda g(x)"/>  としてL'について解くことで拘束条件の下での変分問題を解くことが出来る。  (この詳細も<a class="keyword" href="http://d.hatena.ne.jp/keyword/PRML">PRML</a>に有った気がする。) </span></p> <p class="footnote"><a href="#fn-f054e6bf" name="f-f054e6bf" class="footnote-number">*12</a><span class="footnote-delimiter">:</span><span class="footnote-text"> T. L. Griffiths and M. Steyvers. Finding scientific topics.</span></p> <p class="footnote"><a href="#fn-28715f56" name="f-28715f56" class="footnote-number">*13</a><span class="footnote-delimiter">:</span><span class="footnote-text">Matthew D. Hoffman,David M. Blei,Francis Bach Online Learning for Latent Dirichlet Allocation</span></p> <p class="footnote"><a href="#fn-58e74fad" name="f-58e74fad" class="footnote-number">*14</a><span class="footnote-delimiter">:</span><span class="footnote-text">コサイン類似度  ベクトル化した情報の類似度を測る指標で、二つのベクトル<img src="https://chart.apis.google.com/chart?cht=tx&chl=%7B%5Cbf%20u%7D%2C%7B%5Cbf%20v%7D" alt="{\bf u},{\bf v}"/>の類似は  <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cfrac%7B%7B%5Cbf%20u%7D%20%5Ccdot%20%7B%5Cbf%20v%7D%7D%0A%20%20%20%20%20%20%20%20%20%7B%7B%7C%7C%7B%5Cbf%20v%7D%7C%7C%7D_2%20%7B%7C%7C%7B%5Cbf%20v%7D%7C%7C%7D_2%7D" alt=" \frac{{\bf u} \cdot {\bf v}} {{||{\bf v}||}_2 {||{\bf v}||}_2}"/></span></p> <p class="footnote"><a href="#fn-92cf025c" name="f-92cf025c" class="footnote-number">*15</a><span class="footnote-delimiter">:</span><span class="footnote-text">類似度を取得する関数としてget_similaritiesメソッドも用意されているが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>を見ると「直接使うな」と書いています。</span></p> </div> tdualdir 機械学習エンジニアと名乗れるようになった hatenablog://entry/17391345971616275369 2018-02-14T11:51:57+09:00 2018-02-14T11:51:57+09:00 フルタイムR&Dができる部署に移った。 これでちゃんと機械学習エンジニアと名乗れるようになった。 よろしく。 <p>フルタイムR&amp;Dができる部署に移った。</p> <p>これでちゃんと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B3%D8%BD%AC">機械学習</a>エンジニアと名乗れるようになった。</p> <p>よろしく。</p> <p> </p> tdualdir AI(人工知能)レコメンドサービスのシルバーエッグ・テクノロジーに入社して1ヶ月経った hatenablog://entry/10328749687187267612 2016-10-01T18:45:25+09:00 2016-10-01T20:35:36+09:00 転職して1ヶ月が経ちました。 初めての転職でしたが、希望通りの会社に転職できました。 転職先はシルバーエッグ・テクノロジー株式会社です。 9月27日にマザーズに上場したばかりの最近何かと話題の会社です。 シルバーエッグ・テクノロジーは本日9月27日、東京証券取引所マザーズ市場に上場いたしました。先日より続々と、ここに写りきらないほど沢山のお花や観葉植物、ご祝電等を頂いており、従業員一同心より感謝申し上げます。今後ともより一層のご指導ご鞭撻を賜りますよう、宜しくお願い申し上げます。 pic.twitter.com/6kv8ADnhqm— Silver Egg シルバーエッグ (@silvereg… <p>転職して1ヶ月が経ちました。</p> <p>初めての転職でしたが、希望通りの会社に転職できました。</p> <p> </p> <p>転職先はシルバーエッグ・テクノロジー株式会社です。</p> <p>9月27日にマザーズに上場したばかりの最近何かと話題の会社です。</p> <p><blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">シルバーエッグ・テクノロジーは本日9月27日、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%EC%B5%FE%BE%DA%B7%F4%BC%E8%B0%FA%BD%EA">東京証券取引所</a>マザーズ市場に上場いたしました。先日より続々と、ここに写りきらないほど沢山のお花や観葉植物、ご祝電等を頂いており、従業員一同心より感謝申し上げます。今後ともより一層のご指導ご鞭撻を賜りますよう、宜しくお願い申し上げます。 <a href="https://t.co/6kv8ADnhqm">pic.twitter.com/6kv8ADnhqm</a></p>&mdash; Silver Egg シルバーエッグ (@silvereggtech) <a href="https://twitter.com/silvereggtech/status/780704122559356928">2016年9月27日</a></blockquote><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> <p>どういうことをやっているかというと、AI(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%CD%B9%A9%C3%CE%C7%BD">人工知能</a>)・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B3%D8%BD%AC">機械学習</a>を応用したリコメンドサービスを提供しています。</p> <p>私はそこの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>エンジニア・ウェブ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D9%A5%ED%A5%C3%A5%D1">デベロッパ</a>ーとして入社しました。</p> <p>そこで私の業務スタイルはなかなか<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E6%A5%CB%A1%BC">ユニー</a>クなのでブログに残そうと思いました。</p> <p> </p> <h3>1.リモート開発</h3> <p>シルバーエッグは大阪・東京・ヨーロッパにオフィスを構えてるわけですが、私はその中の東京にいます。シルバーエッグの本社は大阪であり、大阪には多くの優秀なエンジニアがいるのですが、東京支部にはセールスやコンサルの人が大半です。(東京支部にも、もちろん<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B3%D8%BD%AC">機械学習</a>界隈で有名なあの人とかいるわけですけど。)</p> <p>そして、ウェブ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D9%A5%ED%A5%C3%A5%D1">デベロッパ</a>ーとして東京支部にいるのは私一人だけなので基本的に開発はリモートです。ビデオ会議は週2回以上は行い、情報の共有や方針を決めています。また、プロダクトのリリースは週2回のペースなのでプロジェクト管理ツールのチケットやチャットなどでかなり頻繁なやり取りをやっています。</p> <p>一人だけリモートだと向こうの温度感とかわからないんじゃないの?って思うかもしれません。しかし、そんなことはありません。なぜかというと、東京オフィスと大阪オフィスには大きなスクリーンモニターがあり、互いのオフィスの様子が見えるようになっています。ですので、向こうのオフィスでざわついていると何か起こってるなってわかるわけです。リモート開発で不便だと感じたことはありません。</p> <p> </p> <h3>2.飛び交う英語と日本語</h3> <p>私の所属しているチームには当然日本語がしゃべれない人もいるのでビデオ会議やチャットなどは基本的に英語です。前職では業務で英語を喋ったり書いたりする機会が全くなかったので少し不安でしたが、割と何とかなっています。変な英語でも、案外伝わるものなんだなって(笑)コーディングや<a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>の設計の方針などで議論していて激しくなってくると私はめちゃくちゃな英語を使ってしまうのですが、私の意図を理解して適切に返してくれます。(あとで自分のチャットのログなどを見て死にたくなることも多いですが。)</p> <p>ただ、もちろん他のチームやコンサル・セールスの人などは英語を使う必要がない人もいるわけです。彼らがプロダクトのフィードバックを返してくれるわけですけど、プロジェクト管理のチケットを日本語で書くわけです。なので英語のチケットと日本語のチケットが入り混じっています。たまに気付いた人が英語の翻訳をチケット内に書いたりしています。また、ビデオ会議などでも誰かが日本語を喋り出した途端に日本語で議論が続いたりして日本人じゃない人は大丈夫かなって思っていたら、その人が急に日本語で割り込んでいて続いて英語で喋り出すのでその後から英語になるというカオス議論を経験したこともあります。個人的にはこういう感じは嫌いではないのですが、自身の英語力はやっぱり上げないといけないとは思ってリスニングや単語を復習したりなどはしています。英語力は今後の課題です。</p> <p> </p> <h3>まとめ</h3> <p>英語を使ってリモート開発という、なんか<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%EA%A5%B3%A5%F3%A5%D0%A5%EC%A1%BC">シリコンバレー</a>にありそうな感じのスタイルを日本に居ながら体験してるようなものだと私は思っています。</p> <p>あと、シルバーエッグについてはあまり言及しませんでしが、社長がエンジニアということもあってエンジニアが尊敬されている雰囲気が社内にあり非常に快適な環境です。ただ、自分はエンジニアと言ってプログラミング歴もまだ3年に満たず、社内でも一番若いヒヨッコなのでこれからも精進していきたいと思います。あと、英語も!</p> <p> </p> <p> </p> tdualdir 『エンジニアとして世界の最前線で働く選択肢』の感想 hatenablog://entry/10328749687182037723 2016-09-02T19:54:17+09:00 2016-09-05T23:20:59+09:00 竜盛博さんの『エンジニアとして世界の最前線で働く選択肢』を読み終わったので感想を書きます。 エンジニアとして世界の最前線で働く選択肢 ~渡米・面接・転職・キャリアアップ・レイオフ対策までの実践ガイド どんな本か アメリカ(主にシリコンバレー)で働くことに興味がある日本人エンジニア向けに書かれた本です。 メリットだけではなくデメリットもしっかり書いてあって、著者やその周りの人の経験に基づいて公平な立場で書かれています。皆なが気になっている日本との違いやアメリカの社会全体の雰囲気の話はもちろんの事、面接対策やビザ、レイオフ(解雇の種類)のようなテクニックや制度のことについても細部にわたって書いてい… <p>竜盛博さんの『エンジニアとして世界の最前線で働く選択肢』を読み終わったので感想を書きます。</p> <p> </p> <p><a href="https://www.amazon.co.jp/gp/product/4774176567/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=4774176567&amp;linkCode=as2&amp;tag=yoshidir-22">エンジニアとして世界の最前線で働く選択肢 ~渡米・面接・転職・キャリアアップ・レイオフ対策までの実践ガイド</a><img style="border: none !important; margin: 0px !important;" src="http://ir-jp.amazon-adsystem.com/e/ir?t=yoshidir-22&amp;l=as2&amp;o=9&amp;a=4774176567" alt="" width="1" height="1" border="0" /></p> <p><a href="https://www.amazon.co.jp/gp/product/4774176567/ref=as_li_qf_sp_asin_il?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=4774176567&amp;linkCode=as2&amp;tag=yoshidir-22"><img src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;ASIN=4774176567&amp;Format=_SL250_&amp;ID=AsinImage&amp;MarketPlace=JP&amp;ServiceVersion=20070822&amp;WS=1&amp;tag=yoshidir-22" alt="" border="0" /></a><img style="border: none !important; margin: 0px !important;" src="http://ir-jp.amazon-adsystem.com/e/ir?t=yoshidir-22&amp;l=as2&amp;o=9&amp;a=4774176567" alt="" width="1" height="1" border="0" /></p> <p> </p> <h3><strong>どんな本か</strong></h3> <p>アメリカ(主に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%EA%A5%B3%A5%F3%A5%D0%A5%EC%A1%BC">シリコンバレー</a>)で働くことに興味がある日本人エンジニア向けに書かれた本です。</p> <p>メリットだけではなくデメリットもしっかり書いてあって、著者やその周りの人の経験に基づいて公平な立場で書かれています。皆なが気になっている日本との違いやアメリカの社会全体の雰囲気の話はもちろんの事、面接対策やビザ、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%A4%A5%AA%A5%D5">レイオフ</a>(解雇の種類)のようなテクニックや制度のことについても細部にわたって書いているのがこの本の特徴です。</p> <p>そういう意味ではすでにアメリカにいる人でも興味深い内容だろうし、学べることも多いと思います。</p> <p> </p> <h3>気になった内容やトピック(箇条書き)</h3> <ul> <li>まず最初にアメリカに向いている人といない人の話が書いているのがちょっと衝撃的でした。こういう本や記事は大抵アメリカに行った方が良いという話になりがちですが、この本は優秀でもアメリカの雰囲気に合わない人がいるのでそういう人はアメリカに行く必要はないということが書いていて本当に公平に書いてるなと思いました。</li> <li>"<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%EA%A5%B3%A5%F3%A5%D0%A5%EC%A1%BC">シリコンバレー</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%B8%A5%E3%A1%BC%A5%EA%A1%BC%A5%B0">メジャーリーグ</a>"という例えが個人的には好きでした。どういうことかというと、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%EA%A5%B3%A5%F3%A5%D0%A5%EC%A1%BC">シリコンバレー</a>は雇用の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%AE%C6%B0%C0%AD">流動性</a>が高く、会社を何回も転職をする人もいれば引き抜きなども多くあります。これは野球の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%B8%A5%E3%A1%BC%A5%EA%A1%BC%A5%B0">メジャーリーグ</a>に例えるなら、会社が個々のチームで社員が選手ということです。社員(選手)は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%EA%A5%B3%A5%F3%A5%D0%A5%EC%A1%BC">シリコンバレー</a>というリーグにまず所属し、それからどこかの企業というチームに入る。チーム間の移籍などが頻繁にあるという感じです。</li> <li>転職の面接テクニックを詳細に書いているのが面白かったです。電話面接ではリモートでコードを書くのでヘッドセットを使うべき、ホワイトボードコーディング面接では後で書き込めるようにスペースを空けて書くべきなどすごい細かいテクニックが書いていました。また、面接に出そうな<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%EB%A5%B4%A5%EA%A5%BA%A5%E0">アルゴリズム</a>の問題なども書いていて著者の意気込みを感じました。</li> <li>また、有名企業の面接の多くが一日にわたって数回面接するというのが辛そうでした。日本だとせいぜい1,2時間程度の面接が日をまたいで複数回ある感じでしょうか?一日中ぶっ続けで面接するのは疲れそうです。</li> <li>キャリアについては日本と全く違う感じでした。日本だと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE%A1%BC">プログラマー</a>は35歳で定年でそのあとはマネージャーになるというのがありがちなキャリアです。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%EA%A5%B3%A5%F3%A5%D0%A5%EC%A1%BC">シリコンバレー</a>では、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE%A1%BC">プログラマー</a>のキャリアとマネージャーのキャリアが別にあります。ずっと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE%A1%BC">プログラマー</a>をやって給料を上げていくことも可能ですし、申請して途中からマネージャーの仕事もやってみることもできます。なかなか柔軟な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AD%A5%E3%A5%EA%A5%A2%A5%D1%A5%B9">キャリアパス</a>があるのはいいですね。</li> <li>他にも日本と違うのは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%A4%A5%AA%A5%D5">レイオフ</a>という解雇制度です。企業の都合で社員を解雇することを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%A4%A5%AA%A5%D5">レイオフ</a>と言います。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%A4%A5%AA%A5%D5">レイオフ</a>されるなんてたまったもんじゃないってイメージがありましたが、実は真逆で、数ヶ月分(多くて半年以上)の手当てが会社から出る場合があるので、余暇に使ったりのんびり転職活動をする人が多いそうです。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%A4%A5%AA%A5%D5">レイオフ</a>があることがわかると自ら<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%A4%A5%AA%A5%D5">レイオフ</a>してくれって頼む人も珍しくないとか(笑)</li> <li>この話が一番好きなんですが、最後の方にアメリカから突出した企業が出てくる理由として"雇用の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%AE%C6%B0%C0%AD">流動性</a>"のおかげで良い会社には良い人材が集まりやすいからという話があってなるほどと思いました。</li> </ul> <h3>全体の感想</h3> <p>アメリカにはいずれ行きたいなと思っていたけど、あまりアメリカの制度について調べたことがなかったので非常に勉強になりました。アメリカに行きたい欲が高まってきます。次の転職くらいには考えてもいいかな?</p> <h3> その他</h3> <p>アメリカで行われた出版記念講演会の動画を見つけたので貼っておきます。</p> <h1 class="watch-title-container" style="margin: 0px; padding: 0px; border: 0px; background-color: transparent; font-weight: normal; font-size: 20px; vertical-align: top; width: 457.5px; line-height: normal; word-wrap: break-word; color: #000000; font-family: Roboto, arial, sans-serif;"> </h1> <p><iframe src="https://www.youtube.com/embed/bjHox2hFW6g" width="560" height="315" frameborder="0" allowfullscreen=""></iframe></p> <p>本の内容も少し話しています。</p> <p> </p> <p> </p> tdualdir 『Python機械学習プログラミング』を読む。第1章、第2章 hatenablog://entry/10328749687179441901 2016-08-16T22:57:31+09:00 2016-09-02T19:58:40+09:00 Raschkaの「Python機械学習プログラミング」の日本語版が出たので読んでいきます。 Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear) 第1章「データ から 学習 する 能力」 を コンピュータ に 与える 概要でした。 教師あり、教師なし、強化学習の軽い説明と前処理やPythonの話でした。 網羅的な本で強化学習の説明をしている本を初めて見た気がします。多くの場合は「ただし強化学習は除く」と注釈がついているもんですよね。 第2章「データ から 学習 する 能力」 を コンピュータ に 与える パーセプトロン、adali… <p>Raschkaの「<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B3%D8%BD%AC">機械学習</a>プログラミング」の日本語版が出たので読んでいきます。</p> <p> </p> <p><a href="https://www.amazon.co.jp/gp/product/4844380605/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=4844380605&amp;linkCode=as2&amp;tag=yoshidir-22">Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)</a><img style="border: none !important; margin: 0px !important;" src="http://ir-jp.amazon-adsystem.com/e/ir?t=yoshidir-22&amp;l=as2&amp;o=9&amp;a=4844380605" alt="" width="1" height="1" border="0" /></p> <p><a href="https://www.amazon.co.jp/gp/product/4844380605/ref=as_li_qf_sp_asin_il?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=4844380605&amp;linkCode=as2&amp;tag=yoshidir-22"><img src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;ASIN=4844380605&amp;Format=_SL250_&amp;ID=AsinImage&amp;MarketPlace=JP&amp;ServiceVersion=20070822&amp;WS=1&amp;tag=yoshidir-22" alt="" border="0" /></a><img style="border: none !important; margin: 0px !important;" src="http://ir-jp.amazon-adsystem.com/e/ir?t=yoshidir-22&amp;l=as2&amp;o=9&amp;a=4844380605" alt="" width="1" height="1" border="0" /></p> <p> </p> <h3>第1章「データ から 学習 する 能力」 を コンピュータ に 与える</h3> <p>概要でした。</p> <p>教師あり、教師なし、強化学習の軽い説明と前処理や<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>の話でした。</p> <p>網羅的な本で強化学習の説明をしている本を初めて見た気がします。多くの場合は「ただし強化学習は除く」と注釈がついているもんですよね。</p> <h3>第2章「データ から 学習 する 能力」 を コンピュータ に 与える</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D1%A1%BC%A5%BB%A5%D7%A5%C8%A5%ED%A5%F3">パーセプトロン</a>、adalineの説明と<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>での実装でした。</p> <p>irisという花の分類を例にやりました。</p> <p>データは<a class="keyword" href="http://d.hatena.ne.jp/keyword/csv">csv</a>がurlをたたいて取得できるようになっているのでデータの取得で困ることや面倒になることはなかったです。</p> <p>データの扱いは基本的にnumpyとpandasでやります。pandasのdataframeの扱いなどは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>でデータサイエンスやる際に必須となっているのでいいですね。</p> <p>理論の説明は簡潔で分かりやすいです。数式がしっかり書いているので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%FE%B7%C1%C2%E5%BF%F4">線形代数</a>・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%C0%D1">微積</a>分程度の知識は必要かもしれません。また、数式とコードの対応がわかるようにコード中に数式のコメントがあるのも良かったです。</p> <p>本全体を通して可視化にこだわっているので、pyplotの扱いに慣れるのにはちょうどいい感じもあります。</p> <p>サンプルコードをjupyterで実行したものを<a class="keyword" href="http://d.hatena.ne.jp/keyword/github">github</a>に上げています。</p> <p>見ればどんな感じの内容かわかると思います。</p> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="Tdual/PythonML" src="//hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2FTdual%2FPythonML" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://github.com/Tdual/PythonML">github.com</a></cite></p> <h3>まとめ</h3> <p>教育的に書かれているので独りでも読めますし、勉強会などの教材にぴったりかもしれません。</p> <p>続きも読んでいきます。</p> <p> </p> <p> </p> <p> </p> tdualdir