tag:blogger.com,1999:blog-41176382088838152822024-03-05T15:35:59.656+09:00satomacotosatomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.comBlogger201125tag:blogger.com,1999:blog-4117638208883815282.post-29157853261022543702015-02-25T09:00:00.000+09:002015-02-25T09:00:08.827+09:00Yahoo!競馬の情報から直近5走のデータを取得して縦馬柱をipython notebookで表示する<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFY_UblT-ujziAy-xhzUwrDU6OS2KR9C3pqUJd9JyUzbhYycdUKmI84zxwzcP3c6jsya8vDSNUjCsplC5aUfR6zZOaoC_OanTZUsmSfP4NfqKL8i4M12d2lMqb24QiT1jqGCTqwfreTbXu/s1600/keiba.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFY_UblT-ujziAy-xhzUwrDU6OS2KR9C3pqUJd9JyUzbhYycdUKmI84zxwzcP3c6jsya8vDSNUjCsplC5aUfR6zZOaoC_OanTZUsmSfP4NfqKL8i4M12d2lMqb24QiT1jqGCTqwfreTbXu/s320/keiba.png" /></a><br />
<br />
ipythonとpandasとlxmlをインストールしておいてipython notebookを起動<br />
<br />
<pre>pip install ipython\[all\]
pip install pandas
pip install lxml
ipython notebook
</pre><br />
でnotebook上で<br />
<br />
<script src="https://gist.github.com/satomacoto/0d0cc58e3bbcaea68148.js"></script><br />
to_htmlでclassも設定できるのでhtmlファイルに吐き出した後cssつければ見やすくできるかも.表示だけじゃなくてpandasでデータ処理して色々すればおもしろいか.勝馬予想するとかdoc2vec使って名前で配合するとか.satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-866943746646816602015-02-04T11:38:00.001+09:002015-02-05T18:50:00.018+09:00doc2vecに類似ラベル・ワードを探すメソッドの追加<p>word2vecはワードに対してベクトルを割り当てるが、doc2vec(aka paragraph2vec, aka sentence embeddings)は各ドキュメントに付けられたラベルに対してもベクトルを割り当てる。</p><p><a href="http://radimrehurek.com/gensim/models/doc2vec.html">gensimのdoc2vec</a>はword2vecの拡張として<a href="http://arxiv.org/abs/1405.4053">Distributed Representations of Sentences and Documents</a>の実装されている。チュートリアルは<a href="http://radimrehurek.com/2014/12/doc2vec-tutorial/">これ</a>。</p><p>似ているワードやドキュメントを取ってくるmost_similarというメソッドがあるが、ワードなのかラベルなのかは区別されない。そこで元のプロジェクトをフォークして限定して取得できるようにした。</p><blockquote><p><a href="https://github.com/satomacoto/gensim">satomacoto/gensim</a></p></blockquote><p>フォーク先のブランチからインストールためにはzipを使ってpip install。</p><br />
<b>追記 2015/2/5</b><br />
<br />
negativeオプションが効かなかったのを修正。<br />
<br />
<pre class="prettyprint"><code class=" hljs ruby"><span class="hljs-variable">$ </span>pip install -<span class="hljs-constant">U</span> <span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/github.com/satomacoto</span><span class="hljs-regexp">/gensim/archive</span><span class="hljs-regexp">/doc2vec-mostSimilarWordsAndLabels.zip</span></code></pre><p>追加したメソッドはmost_similar_labelsとmost_similar_words。またワードのリストのリストをドキュメント群としてみなすためにLabeledListSentenceクラスを追加。各ドキュメントには順番に<code>SENT_0</code>, <code>SENT_1</code>…とラベルが振られる。ラベルは複数振ることができるのでクラスは自分で書いたほうがいいかも。実装は<a href="https://github.com/satomacoto/gensim/compare/doc2vec-mostSimilarWordsAndLabels">これ</a>。</p><p>以下サンプル。</p><script src="https://gist.github.com/satomacoto/efce940c067ee962d4e5.js"></script><code>SENT_0</code>と一番に似てるのは<code>SENT_7</code>ということだが…</p>satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-9899859180778854552015-02-03T14:43:00.001+09:002015-02-04T11:17:40.580+09:00VagrantにPylearn2の環境を作りipython notebookで使う<a href="http://deeplearning.net/software/pylearn2/">Pylearn2</a>のOther methodsにあるように<a href="https://www.vagrantup.com/">Vagrant</a>, <a href="https://www.virtualbox.org/">VirtualBox <br />
</a>を使って試せるようにする。そして<a href="http://ipython.org/ipython-doc/2/install/install.html">ipython</a>のすべてをインストール。<br />
<pre><code>git clone git@github.com:ironchief/pylearn2_vagrant.git
cd pylearn2_vagrant
vagrant up
vagrant ssh -- -L 8888:localhost:8888
sudo pip install ipython\[all\]
ipython notebook
</code></pre>あるいはsshで入れるようにするときはVagrantfileに<br />
<pre><code>config.vm.network "forwarded_port", guest: 8888, host: 8888
</code></pre>を記述して<code>vagrant up</code>か<code>vagrant reload</code>して<br />
<pre><code>vagrant ssh
ipython notebook --ip=0.0.0.0
</code></pre>とする。<br />
起動が確認できたらブラウザから <a href="http://localhost:8888/">http://localhost:8888</a> にアクセスする。<br />
<br />
<h4 id="references">References</h4><ul><li><a href="http://qiita.com/wwacky/items/133e81bd5cd558b27b7b">vagrantで作ったVMでipython notebookを立ち上げてローカルからアクセスする - Qiita</a></li>
<li><a href="http://www.swegler.com/becky/blog/2013/08/09/running-ipython-notebook-from-vagrantvirtualbox/">Running iPython Notebook From Vagrant/VirtualBox | Computers are for People</a></li>
</ul>satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-71993694294296746482013-10-26T17:48:00.000+09:002013-10-26T17:49:24.793+09:00極大2部クリーク<blockquote>グラフ $G = (V = V_1 \cup V_2, A)$ の任意の枝が$V_1$と$V_2$の頂点を結ぶ枝であるとき,$G$は2部グラフとよばれる.$G$の頂点部分集合 $H\subseteq V_1$, $K\subseteq V_2$ に対して,$H$の任意の頂点と$K$の任意の頂点の間に枝があるとき,$H$と$K$を合わせた頂点集合を2部クリークとよぶ.$K=\emptyset$, $H=V_1$ である場合,あるいはその逆である場合も2部クリークである.ある2部クリークが他の2部クリークに含まれないとき,その2部クリークを極大2部クリークとよぶ (via <a href="http://research.nii.ac.jp/~uno/papers/0307la.pdf">宇野 毅明, 有村 博紀, 浅井 達哉, 極大2部クリークの高速列挙法とデータマイニングへの応用, 夏のLAシンポジウム, 2003年7月</a>)</blockquote><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ2ffyEXlpYgt-XDT9B_bycBYCevquN5QlfKa40qaNkJXqTA_l7u8T3KcrTcDkh-iLjkOzC-P3Kl2uTONTLJjf2hGjBTPXreAVQ4J_6lZ0D0Ua6v9O1Uth_o3phcv2v7xk0nXAaU8zs4pd/s1600/bipartite-clique.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="284" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ2ffyEXlpYgt-XDT9B_bycBYCevquN5QlfKa40qaNkJXqTA_l7u8T3KcrTcDkh-iLjkOzC-P3Kl2uTONTLJjf2hGjBTPXreAVQ4J_6lZ0D0Ua6v9O1Uth_o3phcv2v7xk0nXAaU8zs4pd/s640/bipartite-clique.png" width="320" /></a><br />
<br />
</td></tr>
<tr><td class="tr-caption" style="text-align: center;">(v0,v1,v2,v5,v6), (v2,v5,v6,v8), (v2,v3,v8), (v3,v7,v8,v9), (v3,v4,v9)がそれぞれ極大2部クリーク.</td></tr>
</tbody></table><br />
<a href="http://research.nii.ac.jp/~uno/codes.htm">program codes</a>よりLCM ver. 5.3をダウンロード.使い方は<a href="http://research.nii.ac.jp/~uno/code/lcm.html">lcm readme</a>に.ここでは極大2部クリークの計算だけ利用する.以下上図の例.各行は各ノードの隣接リスト.たとえばノード0には5,6へのエッジがあることを示す.<br />
<br />
<pre>% cat input
% ./lcm53/lcm CI input 1 output
5 6
5 6
5 6 8
7 8 9
9</pre><br />
結果は以下.最初の2行はHが空集合の場合か.これら以降をみると「6,5」と「0,1,2」などが極大2部クリークになっていることがわかる.<br />
<br />
<pre>% cat output
0 1 2 3 4
6 5
0 1 2
9
3 4
8
2 3
8 6 5
2
7 9 8
3
</pre>satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-82948777584716405192013-04-27T13:24:00.000+09:002013-05-06T16:15:27.737+09:00KDD Cup 2013 - Author-Paper Identification ChallengeのメモKDD Cup 2013のタスクは2つ。その1つはMicrosoft Academic Search (MAS)の文献検索での著者の名前の曖昧性がテーマ。<br />
<br />
MASの文献は<br />
<br />
- 同じ著者が色んな名前で登録されてる<br />
- 違う著者が同じ名前で登録されてる<br />
<br />
という名前の曖昧性のせいで文献に対して著者がちゃんと割り当てられない。そこでタスクは、ノイズを含んだ著者と論文の組み合わせを入力して、本物の著者と論文の組み合わせを出力するというもの。<br />
<br />
色々準備されてるのでとっかかりやすい。<br />
<br />
- 説明 / <a href="https://www.kaggle.com/c/kdd-cup-2013-author-paper-identification-challenge/">Description - KDD Cup 2013 - Author-Paper Identification Challenge - Kaggle</a><br />
- チュートリアル / <a href="https://github.com/benhamner/Kdd2013AuthorPaperIdentification">git://github.com/benhamner/Kdd2013AuthorPaperIdentification.git</a><br />
- もう一方 / <a href="https://www.kaggle.com/c/kdd-cup-2013-author-disambiguation/data">Data - KDD Cup 2013 - Author Disambiguation - Kaggle</a><br />
<br />
<h3>データ</h3><br />
詳細は<a href="https://www.kaggle.com/c/kdd-cup-2013-author-paper-identification-challenge/data">Data - KDD Cup 2013 - Author-Paper Identification Challenge - Kaggle</a>。<br />
<br />
<b>数</b><br />
<br />
- paperauthor : 12775821<br />
- trainconfirmed : 123447<br />
- traindeleted : 112462<br />
- validpaper : 90088<br />
<br />
- author : 247203<br />
- paper : 2257249<br />
- journal : 15151<br />
- conference : 4545<br />
<br />
<h3>入出力</h3><br />
<b>入力</b><br />
<br />
著者のIDと文献のIDのリスト<br />
<br />
<pre># SELECT * FROM validpaper LIMIT 5;
authorid | paperid
----------+---------
55 | 2507
55 | 15471
55 | 19294
55 | 20444
55 | 24074
(5 rows)</pre><br />
<b>出力</b><br />
<br />
著者のIDとスペース区切りの文献のID<br />
<br />
<pre>% head -n2 Submissions/basicCoauthorBenchmarkRev2.csv
AuthorId,PaperIds
2080775,2200312 1047104 280462 1467879</pre><br />
<br />
<h3>チュートリアル</h3><br />
<a href="https://github.com/benhamner/Kdd2013AuthorPaperIdentification">benhamner/Kdd2013AuthorPaperIdentification · GitHub</a>に載っているチュートリアルで。<a href="http://scikit-learn.org/stable/">scikit-learn</a>の<a href="http://en.wikipedia.org/wiki/Random_forest">Random forest</a>の実装を使っている。trainconfirmedを正例、traindeletedを負例として学習し、validpaperを判別している。<br />
<br />
PostgreSQLのバックアップを配布してくれているので、PostgreSQLのインストール。<br />
<pre>brew install postgresql</pre>データベース作成。<br />
<pre>createdb Kdd2013AuthorPaperIdentification</pre>復元。<br />
<pre>pg_restore -Fc -U [ユーザ名] -d Kdd2013AuthorPaperIdentification dataRev2.postgres</pre>起動。<br />
<pre>postgres -D /usr/local/var/postgres</pre>確認。<br />
<pre>psql -l</pre>接続。<br />
<pre>psql Kdd2013AuthorPaperIdentification</pre><br />
PythonBenchmark内のSETTINGS.jsonのファイル出力先とuser名を変更しておく。<br />
<br />
実行のために必要なpsycopg2のような必要なモジュールはエラーを見て何が足りないか確認して適宜pipでインストール。<br />
<pre>sudo pip install psycopg2</pre><br />
- <a href="http://scikit-learn.org/dev/modules/generated/sklearn.ensemble.RandomForestClassifier.html">8.7.1. sklearn.ensemble.RandomForestClassifier — scikit-learn 0.14-git documentation</a><br />
<br />
<b>特徴量</b><br />
<br />
authoridとpaperidを基に以下の値をテーブルから取ってくる。<br />
<br />
- AuthorJournalCounts (著者のジャーナル数)<br />
- AuthorConferenceCounts (著者の会議数)<br />
- AuthorPaperCounts (著者の文献数)<br />
- PaperAuthorCounts (文献の著者数)<br />
- SumPapersWithCoAuthors (共著者との文献数の和)<br />
<br />
<b>ターゲット</b><br />
<br />
trainconfirmedが1、traindeletedが0。<br />
<br />
<b>パラメータ</b><br />
<pre>RandomForestClassifier(n_estimators=50,
verbose=2,
n_jobs=1,
min_samples_split=10,
random_state=1)
</pre><br />
<b>結果</b><br />
<br />
<pre>0.85078</pre><br />
ちなみに何も学習せずだと<br />
<br />
<pre>0.67551</pre>satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-65563535667634644102013-04-05T17:00:00.000+09:002013-04-05T17:00:58.631+09:00PythonでWebサイトのビデオを抽出してYouTube Data APIクライアントでプレイリストに登録するYouTube系まとめサイトの動画を流しっぱなしにしておくために,以前herokuにRailsで<a href="http://draft.blogger.com/post-tube.satomacoto.com">post-tube.satomacoto.com</a>というのを自分用につくった.が,無料で使えるデータベースの制限を超えちゃってたので,WebサイトのYouTubeへのリンクを抽出してYouTubeのPlaylistに登録するPythonのスプリクトをやっつけで書いてみた.こんな風にプレイリストを作成する→<a href="http://www.youtube.com/user/stmct/videos">http://www.youtube.com/user/stmct/videos</a>.忘れたときのためにメモ.<br />
<br />
<br />
<h3>Google Data API</h3><br />
Google Data APIを使ってYouTubeのプレイリスト作成や動画登録を行う.Pythonから操作するために<a href="https://code.google.com/p/gdata-python-client/">gdata-python-client</a>が用意されている.このサイトからダウンロードした gdata-...zip を解凍したら<br />
<br />
<pre>sudo python setup.py install</pre><br />
でインストール.<br />
<br />
使い方は<br />
<br />
<a href="https://developers.google.com/youtube/1.0/developers_guide_python">Developer's Guide: Python - YouTube — Google Developers</a><br />
<br />
<br />
<h3>APIキーの取得</h3><br />
<a href="http://code.google.com/apis/youtube/dashboard/">http://code.google.com/apis/youtube/dashboard/</a>でAPIキーを取得する.<br />
<br />
<br />
<h3>ClientLogin</h3><br />
ローカルで動かすのでClientLoginで認証する.認証はPlaylistの作成や動画の登録に必要.下記のスクリプトでは以下の部分を設定する.YouTubeのアカウント名は http://www.youtube.com/user/stmct だったらstmctにあたるところ.Googleを2段階認証にしている場合は<a href="http://support.google.com/accounts/bin/answer.py?hl=ja&answer=185833">アプリケーション固有のパスワードを生成</a>する.<br />
<br />
<pre>username = 'YouTubeのアカウント名'
email = 'APIキーを取得したGoogleのアカウント名'
password = 'Googleのパスワード'
developer_key = '取得したAPIキー'</pre><br />
<br />
<h3>コード</h3><br />
使い方<br />
<br />
<pre>python youtube_gdata_create_playlist.py http://...</pre><br />
汚いコードだな…<br />
<br />
<script src="https://gist.github.com/satomacoto/5246248.js"></script><br />
<br />
<br />
<h3>...</h3><br />
<ul><li>NAVERみたいに次のページがある場合に対応するか</li>
<li>人がまとめたものを使うってのはまずいのかな</li>
<li>post-tube.satomacoto.comってどうやってつくったんだっけかな</li>
<li>連続再生だけが目的じゃなくてサイトごとにどんなビデオが貼り付けられているかとか自分の再生履歴やらお気に入りやらで何かしようとか思ってたんだっけ</li>
<li>プレイリストの履歴は取れないからな…</li>
</ul>satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-33865053398041286212013-04-02T23:29:00.000+09:002013-04-03T01:15:36.765+09:00語/語の組み合わせの大人らしさ検索エンジンにクエリを投げて,セーフサーチのオン/オフを切り替えたときに返ってきた件数をうまいことして,語/語の組み合わせの大人度合いが測れないかと思ったけどあんまりうまくいかなかった.<br />
<br />
<br />
<h3>イメージ</h3><br />
すっごく単純にすると<br />
<br />
<ul><li>大人な語</li>
<ul><li>語がどれほど大人か</li>
<li>$$大人(眼球) = \log \frac{n(眼球, off)}{n(眼球, strict)}$$</li>
<li>ただしn(q,a)はクエリqのセーフサーチの設定aのoff/moderate/strictのとき結果件数.検索結果が0件の場合もあるだろうから分母には1足しておいてもいい.</li>
</ul><li>大人な組み合わせ</li>
<ul><li>語を組み合わせることでどれくらい大人っぽくなるか</li>
<li>$$大人組(目玉, 玉子) = \log \frac{n(目玉 and 玉子, off)}{n(目玉 and 玉子, strict)} - 大人(目玉) - 大人(玉子)$$</li>
</ul></ul><br />
みたいな感じ.あんま考えてないのでこれで比較ができるかわかんないけど.大人がゲシュタルト崩壊…<br />
<br />
<br />
<h3>でも</h3><br />
普通に考えてセーフサーチが強いほうが検索結果少ないだろ,と思ってたら,<br />
<blockquote class="tr_bq">眼球 - Google 検索<br />
セーフサーチ: オフ<br />
約 57,800,000 件 (0.20 秒) </blockquote><blockquote class="tr_bq">眼球 - Google 検索<br />
セーフサーチ: 強<br />
約 71,800,000 件 (0.19 秒) </blockquote>セーフサーチ強のほうが多いこともある…どういうことだってばよ<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjilUPw9eNp82zhrwaYalfkyA0JzzP1WM1NiG5mLvxiMaVGp-p6KPCZkTwUy3-XEX-25Y0Lfmbz71t4D0VnRd5VeGlSPGc5tpy5CYmihpZ_YHoT-gfEkqohuaLC7qb4fl7ikfHH9o46rMxR/s1600/Screen+Shot+2013-04-02+at+10.38.57+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="107" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjilUPw9eNp82zhrwaYalfkyA0JzzP1WM1NiG5mLvxiMaVGp-p6KPCZkTwUy3-XEX-25Y0Lfmbz71t4D0VnRd5VeGlSPGc5tpy5CYmihpZ_YHoT-gfEkqohuaLC7qb4fl7ikfHH9o46rMxR/s640/Screen+Shot+2013-04-02+at+10.38.57+PM.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8Cm_852o__5RgXU8-DxbOy-kTTAG2QETgMklg0Ka9-qsz7Qzp8rIdtMbkX6j3VroSS71hUzG6sH12jnYoDBMfvkEWbfoJlVQefLSYwVkRgAvFXmC6iJpmkno5c46952ABMOFvKCpcAMlq/s1600/Screen+Shot+2013-04-02+at+10.38.38+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="93" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8Cm_852o__5RgXU8-DxbOy-kTTAG2QETgMklg0Ka9-qsz7Qzp8rIdtMbkX6j3VroSS71hUzG6sH12jnYoDBMfvkEWbfoJlVQefLSYwVkRgAvFXmC6iJpmkno5c46952ABMOFvKCpcAMlq/s640/Screen+Shot+2013-04-02+at+10.38.38+PM.png" width="320" /></a></div><br />
Bingもあんま変わらん.そういうもんなのかな.<br />
<br />
<br />
ちなみにWebの検索結果件数を使って人間関係を抽出している論文(件数だけじゃないけど)→<a href="http://scholar.google.com/scholar?q=related:MLc-S8DWcnoJ:scholar.google.com">Web 上の情報からの人間関係ネットワークの抽出</a><br />
<br />
<br />
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=satomacoto-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4334751040" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-56107526153206357842013-03-31T11:51:00.000+09:002013-03-31T11:58:17.514+09:00Pythonの辞書をvalue値でソートするコードの実行時間の比較get,lambda,itemgetter,zipを使ったvalue値でのソートを比較してみた.<br />
以下コード.<br />
<br />
<script src="https://gist.github.com/satomacoto/5279273.js"></script><br />
<br />
timeitで計測.<br />
<br />
<blockquote>>>> import timeit<br />
>>> timeit.timeit(stmt='get.sort_test()', setup='import get', number=10000)<br />
0.6642911434173584<br />
>>> timeit.timeit(stmt='itemgetter.sort_test()', setup='import itemgetter', number=10000)<br />
0.6961650848388672<br />
>>> timeit.timeit(stmt='zip.sort_test()', setup='import zip', number=10000)<br />
0.6995840072631836<br />
>>> timeit.timeit(stmt='lamb.sort_test()', setup='import lamb', number=10000)<br />
0.7502970695495605</blockquote><br />
ただし<br />
<ul><li>zipの場合(value, key)のリストになる</li>
<li>getの場合keyのリストになる(value値は返さない)</li>
</ul>に注意.<br />
<br />
よく見かけるのはlambdaを使うものだが,同じ結果を得たかったらoperator.itemgetterを使うほうが少し早い.上位だけ取ってきたいときはgetが早いかも.<br />
<br />
他にもやり方があるだろうか.satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-8926768093115640312013-03-27T14:32:00.002+09:002013-03-27T15:00:02.363+09:00bl.ocks.orgで青空文庫で変なルビ使いをする作者の関係の可視化<a href="http://bl.ocks.org/">bl.ocks.org</a>を使って,青空文庫のルビを抽出し,「漢字《ひらがな》」でないルビを見つけ,同じようなルビの使い方をしている作者の関係を可視化してみた.「変な」は語弊があるかも.D3.js.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://bl.ocks.org/satomacoto/5251189" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="203" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDqPAWrCiZ3GpwfBH_cc0AER_n8dwVAiJORMCkNfZhe2NIcipTNSGAD201m7dgmlcmsRXgazVWpMns7lTUSErjKD3mHF1SzbvFkWuYHWWTTzXzyRIhaijYJVaQDjuKWTpY4XMzbJc_RHMT/s640/Authors+Relationships+based+upon+Not+kanji+hiragana+Rubis.png" width="320" /></a></div><br />
Authors Relationships based upon Not-kanji-hiragana Rubis<br />
<blockquote><a href="http://bl.ocks.org/satomacoto/5251189">http://bl.ocks.org/satomacoto/5251189</a></blockquote>このページは以下のGistから生成<br />
<blockquote><a href="https://gist.github.com/satomacoto/5251189">https://gist.github.com/satomacoto/5251189</a></blockquote><br />
bl.ocks.orgは<a href="https://gist.github.com/">GitHub Gist</a>ビューア.Gistにいくつかのファイルを置くとwebページとして見れるようになる.Gistの基本構成は以下.<br />
<br />
<ul><li>index.html</li>
<li>README.md</li>
<li>thumbnail.png</li>
</ul><br />
<i>index.html</i>に表示させるソースコード,<i>README.md</i>にMarkdown形式で説明を記述,<i>thumbnail.png</i>に<a href="http://bl.ocks.org/satomacoto">Gist一覧</a>のためのサムネール画像.Gistに他のファイルを置くと相対的にリンクを張ることができる.絶対パスも記述可能.Gistをブログのように使えるかも.<br />
<br />
<br />
作者の同じようなルビ使い関係は,たとえば「亜米利加《アメリカ》」というルビを二人の作者が振っていたらその作者同士に関係がある,と定義した.重み付けなど詳細はまた他で.可視化したのはすべての関係ではない.同じようなルビの使い方をしている作者の関係からなんか他の作者の関係(同じ時代とか思想とか)見えないかなと考えていたのだけどどうだろうか.ちなみに変わったルビ使いの例を少しだけ挙げると<br />
<blockquote>003659 000050 仏蘭西 フランス<br />
046340 001234 亜米利加人 ヤンキー<br />
048416 000050 遍路芸人 ジプシイ<br />
050424 001421 辯證的な性質 デイヤレクテイツシエナツール<br />
000085 000879 童貞聖麻利耶様 ビルゼンサンタマリヤさま<br />
001317 000125 吾れ直ちに悪魔と一つになるを誰が妨ぎ得べきや ヴァス・ヒエルテ・ミッヒ・ダス・イヒス・ニヒト・ホイテ・トイフェル</blockquote>といったようなものがある.クラスタリングして色変えればよかったかも.<br />
<br />
<br />
あと4日で無職\(^o^)/satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com1tag:blogger.com,1999:blog-4117638208883815282.post-7309410508440876302013-02-26T16:41:00.000+09:002013-06-29T16:04:08.744+09:00機械学習に関するメモ<a href="http://en.wikipedia.org/wiki/Machine_learning">機械学習</a>の目的は与えられたデータ$\mathcal{D}$から関数$$y = f(\mathbf{x})$$を求めること。ただし、$\mathbf{x}$は入力、$y$は出力(ターゲット)。<br />
<br />
<ul><li>代表的な手法は出力とアルゴリズムのタイプで以下のように分けられる。<br />
<br />
<table align="center" border="1" cellspacing="0"><tbody>
<tr><td></td><td>出力 - クラス</td><td>出力 - 数値</td></tr>
<tr><td><a href="http://en.wikipedia.org/wiki/Supervised_learning">教師あり学習</a></td><td>分類</td><td>回帰</td></tr>
<tr><td><a href="http://en.wikipedia.org/wiki/Unsupervised_learning">教師なし学習</a></td><td>クラスタリング</td><td>次元削減</td></tr>
</tbody></table><br />
</li>
<li>「クラス」っていうのは、<a href="http://en.wikipedia.org/wiki/Spam_(Monty_Python)">スパム</a>メールかどうか、とか、<a href="http://en.wikipedia.org/wiki/Facial_recognition_system">誰の顔か</a>、とか。</li>
<li>機械学習のアルゴリズムには他にも<a href="http://en.wikipedia.org/wiki/Semi-supervised_learning">半教師あり学習</a>や<a href="http://en.wikipedia.org/wiki/Ensemble_learning">アンサンブル学習</a>、<a href="http://en.wikipedia.org/wiki/Reinforcement_learning">強化学習</a>、<a href="http://en.wikipedia.org/wiki/Multi-task_learning">マルチタスク学習</a>(転移学習)などがある。</li>
<li><a href="http://en.wikipedia.org/wiki/Pattern_recognition">パターン認識</a>では推論問題の手法であるクラス<a href="http://en.wikipedia.org/wiki/Sequence_labeling">系列ラベリング</a>(<a href="http://en.wikipedia.org/wiki/Conditional_random_field">CRFs</a>, <a href="http://en.wikipedia.org/wiki/Hidden_Markov_model">HMMs</a>...)や数値系列ラベリング(<a href="http://en.wikipedia.org/wiki/Kalman_filter">Kalman Filter</a>, <a href="http://en.wikipedia.org/wiki/Particle_filter">Particle Filter</a>...)なども扱われる。</li>
<li><a href="http://en.wikipedia.org/wiki/Generative_model">生成モデル</a>的アプローチと<a href="http://en.wikipedia.org/wiki/Discriminative_model">識別モデル</a>的アプローチ。</li>
<li>オンライン学習(新しいデータがくるごとに関数を更新)とバッチ学習(全データから関数を学習)。</li>
<li>ついでに入力がクラスか数値かによって手法を探すとよい。</li>
<li>...</li>
<li>関連研究を概観したいときは「hogehoge survey」でなんか引っかかったらラッキー。</li>
</ul><br />
<br />
<br />
<h3>分類</h3><br />
<ul><li>入力$\mathbf{x}$に対する出力(クラス)$y$を求める関数を訓練データ$\mathcal{D} = \{(\mathbf{x}_1, y_1), ..., (\mathbf{x}_n, y_n)\}$から学習する。</li>
<li>パラメトリックな手法とノンパラメトリックな手法に分けられる(パラメトリックな手法というのはデータの母集団の母数を仮定するもの)。</li>
<li>決定木、ナイーブベイズ分類器、k近傍法、アンサンブル学習...</li>
<li><a href="http://en.wikipedia.org/wiki/Statistical_classification">http://en.wikipedia.org/wiki/Statistical_classification</a></li>
<li><a href="http://en.wikipedia.org/wiki/Category:Classification_algorithms">http://en.wikipedia.org/wiki/Category:Classification_algorithms</a></li>
</ul><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk4kMLRtDeoBWG2yd_S9eGXA6O2Xmo-DsyTJMlKsxa6stCUPpN53jwgc_ahMeTKY8ZqAw1oSmCJk21bvebh9srR32CbJbjG2WGKgrZvSXn_H-YQZz_iqQ6x6x2SWWoX2TDg2BUF3_awnrf/s1600/clas.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk4kMLRtDeoBWG2yd_S9eGXA6O2Xmo-DsyTJMlKsxa6stCUPpN53jwgc_ahMeTKY8ZqAw1oSmCJk21bvebh9srR32CbJbjG2WGKgrZvSXn_H-YQZz_iqQ6x6x2SWWoX2TDg2BUF3_awnrf/s800/clas.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Classification</td></tr>
</tbody></table><br />
<br />
<br />
<h3>クラスタリング</h3><br />
<ul><li>似ているデータをまとめてグループに分ける。</li>
<li>k平均法、混合モデル、階層的クラスタリング、グラフベースクラスタリング...</li>
<li><a href="http://en.wikipedia.org/wiki/Cluster_analysis">http://en.wikipedia.org/wiki/Cluster_analysis</a></li>
<li><a href="http://en.wikipedia.org/wiki/Category:Data_clustering_algorithms">http://en.wikipedia.org/wiki/Category:Data_clustering_algorithms</a></li>
</ul><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLAq2XW-BWm8nVWgETQoYZs8uOoGGJdjA21hn6W4-2Rp1E_J9LqB2qctjxeYHhhIr6T-Kxvm5DN41Vy9EkTxQOhqbRM0j5sB3TmN0ZgXWkF7rFwdNbkotql3bFeg3f9G178rsDql63hJ_A/s1600/clus.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="182" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLAq2XW-BWm8nVWgETQoYZs8uOoGGJdjA21hn6W4-2Rp1E_J9LqB2qctjxeYHhhIr6T-Kxvm5DN41Vy9EkTxQOhqbRM0j5sB3TmN0ZgXWkF7rFwdNbkotql3bFeg3f9G178rsDql63hJ_A/s800/clus.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Clustering</td></tr>
</tbody></table><br />
<h3>回帰</h3><br />
<ul><li>入力に対する出力(数値)を求める関数を訓練データから学習する。</li>
<li>線形回帰、非線形回帰...</li>
<li><a href="http://en.wikipedia.org/wiki/Regression_analysis">http://en.wikipedia.org/wiki/Regression_analysis</a></li>
<li><a href="http://en.wikipedia.org/wiki/Category:Regression_analysis">http://en.wikipedia.org/wiki/Category:Regression_analysis</a></li>
</ul><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTmH4i7Qip97SVU7U7hyphenhyphenMD-r7syRmYKeIzhkZkPMsupJX63M7M4M4u2X_e5mGfq-eTjNgIMW8-q0ICSK4REMkH0_6xcu6661nLeYYR2WMAcXJvlcr-E9YAW7FTTCjWP8wMOHUyCiC6rwjs/s1600/reg.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="182" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTmH4i7Qip97SVU7U7hyphenhyphenMD-r7syRmYKeIzhkZkPMsupJX63M7M4M4u2X_e5mGfq-eTjNgIMW8-q0ICSK4REMkH0_6xcu6661nLeYYR2WMAcXJvlcr-E9YAW7FTTCjWP8wMOHUyCiC6rwjs/s800/reg.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Regression</td></tr>
</tbody></table><br />
<br />
<br />
<br />
<h3>次元削減</h3><br />
<ul><li>高次元のデータをなるべく重要なところは残しつつ低次元に変換する。</li>
<li>次元圧縮、次元縮約などとも。</li>
<li>PCA, <a href="http://en.wikipedia.org/wiki/Nonlinear_dimensionality_reduction">Nonlinear dimensionality reduction</a>...</li>
<li><a href="http://en.wikipedia.org/wiki/Dimension_reduction">http://en.wikipedia.org/wiki/Dimension_reduction</a></li>
<li><a href="http://en.wikipedia.org/wiki/Category:Dimension_reduction">http://en.wikipedia.org/wiki/Category:Dimension_reduction</a></li>
</ul><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio0NaC1d7YRuFjQZv0R0O8w6xSD6ugSqzC4nOgkAzYTsaOsY0XFZtXfvIGLr-dcjcaKI8l_NYXEO09Lj0no4NaqZtnn8a1A_KH8tzTL8UDyOMvmsGm0ROps88XplIm5y_JIVsxPZrGmaKh/s1600/red.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio0NaC1d7YRuFjQZv0R0O8w6xSD6ugSqzC4nOgkAzYTsaOsY0XFZtXfvIGLr-dcjcaKI8l_NYXEO09Lj0no4NaqZtnn8a1A_KH8tzTL8UDyOMvmsGm0ROps88XplIm5y_JIVsxPZrGmaKh/s800/red.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Dimension Reduction</td></tr>
</tbody></table><br />
<br />
<br />
<h3>TODO</h3><br />
<ul><li>具体的な手法の追記</li>
<li>詳細の追記</li>
<li>アプリケーションの追記</li>
<li>実装例</li>
<li>各手法を特徴に応じて表に整理</li>
</ul>satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com1tag:blogger.com,1999:blog-4117638208883815282.post-9000692332557641812013-02-26T00:44:00.002+09:002013-02-26T00:44:53.713+09:00Bloggerの画像をRetinaディスプレイに対応させるデフォルトのツールを使ってPicasaウェブアルバムにアップした場合、画像のサイズを指定して、サムネイル画像アドレスの.../s(.*?)/...の数値を指定したサイズの倍くらいにしたら綺麗になった。<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-9AXaQo6B1hOC6bseGD0QZoZ2Gl3KMf8nTo8f_zfnYll8VTpc1yJTlXsHCfSM9DXZ0X5Y9DoXEAFwleqbpXrM9MUqriVTUDjgoSTte9zFUwyd2SBVbvpYQ2-IC6blzsZ1cGLEfGb98dME/s1600/retina.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="40" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-9AXaQo6B1hOC6bseGD0QZoZ2Gl3KMf8nTo8f_zfnYll8VTpc1yJTlXsHCfSM9DXZ0X5Y9DoXEAFwleqbpXrM9MUqriVTUDjgoSTte9zFUwyd2SBVbvpYQ2-IC6blzsZ1cGLEfGb98dME/s800/retina.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">width="320"と指定したら、.../s640/...とする。</td></tr>
</tbody></table><br />
違い、<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirNMyoulWTfutcuEpi3odd_gpXuBrbkzRMCYudaw1TwzKHAyPWQvBs1SFLaWcBObSGwfuN-MRVfRjx-eotLlg_8UeYX-aTcpZ2uBrs9uSkhVi-OhG-34clb2-zBq7HikzemgBis4bu4SIX/s1600/retina0.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="363" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirNMyoulWTfutcuEpi3odd_gpXuBrbkzRMCYudaw1TwzKHAyPWQvBs1SFLaWcBObSGwfuN-MRVfRjx-eotLlg_8UeYX-aTcpZ2uBrs9uSkhVi-OhG-34clb2-zBq7HikzemgBis4bu4SIX/s800/retina0.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">変更前</td></tr>
</tbody></table><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO6DTv0Y7iF_WHkmP5-8cV1sLt-ZSsToSC4QO3z3gWN8FnIH65nMJk2Luj7viNXfdbqq1ZCb_Y3JYX6_yKJO7ulRAKOvEDXc56E7R2AtNpyN7e_1a_sM99PHXKzoStD8jfoW7cJHdcHXp8/s1600/retina1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="362" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO6DTv0Y7iF_WHkmP5-8cV1sLt-ZSsToSC4QO3z3gWN8FnIH65nMJk2Luj7viNXfdbqq1ZCb_Y3JYX6_yKJO7ulRAKOvEDXc56E7R2AtNpyN7e_1a_sM99PHXKzoStD8jfoW7cJHdcHXp8/s800/retina1.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">変更後</td></tr>
</tbody></table><br />
わかりにくいか。<br />
<br />
Resolutionの設定はBest for Retina display。ScaledのLarger Textに対応するためには3倍くらいの数値を使った方がいいかも。<a href="http://wineskin.urgesoftware.com/tiki-view_blog_post.php?postId=51">Change Resolution.app</a>などを使ってたら別に問題ないのかな。satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-50142541242787266082013-01-18T23:27:00.000+09:002013-01-30T18:29:15.883+09:00Macで京都大学テキストコーパスの変換<a href="http://nlp.ist.i.kyoto-u.ac.jp/index.php?%E4%BA%AC%E9%83%BD%E5%A4%A7%E5%AD%A6%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%B3%E3%83%BC%E3%83%91%E3%82%B9">京都大学テキストコーパス - KUROHASHI-KAWAHARA LAB</a><br />
<br />
でKyotoCorpus4.0.tar.gzをダウンロードして解凍してREADME通りに実行.<br />
<br />
でもMac OS X 10.7.5だとそのままコーパスをつくろうとすると<br />
<blockquote>euc-jp "\xA4" does not map to Unicode at ./src/dupli.pl line 9, <stdin> line 163.</blockquote>みたいなエラーが出ちゃう.そこで以下の手順でちょっと手を加えます.<br />
<br />
1. 同じフォルダにmai1995.txtをコピー.毎日新聞1995年版CD-ROMのファイルはmai1995.txt (Oct 6, 2011 11:37AM)でした.<br />
<br />
2. 文字コードと改行コードとファイル名の変換<br />
<br />
<pre>nkf -s -Lu mai1995.txt > mai95.txt</pre><br />
3. <b>src/format.pl</b>と<b>src/num2KNP.pl</b>についてuse open ":std";を追加<br />
<br />
<pre>...
use open IO => ':encoding(euc-jp)';
<span style="color: red;">use open ":std";</span>
...</pre><br />
4. 実行<br />
<br />
<pre>./auto_conv -d .</pre><br />
<br />
参考<br />
- <a href="http://miz-log.blogspot.jp/2011/11/on-lion.html">mizlog 京都大学テキストコーパス on Lion</a>satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com1tag:blogger.com,1999:blog-4117638208883815282.post-16314741156257167182012-12-15T21:50:00.000+09:002013-02-27T10:23:05.153+09:00政党と政策の距離の可視化<a href="http://satomacoto.blogspot.jp/2012/12/blog-post.html">政党間の類似度の可視化</a>で使ったデータを標準化して特異値分解して可視化.双対尺度法とか数量化理論III類とかコレスポンデンス分析とか言われている.たしか.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQWLu3vkrJZn5KpWoBYdTz650qXjteMXYOqFzdYf-rwczPdb5Cv6TPaEjg_eGfoNvIU-ITkOWWAV-kYL3wFPlprAH842JNnIbGCIF1Qtr4LjF3JFxaJ6bjong5cD7u_B_pFIxCY6oRHmpA/s1600/dualscaling.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="342" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQWLu3vkrJZn5KpWoBYdTz650qXjteMXYOqFzdYf-rwczPdb5Cv6TPaEjg_eGfoNvIU-ITkOWWAV-kYL3wFPlprAH842JNnIbGCIF1Qtr4LjF3JFxaJ6bjong5cD7u_B_pFIxCY6oRHmpA/s800/dualscaling.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">図 <span style="color: blue;">◆</span>政策,<span style="color: red;">■</span>政党.政策とそれに賛成する政党が近くにある…はず</td></tr>
</tbody></table><br />
以下コード<br />
<br />
<script src="https://gist.github.com/satomacoto/5044080.js"></script>satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-90294031563313696642012-12-15T11:05:00.000+09:002013-02-27T10:24:37.016+09:00政党間の類似度の可視化<a href="http://www.nihonseiji.com/">日本政治.com</a>の投票マッチングから各政党の政策に関する質問に対する姿勢から,政党間の距離を計算し可視化してみた.<br />
<br />
<ul><li>各質問に対して賛成・中立・反対を 1, 0, -1 で表し各政党をベクトル化</li>
<li>ベクトル間のユークリッド距離を計算</li>
<li>多次元尺度構成法で可視化(<a href="http://satomacoto.blogspot.jp/2012/01/python.html">Pythonで多次元尺度構成法を実装してみる</a>,<a href="http://satomacoto.blogspot.jp/2012/07/excel.html">Excelの散布図のデータにラベルをつける</a>)</li>
</ul><div><br />
</div><div>ただし以下に注意<br />
<br />
</div><ul><li>各質問の重みは考慮していない</li>
<li>距離の定義を変えればまったく異なる見え方に</li>
</ul><br />
さらに政党と政策との距離も可視化してみた→<a href="http://satomacoto.blogspot.jp/2012/12/blog-post_15.html">政党と政策の距離の可視化</a><br />
<div><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqTboVFkbdWCv-1Rq2dMpw6askYwMfPEOsqabKBLWLQ1pkczbzkMQOA5exrpMtslPXo_co8__LJ1Gu8GE9rmd2ZVc6rFOqHaEATOn6vbtpPjUU0970vXa0tpcCDbsUwK70-RJjvcFwX8YJ/s1600/euclidean.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="263" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqTboVFkbdWCv-1Rq2dMpw6askYwMfPEOsqabKBLWLQ1pkczbzkMQOA5exrpMtslPXo_co8__LJ1Gu8GE9rmd2ZVc6rFOqHaEATOn6vbtpPjUU0970vXa0tpcCDbsUwK70-RJjvcFwX8YJ/s800/euclidean.png" width="400" /></a></div><div><br />
</div><div>以下コード</div><br />
<script src="https://gist.github.com/satomacoto/5044090.js"></script><br />
<ul><li>やっつけなのでてきとう</li>
<li>あとで双対尺度法試してみる</li>
<li>一つ前に書いた要約プログラムで連立政権について考えてみる</li>
</ul>satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-32396160497945739952012-12-14T18:13:00.000+09:002012-12-14T18:38:23.985+09:00MongoDBのインストールとチュートリアル<h3>
インストール</h3>
<br />
Homebrewでインストール<br />
<br />
<pre>brew install mongodb
==> Downloading http://fastdl.mongodb.org/osx/mongodb-osx-x86_64-2.2.2.tgz
######################################################################## 100.0%
==> Caveats
To have launchd start mongodb at login:
ln -sfv /usr/local/opt/mongodb/*.plist ~/Library/LaunchAgents
Then to load mongodb now:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
Or, if you don't want/need launchctl, you can just run:
mongod
/usr/local/Cellar/mongodb/2.2.2-x86_64: 20 files, 170M, built in 98 seconds</pre>
<br />
上にあるようにログイン時に起動してロードするには<br />
<pre>ln -sfv /usr/local/opt/mongodb/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist</pre>
<br />
<h3>
起動</h3>
<br />
<pre>mongod</pre>
<br />
<h3>
接続</h3>
<br />
<pre>mongo</pre>
<br />
<h3>
チュートリアル</h3>
<br />
<pre>> use mydb
switched to db mydb
> db
mydb
> j = {name: 'mongo'};
{ "name" : "mongo" }
> k = {x: 3}
{ "x" : 3 }
> db.things.insert(j)
> db.things.insert(k)
> show collections
system.indexes
things
> db.things.find()
{ "_id" : ObjectId("50caeb1fdab5ce4e84a41f78"), "name" : "mongo" }
{ "_id" : ObjectId("50caeb29dab5ce4e84a41f79"), "x" : 3 }</pre>
<br />
ループで挿入<br />
<br />
<pre>> for (var i = 1; i <= 20; i++) db.things.insert({x:4, j:i})
> db.things.find()
{ "_id" : ObjectId("50caeb1fdab5ce4e84a41f78"), "name" : "mongo" }
{ "_id" : ObjectId("50caeb29dab5ce4e84a41f79"), "x" : 3 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7a"), "x" : 4, "j" : 1 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7b"), "x" : 4, "j" : 2 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7c"), "x" : 4, "j" : 3 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7d"), "x" : 4, "j" : 4 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7e"), "x" : 4, "j" : 5 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7f"), "x" : 4, "j" : 6 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f80"), "x" : 4, "j" : 7 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f81"), "x" : 4, "j" : 8 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f82"), "x" : 4, "j" : 9 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f83"), "x" : 4, "j" : 10 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f84"), "x" : 4, "j" : 11 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f85"), "x" : 4, "j" : 12 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f86"), "x" : 4, "j" : 13 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f87"), "x" : 4, "j" : 14 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f88"), "x" : 4, "j" : 15 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f89"), "x" : 4, "j" : 16 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f8a"), "x" : 4, "j" : 17 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f8b"), "x" : 4, "j" : 18 }
Type "it" for more
> it
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f8c"), "x" : 4, "j" : 19 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f8d"), "x" : 4, "j" : 20 }</pre>
<br />
カーソル操作<br />
<br />
<pre>> var c = db.things.find()
> while (c.hasNext()) printjson(c.next())
{ "_id" : ObjectId("50caeb1fdab5ce4e84a41f78"), "name" : "mongo" }
{ "_id" : ObjectId("50caeb29dab5ce4e84a41f79"), "x" : 3 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7a"), "x" : 4, "j" : 1 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7b"), "x" : 4, "j" : 2 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7c"), "x" : 4, "j" : 3 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7d"), "x" : 4, "j" : 4 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7e"), "x" : 4, "j" : 5 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7f"), "x" : 4, "j" : 6 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f80"), "x" : 4, "j" : 7 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f81"), "x" : 4, "j" : 8 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f82"), "x" : 4, "j" : 9 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f83"), "x" : 4, "j" : 10 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f84"), "x" : 4, "j" : 11 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f85"), "x" : 4, "j" : 12 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f86"), "x" : 4, "j" : 13 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f87"), "x" : 4, "j" : 14 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f88"), "x" : 4, "j" : 15 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f89"), "x" : 4, "j" : 16 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f8a"), "x" : 4, "j" : 17 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f8b"), "x" : 4, "j" : 18 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f8c"), "x" : 4, "j" : 19 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f8d"), "x" : 4, "j" : 20 }</pre>
<br />
カーソルで配列の操作<br />
<br />
<pre>> var c = db.things.find()
> printjson(c[4])
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7c"), "x" : 4, "j" : 3 }
> c.toArray()
[
{
"_id" : ObjectId("50caeb1fdab5ce4e84a41f78"),
"name" : "mongo"
},
{
"_id" : ObjectId("50caeb29dab5ce4e84a41f79"),
"x" : 3
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f7a"),
"x" : 4,
"j" : 1
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f7b"),
"x" : 4,
"j" : 2
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f7c"),
"x" : 4,
"j" : 3
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f7d"),
"x" : 4,
"j" : 4
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f7e"),
"x" : 4,
"j" : 5
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f7f"),
"x" : 4,
"j" : 6
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f80"),
"x" : 4,
"j" : 7
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f81"),
"x" : 4,
"j" : 8
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f82"),
"x" : 4,
"j" : 9
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f83"),
"x" : 4,
"j" : 10
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f84"),
"x" : 4,
"j" : 11
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f85"),
"x" : 4,
"j" : 12
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f86"),
"x" : 4,
"j" : 13
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f87"),
"x" : 4,
"j" : 14
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f88"),
"x" : 4,
"j" : 15
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f89"),
"x" : 4,
"j" : 16
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f8a"),
"x" : 4,
"j" : 17
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f8b"),
"x" : 4,
"j" : 18
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f8c"),
"x" : 4,
"j" : 19
},
{
"_id" : ObjectId("50caeee0dab5ce4e84a41f8d"),
"x" : 4,
"j" : 20
}
]
</pre>
<br />
クエリ<br />
<br />
<pre>> db.things.find({name : "mongo"})
{ "_id" : ObjectId("50caeb1fdab5ce4e84a41f78"), "name" : "mongo" }
> db.things.find({x : 4}, {j : true})
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7a"), "j" : 1 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7b"), "j" : 2 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7c"), "j" : 3 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7d"), "j" : 4 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7e"), "j" : 5 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7f"), "j" : 6 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f80"), "j" : 7 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f81"), "j" : 8 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f82"), "j" : 9 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f83"), "j" : 10 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f84"), "j" : 11 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f85"), "j" : 12 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f86"), "j" : 13 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f87"), "j" : 14 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f88"), "j" : 15 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f89"), "j" : 16 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f8a"), "j" : 17 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f8b"), "j" : 18 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f8c"), "j" : 19 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f8d"), "j" : 20 }</pre>
<br />
数の指定<br />
<br />
<pre>> db.things.findOne()
{ "_id" : ObjectId("50caeb1fdab5ce4e84a41f78"), "name" : "mongo" }
> db.things.find().limit(3)
{ "_id" : ObjectId("50caeb1fdab5ce4e84a41f78"), "name" : "mongo" }
{ "_id" : ObjectId("50caeb29dab5ce4e84a41f79"), "x" : 3 }
{ "_id" : ObjectId("50caeee0dab5ce4e84a41f7a"), "x" : 4, "j" : 1 }</pre>
<br />
<h3>
参考になりそうな</h3>
<br />
<ul>
<li>Getting Started with the MongoDB JavaScript Shell — MongoDB Manual <a href="http://docs.mongodb.org/manual/tutorial/getting-started/">http://docs.mongodb.org/manual/tutorial/getting-started/</a></li>
<li>MongoDBの薄い本(The Little MongoDB Book) - cuspy diary <a href="http://www.cuspy.org/diary/2012-04-17">http://www.cuspy.org/diary/2012-04-17</a></li>
</ul>
satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-25023835317663649422012-12-10T17:08:00.000+09:002012-12-11T00:04:52.179+09:00PythonでDocument Summarization based on Data Reconstruction (AAAI 2012)の実装<a href="http://www.aaai.org/ocs/index.php/AAAI/AAAI12/paper/viewPaper/4991">Zhanying He, Zhejiang University, et al., Document Summarization based on Data Reconstruction</a>を実装してみる。<a href="http://www.aaai.org/Awards/paper.php">AAAI-12 Outstanding Paper Awards</a>。<br />
<br />
<br />
<h3>概要</h3><br />
<ul><li>従来の要約は冗長性を最小化するようなメイントピックを含む文を抽出することによって実現。</li>
<li>本手法はオリジナルのドキュメント全体を再現できるような文集合を抽出して再構成。そのために抽出した文集合を評価するために再構成関数 reconstruction function の提案。</li>
<ul><li>線形的再構成 linear reconstruction。文の線形的な組み合わせによってドキュメントの近似。貪欲法 greedy strategy で最適化。</li>
<li>非負線形的再構成 nonnegative linear construction 。文の線形的な組み合わせを足し算で再構成。乗算型重み更新 multiplicative updating で最適化。</li>
</ul><li>提案するフレームワークをDSDR (Document Summarization based on Data Reconstruction)と呼ぶ。</li>
<li>DUC 2006とDUC 2007で実験。ランダム、Lead、LSA、ClusterHITS、SNMFと比較。</li>
</ul><div><br />
<br />
</div><h3>DSDR</h3><div><br />
</div><div>要約文がなるべくドキュメント全体の内容を含むようにする。再構成誤差(reconstruction error)を小さくするようにする。</div><div><ul><li>ドキュメントの各文について重み付き語頻度ベクトル weighted term-frequency vector で表現。ステミングをしておいたり、ストップワードを取り除いたりしておく。候補文集合 the candidate set 。</li>
<li>再構成関数により候補文集合から選ばれた文集合の評価。</li>
<li>再構成誤差を最小にするような最適な組み合わせを探索。</li>
</ul></div><br />
<h4>コンセプト</h4><br />
まずオリジナルドキュメントと要約の再構成誤差を<br />
$$L({\mathbf v}_i - f(X; {\mathbf a}_i))$$<br />
と考える。ただし、候補文集合$V$、要約文集合$X$、全単語数$d$として、$V=[{\mathbf v}_1,...,{\mathbf v}_n]^T$ where ${\mathbf v}_i \in R^d$, $X=[{\mathbf x}_1,...,{\mathbf x}_m]^T$, $n > m$とする。${\mathbf v}_i$は語頻度ベクトル、また$f(\cdot)$を再構成関数とする。このとき再構成誤差を最小とするように$X, A$を定めれば目的関数は<br />
$$\min_{X,A} \sum_{i=1}^n ||{\mathbf v}_i - f(X; {\mathbf a}_i)||^2$$<br />
となる。これに対して2つの手法で解く。<br />
<br />
本論文では再構成関数は<br />
$$f_i(X;{\mathbf a}_i)=\sum_{i=1}^m{\mathbf x}_j a_{ij}$$<br />
と表し、候補文集合が<br />
$${\mathbf v}_i\approx\sum_{i=1}^m{\mathbf x}_j a_{ij}$$<br />
と選ばれた文集合の線形結合で近似されるとする。<br />
<br />
詳細は論文参照。<br />
<br />
<h4>線形的再構成 linear reconstruction</h4><div><div>$$\begin{aligned}\min_{X, A} & \sum_{i=1}^n||{\mathbf v}_i-X^TA||^2+\lambda||{\mathbf a}_i||^2\\s.t. & X \subset V, |X|=m \\& A = [{\mathbf a}_1, \cdots, {\mathbf a}_n]^T \in R^{n\times m}\end{aligned}$$</div></div><h4>非負線形的 nonnegative linear reconstruction</h4><div><div>$$\begin{aligned}\min_{{\mathbf a}_i, \beta} & \sum_{i=1}^n\{ ||{\mathbf v}_i -V^T {\mathbf a}_i||^2+\sum_{j=1}^n\frac{a_{ij}^2}{\beta_j} \} + \gamma||\beta||_1 \\s.t. & \beta_j \ge0, a_{ij} \ge 0, {\mathbf a}_i \in R^n\end{aligned}$$</div></div><div><br />
</div><div><br />
</div><div><br />
</div><h3>実装</h3><div><br />
</div><div>論文に疑似コードが載っているのでPythonで実装。要NumPy。</div><br />
<pre>V = [[1,0,0,0],
[0,1,0,0],
[1,1,0,0],
[0,0,1,0],
[0,0,1,1]]</pre>というドキュメント(行が文、列が語)に対して、<br />
<ul><li>線形的再構成では3番目と5番目の[1,1,0,0], [0,0,1,1]という文が選ばれた。</li>
<li>非負線形的再構成ではそれぞれに[ 0.49301097 0.49301097 0.6996585 0.49301097 0.70211699]という重みがつき、同様に3番目と5番目の文が選ばれやすいことを示している。</li>
</ul>それぞれトレードオフパラメータは尖りやすさ。これが小さいと過学習しがち。<br />
<br />
<div><br />
</div><div><script src="https://gist.github.com/4248449.js"> </script></div><br />
<div><br />
</div><div><br />
</div><h3>実験</h3><div><br />
</div><div>あとで。</div><div><br />
</div><div><br />
</div><h3>メモ</h3><div><br />
</div><div><ul><li>報知的要約。(cf. 指示的要約)</li>
<li>LSAと似てる気がする。制約ついてるのがちょっと違うのかな。</li>
<li>おもしろい。でも実装してみただけ。あとでちゃんと読む。</li>
<li>テストの書き方がわからない。</li>
<li>訳し方がわからない。</li>
</ul></div><div><br />
</div>satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-81038515440420090202012-11-17T14:16:00.000+09:002012-11-17T14:16:33.353+09:00Pythonでパーティクルフィルタを実装してみるパーティクルフィルタ(<a href="http://en.wikipedia.org/wiki/Particle_filter">Particle filter</a>)は,<a href="http://en.wikipedia.org/wiki/Hidden_Markov_model">隠れマルコフモデル</a>や<a href="http://en.wikipedia.org/wiki/Kalman_filter">カルマンフィルタ</a>と同じように,システムの観測$Y$から状態$X$を推定する手法.どれも<a href="http://en.wikipedia.org/wiki/Bayesian_spam_filtering">ベイジアンフィルタ</a>に基づくもので,確率分布$p(X_t;Y_{0:t})$の表し方が異なる<sup><a href="http://draft.blogger.com/pf1">1</a></sup>のですが,パーティクルフィルタでは有限個のサンプリングによって確率分布を近似します.今回は<a href="http://en.wikipedia.org/wiki/Importance_sampling">重点サンプリング</a><sup><a href="http://draft.blogger.com/pf2">2</a></sup>を使ったパーティクルフィルタを実装してみます.ほかのフィルタに比べてループぐるぐる回すだけだからすごく簡単!<br />
<br />
<br />
<span id="pf1" style="font-size: xx-small;">1. 隠れマルコフモデルはヒストグラム(離散),カルマンフィルタはガウシアン(パラメトリック),パーティクルフィルタはサンプリング(ノンパラメトリック)で表す</span><br />
<span id="pf2" style="font-size: xx-small;">2. SciPyには<a href="http://docs.scipy.org/doc/numpy/reference/routines.random.html">有名ドコロの確率分布からサンプリングする関数</a>が用意されている.任意の確率分布からサンプリングしたい場合には逆関数法,棄却サンプリング,重点サンプリングといった手法などを使う</span><br />
<br />
<br />
<h3>パーティクルフィルタ</h3><br />
<ul><li>たくさんの粒子をばらまいておいて,それっぽく動かして,観測して,各々実際の観測とのズレを測って,正解っぽいっぽい粒子だけ残す,っていうのを繰り返す</li>
<li>入力はN個のパーティクルの状態${\bf x}_t^{(i)}$,重み${\bf w}_t^{(i)}$ $(i=1,...,N)$と制御入力${\bf u}_t$と観測${\bf y}_t$</li>
<li>出力は更新された状態${\bf x}_{t+1}^{(i)}$,重み${\bf w}_{t+1}^{(i)}$</li>
<li>状態方程式$f$と観測方程式$g$が与えられている<blockquote>${\bf x}_{t+1} = f({\bf x}_t, {\bf u}_t) + {\bf w} \leftrightarrow p({\bf x}_{t+1}|{\bf x}_t, {\bf u}_t)\\<br />
{\bf y}_t = g({\bf x}_t) + {\bf v} \leftrightarrow p({\bf y}_{t}|{\bf x}_t)$</blockquote></li>
<li>確率分布$p({\bf x}_t|{\bf y}_{0:t})$をN個の重み付きサンプル$\{w_t^{(i)}, {\bf x}_t^{(i)}\}$$(i=1,...,N)$で近似.$\delta$はデルタ関数.<blockquote>$p({\bf x}_{t}|{\bf y}_{0:t}) \approx \sum_{i=1}^{N} w_t^{(i)} \cdot \delta ({\bf x}_t - {\bf x}_t^{(i)})$</blockquote></li>
<li>新しい観測${\bf y}_{t+1}$があったら状態推定分布$p({\bf x}_{t+1}|{\bf y}_{0:t+1})$を3つのステップで更新<br />
<br />
<ol><li>推定</li>
<li>更新</li>
<li>リサンプリング</li>
</ol></li>
</ul><br />
<br />
<h3>例題</h3><br />
<blockquote>2次元座標において、あるロボットが$t=0$に原点を出発して、速度$(4,4)$で動くとする。ロボットの進路は風などの影響を受け($\sigma_x=\sigma_y=2$),毎秒ごと4つの点$(0,0),(10,0),(0,10),(10,10)$からの距離を計測できて、計測には距離によらない誤差がある($\sigma_x=\sigma_y=4$)とする.このとき観測された軌跡から実際の軌跡を推定する.</blockquote><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid5B8I-9rtghMGq-lNjqc7hJ6DBop94cv-ne8J8KBQKR0hQlDUlSDAskuD2mSC18xHpjC28G9ScQOpTKN2xg-JTs5aeRF1NjuApejjozWFOnQIFoQZK1aj_k4kziRZz0mxsy2nCMeSfbFo/s1600/pf.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid5B8I-9rtghMGq-lNjqc7hJ6DBop94cv-ne8J8KBQKR0hQlDUlSDAskuD2mSC18xHpjC28G9ScQOpTKN2xg-JTs5aeRF1NjuApejjozWFOnQIFoQZK1aj_k4kziRZz0mxsy2nCMeSfbFo/s320/pf.png" width="320" /></a></div><div style="text-align: center;"><small><b>Fig. 1</b> ピヨピヨ</small></div><br />
<br />
<br />
<h3>推定</h3><br />
<blockquote>for i in range(N): ${\bf x}_{t+1}^{(i)} \sim p({\bf x}_{t+1}^{(i)}|{\bf x}_{t}^{(i)}, {\bf u}_{t})$</blockquote>実際にはN個のパーティクルの位置を状態方程式に代入.<br />
<blockquote>${\bf x}_{t+1}^{(i)} = f({\bf x}_{t}^{(i)}, {\bf u}_{t}) = {\bf A}{\bf x}_{t}^{(i)} + {\bf B}{\bf u}_{t} + {\bf w}$</blockquote>ただし<br />
<blockquote>${\bf A} = \left[<br />
\begin{array}{cc}<br />
1 & 0 \\<br />
0 & 1 \\<br />
\end{array}<br />
\right], <br />
{\bf B} = \left[<br />
\begin{array}{cc}<br />
1 & 0 \\<br />
0 & 1 \\<br />
\end{array}<br />
\right], <br />
{\bf w} \sim N(0, 2{\bf I})$</blockquote><br />
<br />
<h3>更新</h3><br />
<blockquote>for i in range(N): $w_{t+1}^{(i)} \leftarrow w_{t}^{(i)} \cdot p({\bf y}_{t+1}^{(i)}|{\bf x}_{t+1}^{(i)})$</blockquote>尤度関数によって重みを更新.$\sum^i w_{t+1}^{(i)} = 1$で正規化.今回はモデルを正規分布にしたのでRBFカーネルで.尤度関数は推定値と観測値が似てれば似てるほど大きくなるように設定.物体追跡検知とかだと色の情報を使う.<br />
<blockquote>$p({\bf y}_{t+1}^{(i)}|{\bf x}_{t+1}^{(i)}) \propto \exp(-\frac{(y-g(x))^2}{\sigma^2})$</blockquote>ただし<br />
<blockquote>$g({\bf x}) = \left[ ||{\bf x}-{\bf p}_1||, ||{\bf x}-{\bf p}_2||, ||{\bf x}-{\bf p}_3||, ||{\bf x}-{\bf p}_4|| \right]^{\mathsf{T}}\\<br />
{\bf p}_1=\left[0, 0\right]^{\mathsf{T}}, {\bf p}_2=\left[10, 0\right]^{\mathsf{T}}, {\bf p}_3=\left[0, 10\right]^{\mathsf{T}}, {\bf p}_4=\left[10, 10\right]^{\mathsf{T}} \\<br />
\sigma^2 = 4$</blockquote><br />
<br />
<h3>リサンプリング</h3><br />
<blockquote>$\{ {\bf x}_{t+1}^{(i)}, w_{t+1}^{(i)}=1 \} \leftarrow resampling(\{ {\bf x}_{t+1}^{(i)}, w_{t+1}^{(i)} \})$</blockquote>重みに応じてリサンプリング.重みが偏らないように.毎回やる必要はない.色々手法があるらしいけど今回は単純に多項分布でサンプリング.<br />
<br />
<br />
<h3>結果</h3><br />
<div align="center"><iframe id="gist4092833_index_html" marginheight="10" marginwidth="10" scrolling="no" style="border: solid 1px #ccc; display: inline; height: 350px; margin: 0px; position: static; width: 350px;"></iframe><br />
<small><b>Fig. 2</b> 10ステップ分.<span style="color: orange;">●</span>が実際の軌跡.<span style="color: skyblue;">●</span>がパーティクル.<span style="color: darkblue;">●</span>がパーティクル平均.線形システムだから全然パーティクルフィルタ使う意味なかったけど…</small><br />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script><br />
<script>
$(document).ready(function() {
var id = '4092833';
var filename = 'index.html';
$.ajax({
type: 'GET',
url: 'https://api.github.com/gists/' + id + '?callback=?',
dataType: 'jsonp',
success: function(data) {
var json = data.data;
$('#gist4092833_index_html').attr('srcdoc', json["files"][filename]["content"]);
}
});
});
</script><br />
</div><br />
<br />
<h3>実装</h3><br />
要NumPy<br />
<br />
<script src="https://gist.github.com/4078931.js?file=pf.py"></script>satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-23755089096306881802012-11-08T15:40:00.000+09:002012-11-08T21:24:27.345+09:00LDAの実装を試してみる<a href="http://en.wikipedia.org/wiki/Latent_Dirichlet_allocation">Latent Dirichlet allocation</a>の実装を色々試してみた.<a href="http://satomacoto.blogspot.jp/2009/12/pythonlda.html">自分でも実装したことある気がするけど</a>.比較はまた後でやるとして使い方だけメモ.詳細は各リンク先で…<br />
<ol><li><a href="#1108lda1">Latent Dirichlet Allocation in C</a></li>
<li><a href="#1108lda2">GibbsLDA++ A C C++ Implementation of Latent Dirichlet Allocation (LDA) using Gibbs Sampling for Parameter Estimation and Inference</a></li>
<li><a href="#1108lda3">plda - A parallel C++ implementation of fast Gibbs sampling of Latent Dirichlet Allocation - Google Project Hosting</a></li>
</ol><br />
<h3 id="1108lda1">1. Latent Dirichlet Allocation in C</h3><br />
<blockquote><a href="http://www.cs.princeton.edu/~blei/lda-c/">http://www.cs.princeton.edu/~blei/lda-c/</a></blockquote><br />
<h4>準備</h4><br />
lda-c-dist.tgz,ap.tgzをダウンロードしたら<br />
<pre>tar xvfz lda-c-dist.tgz
tar xvfz ap.tgz
cd lda-c-dist
make</pre><br />
<h4>データ</h4><br />
各ドキュメントごとに行区切りで,語の種類数,語のインデックスと頻度を記述.インデックスはstringじゃないことに注意.<br />
<blockquote>[M] [term_1]:[count] [term_2]:[count] ... [term_N]:[count]</blockquote>たとえば<br />
<blockquote>% head -n 3 ../ap/ap.dat <br />
186 0:1 6144:1 3586:2 3:1 4:1 ...<br />
174 68:1 512:1 514:2 3:1 4:1 ...<br />
161 0:9 68:1 1538:1 3588:1 517:1 ...</blockquote>1つ目のドキュメントは,語が186種類,語0が1回,語6144が1回…<br />
結果を表示するためには番号と語を紐付けておくためのファイル(ap/vocab.txtみたいなやつ)も用意しておく.<br />
<br />
<h4>実行と結果</h4><br />
- トピックの推定 estimation<br />
<br />
以下を実行.結構時間かかるかも.<br />
<pre>./lda est 1.0 50 settings.txt ../ap/ap.dat random test</pre>testフォルダ以下に結果が出力されます.引数は,LDAのパイパーパラメータ$\alpha$,トピック数$K$,設定ファイル,データセット,初期状態,出力先.<br />
<br />
$\alpha$に関しては $50/K$ にしておくといいらしい.$\beta$に関しては総語数に対する語彙数(異なり数)が多い場合は小さくするといいらしい.とどこかに書いてあった,気がする.ここでは$\beta$は0.1で固定っぽい.<br />
<br />
- 他のデータセットの推定 inference<br />
<br />
トピックの推定で使ったのと同じフォーマットのデータからディリクレパラメータと尤度を推定できる.意味ないけど上でトピックの推定をしたデータでディリクレパラメータの推定をする場合は以下.<br />
<pre>./lda inf settings.txt test/final ../ap/ap.dat inference</pre>出力はinference-gamma.dat,inference-lda-lhood.dat.<br />
<br />
- 結果の表示<br />
<br />
各トピックの上位10語を表示します.<br />
<pre>python topics.py test/final.beta ../ap/vocab.txt 10</pre><br />
<br />
<br />
<h3 id="1108lda2">2. GibbsLDA++ A C C++ Implementation of Latent Dirichlet Allocation (LDA) using Gibbs Sampling for Parameter Estimation and Inference</h3><br />
<blockquote><a href="http://gibbslda.sourceforge.net/">http://gibbslda.sourceforge.net/</a></blockquote><br />
<h4>準備</h4><br />
<a href="http://sourceforge.net/projects/gibbslda/">GibbsLDA++: A C/C++ Gibbs Sampling LDA | Free Science & Engineering software downloads at SourceForge.net</a>からGibbsLDA++-0.2.tar.gzをダウンロードして以下.<br />
<pre>tar xvfz GibbsLDA++-0.2.tar.gz
cd GibbsLDA++-0.2
make clean
make all</pre><br />
<h4>データ</h4><br />
最初にドキュメント数,あとは行がドキュメントを表し,スペース区切りで語を羅列.<br />
<blockquote>[M]<br />
[document1]<br />
[document2]<br />
...<br />
[documentM]</blockquote><blockquote>[documenti] = [wordi1] [wordi2] ... [wordiNi]</blockquote>たとえば<br />
<blockquote>% head -n3 trndocs.dat <br />
1000<br />
abil absenc acquisit acquisit agreem ...<br />
activ ball ball band brief ...</blockquote><br />
<h4>実行と結果</h4><br />
Usageにある通り.<br />
<br />
- パラメータ推定 estimation<br />
<pre>src/lda -est -alpha 0.5 -beta 0.1 -ntopics 100 -niters 1000 -savestep 100 -twords 20 -dfile models/casestudy/trndocs.dat</pre>estでLDAのパラメータを推定します.LDAのハイパーパラメータalpha,beta,トピック数ntopics,繰り返し回数niters,ステップsavestep,出力語数twords,データdfile.twordsを指定すると,各トピックの特徴語が出力されます.<br />
<br />
- 途中のモデルから<br />
<pre>src/lda -estc -dir models/casestudy/ -model model-01000 -niters 800 -savestep 100 -twords 30</pre>estcで指定したモデルからパラメータを推定します.<br />
<br />
- 他のデータの推定 inference<br />
<pre>src/lda -inf -dir models/casestudy/ -model model-01800 -niters 30 -twords 20 -dfile newdocs.dat</pre>infで作ったモデルから他のデータセットの推定をします.<br />
<br />
<br />
<br />
<h3 id="1108lda3">3. plda - A parallel C++ implementation of fast Gibbs sampling of Latent Dirichlet Allocation - Google Project Hosting</h3><br />
<blockquote><a href="http://code.google.com/p/plda/">http://code.google.com/p/plda/</a></blockquote><br />
<h4>準備</h4><pre>tar xvfz plda-3.0.tar.gz
cd plda
make lda infer</pre><br />
<h4>データ</h4><br />
行ごとにドキュメントを表し,語 頻度を繰り返す.<br />
<blockquote>[word1] [word1_count] [word2] [word2_count] [word3] [word3_count] ...</blockquote>たとえば<br />
<blockquote>% head -n3 testdata/test_data.txt<br />
concept 1 consider 1 global 1 entropy 1 go 1 ...<br />
externally 1 global 1 dynamic 1 resistance 1 illustrated 1 ...<br />
consider 1 chain 1 global 1 leads 1 go 1 ...<br />
</blockquote><br />
<h4>実行と結果</h4><br />
- 訓練<br />
<br />
<pre>./lda --num_topics 2 --alpha 0.1 --beta 0.01 --training_data_file testdata/test_data.txt --model_file testdata/lda_model.txt --burn_in_iterations 100 --total_iterations 150</pre>パラメータは上のものと似たようなもん.testdata/lda_model.txtに出力.出力のそれぞれの行は語のトピックの分布を表す.たとえば<br />
<blockquote>% head -n3 testdata/lda_model.txt <br />
concept 179.3 2.7<br />
consider 921.98 0.02<br />
global 296.3 180.7</blockquote><br />
- 表示<br />
<br />
訓練で得られた結果を見やすく表示する.<br />
<pre>python view_model.py testdata/lda_model.txt</pre><br />
- 他のデータセットの推定<br />
<br />
<pre>./infer --alpha 0.1 --beta 0.01 --inference_data_file testdata/test_data.txt --inference_result_file testdata/inference_result.txt --model_file testdata/lda_model.txt --total_iterations 15 --burn_in_iterations 10</pre>alphaは訓練の時と同じものを使いましょう.<br />
<br />
- パラレル<br />
<br />
<a href="http://code.google.com/p/plda/wiki/PLDAManual">http://code.google.com/p/plda/wiki/PLDAManual</a><br />
<br />
<br />
<h3>...</h3><br />
- 論文と実装の紐付けがまとまってるところないかあなあ<br />
- 論文書いている人はみんな実装も公開してほしいなああああああああsatomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-21721573649617266512012-10-24T19:24:00.000+09:002012-10-25T19:55:18.103+09:00青空文庫の書き出しをつぶやくTwitter Bot<div class="separator" style="clear: both; text-align: center;"><a href="http://twitter.com/aozoramakura" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="340" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVt0gsZJTiJzzk8UVxXcg5XWwlRCIrHaSnAAGZ79EdYfXCeO3zUP1z-LXiqcYnSIYwyKbHb2ojXeE53_pWPmQU9H1ZGUPjeNgZj0ORpW0kbCoNRUFPdhF5aq-jSEdAQDnOrvp3kLiOP488/s400/aozoramakura.png" /></a></div><br />
<a href="http://satomacoto.blogspot.jp/2012/10/blog-post.html">青空文庫を「ほんのまくら」みたいに</a>でも使った青空文庫の書き出したちをつぶやくTwitter Botを作ってみた.<br />
<blockquote><a href="http://twitter.com/aozoramakura">http://twitter.com/aozoramakura</a></blockquote><br />
1時間毎に<br />
<blockquote>[書き出し] [カードへのリンク] #aozoramakura<br />
</blockquote>ってつぶやく.<br />
<br />
<br />
<h3>Google App EngineでBot</h3><br />
<a href="http://d.hatena.ne.jp/ambasa/20110317/p1">もうPythonのマイクロフレームワーク「Flask」でもApp EngineのTwitter Botは15行じゃ書けない -</a>を参考にして以下を使う.<br />
<br />
<ul><li> <a href="https://developers.google.com/appengine/?hl=ja">Google App Engine — Google Developers</a></li>
<li> <a href="http://flask.pocoo.org/">Welcome | Flask (A Python Microframework)</a></li>
</ul><br />
TwitterにOAuth認証して投稿する.Google APIで統計情報の取れるURL短縮を行う.<br />
<br />
<br />
<h3>Flask</h3><br />
GoogleAppEngineLauncherでNew Applicationをつくったら<a href="https://github.com/gigq/flasktodo/">gigq/flasktodo</a>からダウンロードしたのをそのまま突っ込んでapplication.py, app.yaml, cron.yamlを編集.app.yamlでアプリ名を変えるのを忘れずに…<br />
<br />
編集後のapplication.pyは以下.<br />
<br />
<script src="https://gist.github.com/3945199.js?file=application.py"></script><br />
<br />
<br />
<h3>Tweepy</h3><br />
Tweepyは<a href="https://github.com/tweepy/tweepy">tweepy/tweepy</a>からダウンロード.tweepyフォルダをアプリのトップにコピーするだけ.インストール必要はない.<br />
<br />
<br />
<h3>書き出しのデータ</h3><br />
makura.jsonをアプリのフォルダのトップに置く.青空文庫から抜き出した.辞書のリスト.<br />
<blockquote>[{u'ebk': u'',<br />
u'html': u'http://www.aozora.gr.jp/cards/001235/files/49858_41918.html',<br />
u'jinbutsu': u'001235',<br />
u'sakuhin': u'49858',<br />
u'text': u'\u3042\u308b\u4eba\u3073\u3068\u306f\u3001\u300c\u30aa\u30c9\u30e9\u30c7\u30af\u300d\u3068\u3044\u3046\u8a00\u8449\u306f\u30b9\u30e9\u30f4\u8a9e\u304b\u3089\u51fa\u3066\u3044\u308b\u3001\u3068\u3044\u3063\u3066\u3001\u305d\u308c\u3092\u6839\u62e0\u306b\u3057\u3066\u3053\u306e\u8a00\u8449\u306e\u6210\u7acb\u3092\u8a3c\u660e\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u308b\u3002'}, ...]</blockquote><br />
<br />
<h3>字数制限</h3><br />
Twitterには140字という制限があるから,100字を超えてる書き出しは101字以降を省略省略.URLは自動的にt.coに.t.coの文字数は<a href="https://dev.twitter.com/docs/api/1/get/help/configuration">GET help/configuration | Twitter Developers</a>にある通り.https://api.twitter.com/1/help/configuration.jsonにアクセスすれば確認できる.確認は1日1回までにしてね,とのこと.今だとhttpで20字,httpsで21字.<br />
<br />
<br />
<h3>Twitter APIでOAuth認証</h3><br />
<a href="https://dev.twitter.com/apps/new">Create an application | Twitter Developers</a>で新しいアプリをつくる<br />
<br />
投稿したいのでSettingsからRead and Writeにする<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8G1-ycLY3SgPA2OhdMVZWZfAwQKXAUC15gH7E3N9sHopr19mpRCuoqbSGf4ATCrFKNCRBicADYrSwsZylSuWQlsCoc8eECskynt-Y6eGJmtaouu15mM6-xqhHUQUFK8tSDJxPgvzkYb3y/s1600/setting.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="328" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8G1-ycLY3SgPA2OhdMVZWZfAwQKXAUC15gH7E3N9sHopr19mpRCuoqbSGf4ATCrFKNCRBicADYrSwsZylSuWQlsCoc8eECskynt-Y6eGJmtaouu15mM6-xqhHUQUFK8tSDJxPgvzkYb3y/s400/setting.png" /></a></div><br />
DetailsからAccess tokenを生成<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUi5mbXj0DNZOk-JEl-WD76aPAuyjCiwb8hyphenhyphennyBd0ZSwzNzL8U1NZAa2CFl0G6Zkd_uLgdFu-RT4W3PL5mxmapkp5sEgUbLFA3R1AX9BsGfjQqYPnCy7aig6Hau3YiS8HU4SIGPW6XKRFM/s1600/create.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="396" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUi5mbXj0DNZOk-JEl-WD76aPAuyjCiwb8hyphenhyphennyBd0ZSwzNzL8U1NZAa2CFl0G6Zkd_uLgdFu-RT4W3PL5mxmapkp5sEgUbLFA3R1AX9BsGfjQqYPnCy7aig6Hau3YiS8HU4SIGPW6XKRFM/s400/create.png" /></a></div><br />
OAuth ToolsからConsumer key, Cunsumer secret, Access token, Access token secretを取得<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMDXvdquWaNeySB-MJNi3EPM4BT1izOICw4tEkq7TiRMric5XM0NAW9A__S0nsBJX7w4xumrKTVeT2qibyaZqgUyabrTKSP-kFdLa4JMHs3TmhdC7uZRdIh-cVNJnPTSrUpXFLVxj_p92t/s1600/keys.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="346" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMDXvdquWaNeySB-MJNi3EPM4BT1izOICw4tEkq7TiRMric5XM0NAW9A__S0nsBJX7w4xumrKTVeT2qibyaZqgUyabrTKSP-kFdLa4JMHs3TmhdC7uZRdIh-cVNJnPTSrUpXFLVxj_p92t/s400/keys.png" /></a></div><br />
<br />
<h3>Google APIでURL短縮</h3><br />
OAuth認証してGoogle URL Shortenerで短縮します.OAuthを通すと独自の短縮URLが手に入ります.App EngineでGoogle APIを使うためにアプリのディレクトリで<br />
<br />
<blockquote>$ enable-app-engine-project .</blockquote><br />
とすれば必要なファイルがアプリのディレクトリにコピーされる.<br />
<br />
URL Shortener API…<br />
<a href="https://developers.google.com/url-shortener/v1/getting_started?hl=ja">Getting Started - URL Shortener API — Google Developers</a><br />
<a href="http://api-python-client-doc.appspot.com/urlshortener_v1.html">api-python-client-doc.appspot.com/urlshortener_v1.html</a><br />
<br />
Google APIをPythonで使う…<br />
<a href="https://developers.google.com/api-client-library/python/start/get_started">Getting Started - Google APIs Client Library for Python — Google Developers</a><br />
<br />
Google APIをApp Engineで使うには…<br />
<a href="https://developers.google.com/api-client-library/python/platforms/google_app_engine">Using Google App Engine - Google APIs Client Library for Python — Google Developers</a><br />
<br />
サンプル…<br />
<a href="http://code.google.com/p/google-api-python-client/source/browse/#hg%2Fsamples%2Fappengine_with_robots">/ - google-api-python-client - Google APIs Client Library for Python - Google Project Hosting</a><br />
<br />
<br />
<h3>TweetしたURLをデータストアに保存</h3><br />
元urlと短縮urlと発行した日時.<br />
<br />
<a href="https://developers.google.com/appengine/docs/python/gettingstarted/usingdatastore?hl=ja">データストアの使用 - Google App Engine — Google Developers</a><br />
<br />
<br />
<h3>cronで1時間ごとに投稿</h3><br />
cron.yamlの設定.<br />
<br />
<a href="https://developers.google.com/appengine/docs/python/config/cron?hl=ja#The_Schedule_Format">Python 用クローンを使用したスケジュールされたタスク - Google App Engine — Google Developers</a><br />
<br />
<script src="https://gist.github.com/3945199.js?file=cron.yaml"></script><br />
<br />
<br />
<h3>管理者のみ投稿可能に</h3><br />
app.yamlの設定.管理者のみアクセス可能でもcronは走る.cronのみに反応させる時は以下のHTTPヘッダを確認.<br />
<blockquote>X-AppEngine-Cron: true</blockquote><br />
<a href="https://developers.google.com/appengine/docs/python/config/cron?hl=ja#Securing_URLs_for_Cron">Python 用クローンを使用したスケジュールされたタスク - Google App Engine — Google Developers</a><br />
<br />
<script src="https://gist.github.com/3945199.js?file=app.yaml"></script><br />
<br />
<br />
<h3>App Engineの設定</h3><br />
App Engineのダッシュボードで,Administration > Application Settings > PerformanceでMax Idle Instanceを1に設定<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3oYV9KVhaBN0q0iaL4UxUqc5ZjJgkTKPphEavszBzrb9MRxJxG-FBBuBbT5Kil0ZYBbbWyIQuPj9t4Dw_es8cvVBiqcVUXoG0I9to9kSPKHJ14dihMZRxgvM2lcT3GI3cQ95kBgsnSD8t/s1600/maxidle.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="216" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3oYV9KVhaBN0q0iaL4UxUqc5ZjJgkTKPphEavszBzrb9MRxJxG-FBBuBbT5Kil0ZYBbbWyIQuPj9t4Dw_es8cvVBiqcVUXoG0I9to9kSPKHJ14dihMZRxgvM2lcT3GI3cQ95kBgsnSD8t/s400/maxidle.png" /></a></div><br />
<br />
<h3>Billing Status</h3><br />
4時間走らせて<br />
<br />
<blockquote>Frontend Instance Hours 4% 1.01 of 28.00 Instance Hours<br />
Code and Static File Storage 1% 0.01 of 1.00 GBytes</blockquote><br />
これら以外0<br />
<br />
<br />
<h3>アイコン</h3><br />
<a href="http://www.hottarakashi-onsen.com/">ほったらかし温泉</a>で撮った空satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-27594929479446886202012-10-19T11:13:00.000+09:002012-11-03T10:54:54.966+09:00青空文庫を「ほんのまくら」みたいに青空文庫の作品の書き出しを抜き出して夏に紀伊国屋でやってた<a href="http://www.kinokuniya.co.jp/store/Shinjuku-Main-Store/20120725000000.html">「ほんのまくら」フェア</a>っぽくしてみました.「ほんのまくら」の書籍一覧は<a href="http://www.kinokuniya.co.jp/store/Shinjuku-Main-Store/20120925100350.html">こちら</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://satomacoto.github.com/makura/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="286" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE-k9yQcn1vjg165HpeM-4YLOBlFDngY1Pq9YqBvJzlRFBQZcNJ3v9jZFwLCgcdOQOvoX3JHa0XvxSJunEED4og_7ORnSzIDmLBvapMpM15Rvak4K6Txy8xn6sArTUl2zO34ligbYIXnsC/s400/Makura+Aozora+Bunko.png" width="400" /></a></div><br />
<blockquote><a href="http://aozoramakura.satomacoto.com/">あおぞらまくら</a><!--
<a href="http://satomacoto.github.com/makura/tweet.html"> - tweet.html</a><br />
<a href="http://satomacoto.github.com/makura/ebk.html"> - ebk.html</a><br />
<a href="http://satomacoto.github.com/makura/xhtml.html"> - xhtml.html</a><br />
<a href="http://satomacoto.github.com/makura/interval.html"> - interval.html</a><br />
<a href="http://satomacoto.github.com/makura/kobo.html"> - kobo.html</a><br />
<a href="http://satomacoto.github.com/makura/kindle.html"> - kindle.html</a>--><br />
</blockquote><br />
<ul><li>取得できた書き出しの数は8969件です.適当にやったのでうまく抜き出せてないのも結構あると思います</li>
<li>12秒にひとつずつ新しい書き出しが追加されます</li>
<li>ヘッダ部分をクリックすると新しい書き出しが追加されます</li>
<li>ランダムで表示させているので放っておくとずっと伸びていきます</li>
<li>書き出しをクリックすると青空文庫の該当作品のページに飛べるようにしたつもりです</li>
<li>元データは<a href="https://github.com/aozorabunko/aozorabunko">https://github.com/aozorabunko/aozorabunko</a>からクローンしたものです</li>
</ul><br />
表示には凄まじくレスポンシブ!!とちょっと話題になっていた<a href="http://www.nhk.or.jp/studiopark/">NHKスタジオパーク</a>でも使われてる<a href="http://masonry.desandro.com/">jQuery Masonry</a>を使いました.なんでも<a href="http://pinterest.com/">Pinterest</a>っぽく仕上がります.Masonry /méɪsnri/.<br />
satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-2659286409992765192012-09-07T12:26:00.000+09:002012-09-07T12:26:01.976+09:00BloggerでGistのファイルをAPIで取得して表示させる<a href="http://bl.ocks.org/mbostock">bl.ocks.org - mbostock</a>みたいにGistにあるhtmlファイルを記事中に表示させたい.<br />
<br />
<a href="http://developer.github.com/v3/gists/">Gists | GitHub API</a>を利用します.要jQuery.<br />
<br />
例では<a href="https://gist.github.com/3347397">gist: 3347397</a>のdescriptionをh1#120907_descriptionに,hello.htmlをiframe#120907_hello_htmlに表示させます.<br />
<br />
<h1 id="120907_description" style="font-weight:300;">Loading...</h1><iframe id="120907_hello_html" marginwidth="0" marginheight="0" scrolling="no" style="border:solid 1px #ccc; display:inline; margin:0px; position:static; width:400px; height:300px;"></iframe><br />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script><br />
<br />
以下をHTML編集モードで記述.<br />
<script>
$(document).ready(function() {
var id = '3347397';
var filename = 'hello.html';
$.ajax({
type: 'GET',
url: 'https://api.github.com/gists/' + id + '?callback=?',
dataType: 'jsonp',
success: function(data) {
var json = data.data;
$('#120907_description').text(json["description"]);
$('#120907_hello_html').attr('srcdoc', json["files"][filename]["content"]);
}
});
});
</script><br />
<br />
<script src="https://gist.github.com/3662704.js?file=gist_import.html"></script><br />
<br />
セキュリティに気を付けて…satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-76315066732251924962012-08-06T11:24:00.000+09:002012-08-06T11:31:52.973+09:00LIBSVMを使ってノード判別問題を解いてみる<a href="http://satomacoto.blogspot.jp/2012/07/python.html">以前ラベル伝搬法を使って解いたノード判別問題</a>を<a href="http://en.wikipedia.org/wiki/Support_vector_machine">SVM (Support Vector Machine)</a>のライブラリlibsvmを使って解いてみます.<br />
<br />
ノード判別問題は半教師あり学習のひとつで<br />
<br />
<ul><li>一部のノードのクラス,リンク構造がわかっている.</li>
<li>すべてのノードのクラスを推定したい.</li>
</ul><br />
という設定です.データは以前と同じものを使います.<br />
<br />
<br />
<br />
<b>libsvmのダウンロードとインストール</b><br />
<br />
下のサイトのDownload LIBSVMからzip fileかtar.gzをダウンロードします.<br />
<br />
<a href="http://www.csie.ntu.edu.tw/~cjlin/libsvm/">http://www.csie.ntu.edu.tw/~cjlin/libsvm/</a><br />
<br />
解凍したら<br />
<br />
<blockquote>% make<br />
</blockquote>で実行ファイル svm-scale, svm-train, svm-predict が生成されます.Windowsでのやり方もREADMEを見れば書いてあると思います.どこでも実行できるようにするためにはPATHの通った場所に置く必要がありますが,今回は別に移動しなくても大丈夫.<br />
<br />
<br />
<br />
<b>SVMの実行</b><br />
<br />
今回は訓練データもテストデータもそんなに大きくないのでSVMについて何にも知らなくても使えるeasy.pyを使って分類してみました.<br />
<br />
easy.pyではgnuplotの場所を指定しているのでHomebrewのようなパッケージ管理ソフトを使ってgnuplotなどをインストールした場合はeasy.pyを編集する必要があります.<br />
<br />
たとえば<br />
<br />
<blockquote>% which gnuplot<br />
/usr/local/bin/gnuplot<br />
</blockquote>であったらeasy.pyの19行目を以下のように変更します.<br />
<br />
<blockquote><strike>gnuplot_exe = "/usr/bin/gnuplot"</strike><br />
gnuplot_exe = "/usr/local/bin/gnuplot"<br />
</blockquote><br />
<br />
<br />
<b>入力データ</b><br />
<br />
以前と同じもの.と思ったけど,ソースノードとターゲットノードが同じ時はリンクありにすべきかリンクなしにすべきか…(今回はリンクありとした.)<br />
<br />
<div id="libsvmgraph1"></div><small>ブルーとグリーンがクラスのわかってるノード.オレンジのノードのクラスを含めてすべてのクラスを予測したい.</small><br />
<br />
<br />
libsvmに合わせてフォーマットを変える.<br />
<br />
<blockquote><label> <index1>:<value1> <index2>:<value2> …<br />
.<br />
.<br />
.<br />
</blockquote>インデックスは1から始まることに注意.たとえばnode0のインデックスは1,node1のインデックスは2.<br />
<br />
訓練データはわかっているものだけ.<br />
<blockquote>% cat links<br />
1 1:1 3:1 5:1 10:1<br />
1 1:1 2:1 3:1 4:1<br />
1 1:1 4:1 5:1<br />
-1 6:1 10:1<br />
-1 4:1 7:1 8:1 9:1<br />
-1 7:1 8:1 10:1</blockquote><br />
テストデータはすべて.<br />
<blockquote>% cat links.t<br />
1 1:1 3:1 5:1 10:1<br />
0 2:1 3:1<br />
1 1:1 2:1 3:1 4:1<br />
0 3:1 4:1 5:1 7:1<br />
1 1:1 4:1 5:1<br />
-1 6:1 10:1<br />
-1 4:1 7:1 8:1 9:1<br />
-1 7:1 8:1 10:1<br />
0 7:1 9:1<br />
0 1:1 6:1 8:1 10:1<br />
</blockquote><br />
<br />
<br />
<b>実行</b><br />
<br />
toolsに移動してeasy.pyを使ってSVMで分類.<br />
easy.pyはRBFカーネルのSVMでスケーリング,パラメータ選択,訓練,予測までやってくれる.<br />
<br />
<blockquote>% cd tools<br />
% ./easy.py links links.t</blockquote><br />
<br />
<br />
<b>結果</b><br />
<br />
<blockquote>% cat links.t.predict <br />
1<br />
1<br />
1<br />
1<br />
1<br />
-1<br />
-1<br />
-1<br />
-1<br />
-1</blockquote><br />
可視化したもの.<br />
<br />
<div id="libsvmgraph2"></div><br />
<br />
<b>参考</b><br />
<br />
"A Practical Guide to Support Vector Classification", http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf<br />
上記事の日本語解説資料, http://d.hatena.ne.jp/sleepy_yoshi/20120624/<br />
<br />
<br />
<br />
<script src="http://mbostock.github.com/d3/d3.js?2.6.0" type="text/javascript"></script><br />
<script type="text/javascript" src="http://mbostock.github.com/d3/d3.layout.js?2.6.0">
</script><script src="http://mbostock.github.com/d3/d3.geom.js?2.6.0" type="text/javascript">
</script><br />
<script>
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('D 11={13:E(k,y){D w=1e,h=1e;D l=0;D m=O.1w(k).K("I:I").F("P",w).F("1x",h);D o=[];D p=[];D q=[];D r=[];Q(D i=0;i<y.L;i++){D s={1f:"H "+i,R:y[i]};o.M(s);p.M({H:s});p.M({H:s})};D W=1y 1g(o.L);Q(D i=0;i<o.L;i++){W[i]=1g(o.L)}W[0][2]=W[0][4]=W[0][9]=W[1][2]=W[2][3]=W[3][4]=W[3][6]=W[5][9]=W[6][7]=W[6][8]=W[7][9]=1;Q(D i=0;i<o.L;i++){Q(D j=i+1;j<o.L;j++){S(W[i][j]==1)r.M({T:i,U:j,14:0.5})}q.M({T:i*2,U:i*2+1,14:1})};D t=O.1h.1i().15([w,h]).V(o).1j(r).1k(1).1l(1z).1m(-1A).1n(E(x){G x.14*10});t.16();D u=O.1h.1i().V(p).1j(q).1k(0).1l(0).1n(8).1m(-1B).15([w,h]);u.16();D v=m.X("17.1o").Y(r).18().K("I:17").F("19","1o").J("1a","#1C");D s=m.X("g.H").Y(t.V()).18().K("I:g").F("19","H");s.K("I:1p").F("r",10).J("1b",E(n){G O.1D(0,0,(n.R+1)/2)}).J("1a",E(n){S(n.R>0)G"#1E";1c S(n.R<0)G"#1F";1c G"#1G"}).J("1a-P",3);s.N(t.1H);D z=m.X("17.1I").Y(q);D A=m.X("g.1q").Y(u.V()).18().K("I:g").F("19","1q");A.K("I:1p").F("r",0).J("1b","#1J");A.K("I:1r").1r(E(d,i){G i%2==0?"":d.H.1f}).J("1b","#1K").J("1s-1L","1M").J("1s-15",12);D B=E(){Z.F("1N",E(d){G d.T.x}).F("1O",E(d){G d.T.y}).F("1P",E(d){G d.U.x}).F("1Q",E(d){G d.U.y})};D C=E(){Z.F("1t",E(d){G"1u("+d.x+","+d.y+")"})};t.1R("1S",E(){u.16();s.N(C);A.1T(E(d,i){S(i%2==0){d.x=d.H.x;d.y=d.H.y}1c{D b=Z.1v[1].1U();D a=d.x-d.H.x;D c=d.y-d.H.y;D e=1d.1V(a*a+c*c);D f=b.P*(a-e)/(e*2);f=1d.1W(-b.P,1d.1X(0,f));D g=5;Z.1v[1].1Y("1t","1u("+f+","+g+")")}});A.N(C);v.N(B);z.N(B)})}};11.13("#1Z",[1,0,1,0,1,-1,-1,-1,0,0]);11.13("#20",[1,1,1,1,1,-1,-1,-1,-1,-1]);',62,125,'|||||||||||||||||||||||||||||||||||||||var|function|attr|return|node|svg|style|append|length|push|call|d3|width|for|value|if|source|target|nodes||selectAll|data|this||libsvmGraph||show|weight|size|start|line|enter|class|stroke|fill|else|Math|400|label|Array|layout|force|links|gravity|linkDistance|charge|linkStrength|link|circle|anchorNode|text|font|transform|translate|childNodes|select|height|new|50|3000|100|CCC|hsl|77f|7f7|fc7|drag|anchorLink|FFF|555|family|Arial|x1|y1|x2|y2|on|tick|each|getBBox|sqrt|max|min|setAttribute|libsvmgraph1|libsvmgraph2'.split('|'),0,{}))
</script>satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-5661813154936421952012-07-20T18:10:00.000+09:002012-11-15T22:25:34.616+09:00Excelの散布図のデータにラベルをつけるExcel for Mac 2011ではマクロが使えます.散布図にラベルを追加してみます.参考にしたのは以下のサイトです.<br />
<br />
<blockquote>Excelでマクロを使用して散布図またはバブルチャートのデータポイントにラベルを追加する方法 <a href="http://support.microsoft.com/kb/213750/ja">http://support.microsoft.com/kb/213750/ja</a></blockquote><br />
以下の各食材100gあたりの栄養価のデータを散布図にします.横軸にカロリー(kCal),縦軸にタンパク質(g)を示します.<br />
<br />
<script src="https://gist.github.com/3149548.js?file=data"></script><br />
<br />
データをシートに記入したら散布図の挿入<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhprLHGA2k4QxfF4_n51Jj5r9PiubsSCokVM6S4Mx56ZFlF0605_FU6yZ_EEmo2zMQKinK8a35HvBEuQwoWx3qE1xDylG8KYMAqiJjrndLessykeCROmdBll-D3ld-BNT1HKbnB3uimp0Qr/s1600/xlabel020.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="335" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhprLHGA2k4QxfF4_n51Jj5r9PiubsSCokVM6S4Mx56ZFlF0605_FU6yZ_EEmo2zMQKinK8a35HvBEuQwoWx3qE1xDylG8KYMAqiJjrndLessykeCROmdBll-D3ld-BNT1HKbnB3uimp0Qr/s400/xlabel020.png" width="400" /></a></div><br />
こんなかんじでグラフが作成されます.タイトルは消した!<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjurQr2CjUfqh6fqbqtJXxt7M4kqvrGvWi8ERBT5XDgzidb1O78GcZCslx3UL_z99wsy-EHbRNJIavTP9VzUhYjtiQF9ali-Fxh_ZQTPCKeDJfPVM-5aUhHgTuy6kJI20T-hMm9TKBzy3Sf/s1600/xlabel025.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjurQr2CjUfqh6fqbqtJXxt7M4kqvrGvWi8ERBT5XDgzidb1O78GcZCslx3UL_z99wsy-EHbRNJIavTP9VzUhYjtiQF9ali-Fxh_ZQTPCKeDJfPVM-5aUhHgTuy6kJI20T-hMm9TKBzy3Sf/s400/xlabel025.png" width="400" /></a></div><br />
ツール > マクロ > Visual Basic Editorを起動<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdkmC-VrS1jGO4rajua4W7bkhKR2UsPY3efVz1CechCNRQKRNAHtU89C7jufOrLsuud1eksKGztm80O3abr4BCns7_G55yY91PPg_UDuC51STEq1UO5FtnhLZRBMRrLppXIfXpCbTzZ2-4/s1600/xlabel010.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="285" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdkmC-VrS1jGO4rajua4W7bkhKR2UsPY3efVz1CechCNRQKRNAHtU89C7jufOrLsuud1eksKGztm80O3abr4BCns7_G55yY91PPg_UDuC51STEq1UO5FtnhLZRBMRrLppXIfXpCbTzZ2-4/s400/xlabel010.png" width="400" /></a></div><br />
プロジェクトエクスプローラーで該当のシートを右クリックして標準モジュールを追加<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-qjQV7p5PibvUtx7HOgBKGCczzwksiM_vdBsHzgFFUiHReEAIMsKAX83Yki0cZ543aibr5iLPLPND1MjgPXLgHOUAe3nnpfz7rGRoA23QTNRzLgZ7_Fbp2UF4I0eNHb542wzUn0kCv6gi/s1600/xlabel030.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-qjQV7p5PibvUtx7HOgBKGCczzwksiM_vdBsHzgFFUiHReEAIMsKAX83Yki0cZ543aibr5iLPLPND1MjgPXLgHOUAe3nnpfz7rGRoA23QTNRzLgZ7_Fbp2UF4I0eNHb542wzUn0kCv6gi/s400/xlabel030.png" width="400" /></a></div><br />
以下のコードを記入<br />
<br />
<script src="https://gist.github.com/3149548.js?file=AttachLabelsToPoints.bas"></script><br />
<br />
ラベルを追加するグラフを選択して実行<br />
Excelに戻ってツール → マクロ → マクロからも実行できます<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPQOPKeZ1DpLDMqk_uLcrdEiWj5qsi1BY5Utw3c4JegXsV6iiWyniP_HfL-qum0D0njifpRWsGHuX0Ik8zY8lUKJq04pD0KxsAFicb23YNEl2yTjayQIfIbtEuLbJKo75G-kNIO5UC9CoM/s1600/xlabel040.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPQOPKeZ1DpLDMqk_uLcrdEiWj5qsi1BY5Utw3c4JegXsV6iiWyniP_HfL-qum0D0njifpRWsGHuX0Ik8zY8lUKJq04pD0KxsAFicb23YNEl2yTjayQIfIbtEuLbJKo75G-kNIO5UC9CoM/s400/xlabel040.png" width="400" /></a></div><br />
でこんな感じ<br />
X軸,y軸にラベル貼りゃよかった<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh35viPWp1DlBJztVXVkwJrlB3ZN7zCyVvZScA9u46T8JTV5yApqfIvNZ0wiVQY0PifIGEZEwz_EzoTMQnVc_q4TL4jwtzsuRGyCfISJcZXMnd8OIFXrG8t-G0H2wg6PD-fi1KoVzIzQtXp/s1600/xlabel050.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="175" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh35viPWp1DlBJztVXVkwJrlB3ZN7zCyVvZScA9u46T8JTV5yApqfIvNZ0wiVQY0PifIGEZEwz_EzoTMQnVc_q4TL4jwtzsuRGyCfISJcZXMnd8OIFXrG8t-G0H2wg6PD-fi1KoVzIzQtXp/s400/xlabel050.png" width="400" /></a></div><br />
参考にしたサイトのものではデータが2列以上あると追加されないのですが,上のコードなら大丈夫,のはず.いろいろいじればいろいろいじれます.コードはWindowsでも使えると思う.satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-65579888351724166012012-07-20T08:26:00.002+09:002012-07-27T21:51:52.123+09:00koboで無料作品を探す追記<br />
<br />
<a href="http://rakuten.kobobooks.com/">http://rakuten.kobobooks.com</a>に「無料で読める本」というメニューが追加されてました<br />
もっとよくなっていけばうれしい<br />
<br />
追記終わり<br />
<br />
<br />
<a href="http://rakuten.kobobooks.com/">http://rakuten.kobobooks.com</a>にアクセス<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMeMdRYyGbsHC01zHbEud_BvjxbXLpPs5pZeA9NcjO76W8_GkvDxCemJ21Rptr67E5P9g8C3HxuSShUeYfoGrNVdrldF03bY-SZ7ysVwRKW3Ua9-OKS0WW9yuIML6eqE1VU4xNNgErQCRm/s1600/kobofree0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="219" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMeMdRYyGbsHC01zHbEud_BvjxbXLpPs5pZeA9NcjO76W8_GkvDxCemJ21Rptr67E5P9g8C3HxuSShUeYfoGrNVdrldF03bY-SZ7ysVwRKW3Ua9-OKS0WW9yuIML6eqE1VU4xNNgErQCRm/s320/kobofree0.png" width="320" /></a></div><br />
<br />
ログインして空欄にしたまま検索(読みたい作品があるなら空欄じゃなくてもいい)<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV29j2qrbDnOJTLTJvZZr83KFLMwgfnaEx7EkuGj4KyBmNHpZGKDJP6JpCY15qGFE7uOL89m8LVlhY6CvOYH8raRh2xhLivV4ulNM5fsXgwr7ReP8RSiAHQuMhMZmLENvqKdcbvme8-z81/s1600/kobofree1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="142" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV29j2qrbDnOJTLTJvZZr83KFLMwgfnaEx7EkuGj4KyBmNHpZGKDJP6JpCY15qGFE7uOL89m8LVlhY6CvOYH8raRh2xhLivV4ulNM5fsXgwr7ReP8RSiAHQuMhMZmLENvqKdcbvme8-z81/s320/kobofree1.png" width="320" /></a></div><br />
<br />
日本語の作品だけ探すなら「日本語」で絞る<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg0K5Lizqf9HwG7AwppqlzQmeNG9cuHgqAIQi9Y31Bf5aJqm2tbaZbPzhFf_TTROr6py87jwQRWdxr4_iGcUrLe6tAmh-eQ6a4ar6FzSeCouRuhR8_hy0VHr-f9FvqrC5ZTNKhPwgwifmU/s1600/kobofree2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg0K5Lizqf9HwG7AwppqlzQmeNG9cuHgqAIQi9Y31Bf5aJqm2tbaZbPzhFf_TTROr6py87jwQRWdxr4_iGcUrLe6tAmh-eQ6a4ar6FzSeCouRuhR8_hy0VHr-f9FvqrC5ZTNKhPwgwifmU/s320/kobofree2.png" width="310" /></a></div><br />
<br />
検索結果から無料作品のみ表示を選択<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiko_xCYAlMXMrODK3GoXi4nYgMppedkxLHl7Y9IbY4s4jh3JeclpIdRMgFsmCCXPl1HGzzx1QEh5PgEtAaMJ5bAcuZoyc_kdy_dUpyGcGzKnNfbW8t_P5a2aok_YIpDWKaZmmVITI3PwJA/s1600/kobofree3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="194" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiko_xCYAlMXMrODK3GoXi4nYgMppedkxLHl7Y9IbY4s4jh3JeclpIdRMgFsmCCXPl1HGzzx1QEh5PgEtAaMJ5bAcuZoyc_kdy_dUpyGcGzKnNfbW8t_P5a2aok_YIpDWKaZmmVITI3PwJA/s320/kobofree3.png" width="320" /></a></div><br />
<br />
ライブラリに追加<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5PLZGgy-IiYS7eN4XWe4VUfSV-zPPqjtf5ZdlNPo8wVg2RcJI50-fmdy595GXkn1akU3lp3Enugp-WGaywSssSVXSguKTQaj6zjAJy9FBaN6u9hQ1pOwq4t9vGI4YzVhyeFMwQEx8mYxL/s1600/kobofree4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5PLZGgy-IiYS7eN4XWe4VUfSV-zPPqjtf5ZdlNPo8wVg2RcJI50-fmdy595GXkn1akU3lp3Enugp-WGaywSssSVXSguKTQaj6zjAJy9FBaN6u9hQ1pOwq4t9vGI4YzVhyeFMwQEx8mYxL/s320/kobofree4.png" width="320" /></a></div><br />
<br />
本体をUSBでつないでkoboデスクトップ <a href="http://rakuten.kobosetup.com/">http://rakuten.kobosetup.com/</a> で同期<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDASLROZ1GRXM9ZOiqBzSCdJ4EWfiw9iNtjf7sw54RN8Z-zTp-UIfKvwN4v_ITXgyJV14XU3iuhWBGsfbBudkixJTImZI5KIHBbVM1ogpuGikm1gElmWv417YE31-_T73B1iF57Puyq2LJ/s1600/kobofree5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="151" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDASLROZ1GRXM9ZOiqBzSCdJ4EWfiw9iNtjf7sw54RN8Z-zTp-UIfKvwN4v_ITXgyJV14XU3iuhWBGsfbBudkixJTImZI5KIHBbVM1ogpuGikm1gElmWv417YE31-_T73B1iF57Puyq2LJ/s320/kobofree5.png" width="320" /></a></div><br />
<br />
<br />
無料作品いっぱいあって全体を見るのは大変<br />
結構遅いもんで本体から探すのだるい<br />
あとWi-Fi全然つながんないんだけどどういうこと<br />
<br />
<!--rakuten_html.temp--><br />
<center><br />
<table style="cellSpacing=0 cellPadding=0 border-width:1px;" bgcolor="#ffffff"><tr> <td align="center" valign="top"><table style="cellSpacing=0 cellPadding=0 height=10 border-width:0px;"><tr> <td style="border-width:1px; border-style:solid; border-color:#ffffff" align="center" width=400 colspan=4><table style="cellSpacing=0 cellPadding=0 width=400 height=80 border-width:0px;"><tr> <td style="border-width:1px; border-style:solid; border-color:#ffffff" align="center" width=130 height=130><br />
<a href="http://hb.afl.rakuten.co.jp/hgc/0b032549.6742c818.0b03254a.2dd7913c/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f11749056%2f%3fscid%3daf_ich_link_img&m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f15929947%2f" target="_blank"><img src ="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0432%2f0681495000432.jpg%3f_ex%3d128x128&m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0432%2f0681495000432.jpg%3f_ex%3d80x80" border="0"></a><br />
</td> <td style="border-width:1px; border-style:solid; border-color:#ffffff" align="center" width=130 height=130><br />
<a href="http://hb.afl.rakuten.co.jp/hgc/0b032549.6742c818.0b03254a.2dd7913c/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f11749079%2f%3fscid%3daf_ich_link_img&m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f15930050%2f" target="_blank"><img src ="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0425%2f0681495000425.jpg%3f_ex%3d128x128&m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0425%2f0681495000425.jpg%3f_ex%3d80x80" border="0"></a><br />
</td> <td style="border-width:1px; border-style:solid; border-color:#ffffff" align="center" width=130 height=130><br />
<a href="http://hb.afl.rakuten.co.jp/hgc/0b032549.6742c818.0b03254a.2dd7913c/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f11749136%2f%3fscid%3daf_ich_link_img&m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f15930059%2f" target="_blank"><img src ="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0449%2f0681495000449.jpg%3f_ex%3d128x128&m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0449%2f0681495000449.jpg%3f_ex%3d80x80" border="0"></a><br />
</td> </tr>
<tr> <td style="border-width:1px; border-style:solid; border-color:#ffffff" align="center" width=130 height=130><br />
<a href="http://hb.afl.rakuten.co.jp/hgc/0b032549.6742c818.0b03254a.2dd7913c/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f11749137%2f%3fscid%3daf_ich_link_img&m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f15930058%2f" target="_blank"><img src ="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0227%2f0681495000227.jpg%3f_ex%3d128x128&m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0227%2f0681495000227.jpg%3f_ex%3d80x80" border="0"></a><br />
</td> <td style="border-width:1px; border-style:solid; border-color:#ffffff" align="center" width=130 height=130><br />
<a href="http://hb.afl.rakuten.co.jp/hgc/0b032549.6742c818.0b03254a.2dd7913c/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f11749138%2f%3fscid%3daf_ich_link_img&m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f15930057%2f" target="_blank"><img src ="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0234%2f0681495000234.jpg%3f_ex%3d128x128&m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0234%2f0681495000234.jpg%3f_ex%3d80x80" border="0"></a><br />
</td> <td style="border-width:1px; border-style:solid; border-color:#ffffff" align="center" width=130 height=130></td> </tr>
</table></td> </tr>
</table></td> </tr>
</TABLE></center><br />satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0tag:blogger.com,1999:blog-4117638208883815282.post-41725997881686621432012-07-04T17:02:00.000+09:002013-09-23T09:22:00.846+09:00Pythonでラベル伝搬法を試してみるネットワークの構造を予測解析のタスクにはノード判別とリンク予測があります.ノード判別問題は,幾つかのノードについてクラスラベルが与えられているとき,残りのクラスラベルが未知のノードに対してクラスラベルを予測する問題です.<br />
<br />
ノード判別手法の最も簡単なもののひとつとしてラベル伝搬法という手法が知られています.ラベル伝搬法のアルゴリズムのひとつを文献1の801ページに基づいて実装してみました.なおラベル伝搬法については文献2の11章にまとまってました.<br />
<br />
<ol><li>鹿島, グラフとネットワークの構造データマイニング, 電子情報通信学会誌 93(9), 797-802, 2010.</li>
<li>Chapelle, O. et al., Semi-supervised learning, MIT Press, 2006.</li>
</ol><br />
<br />
ラベル伝搬法は「ネットワーク上で隣り合ったノードは同じクラスに属する」と仮定して未知のノードにラベルを振る半教師あり学習の手法.ここでは +1 と -1 の2種類のクラス判別問題.<br />
<br />
<ul><li>ネットワークの構造は${\bf W}$で表す.${\bf W}$の$i,j$成分は$i$番目のノードと$j$番目のノードにリンクがある(1)か,ない(0)か.</li>
<li>クラスラベルはベクトル${\bf y}$で表す.ふられてないときは0.</li>
<li>予測値はベクトル${\bf f}$で表す.それぞれ[-1,1]の連続値.</li>
</ul><br />
で隣り合ったノードの予測値が互いに近くなるように決定するための目的関数は以下.<br />
<br />
<blockquote>$\begin{align}<br />
J({\bf f})&=\sum_{i=1}^l(y^{(i)}-f^{(i)})^2 + \lambda \sum_{i<j}y^{(i,j)}(f^{(i)}-f^{(j)})^2 \\<br />
&=||{\bf y}-{\bf f}||_2^2+\lambda {\bf f}^T{\bf L}{\bf f}<br />
\end{align}$</blockquote><br />
ただし${\bf L}\equiv {\bf D}-{\bf W}$で${\bf D}$は${\bf W}$の各行の和を対角成分に持つ行列.λは1項目と2項目のバランスを取る定数.1項目は正解に近づけ,2項目は隣合うのノードの予測値を近づけます.<br />
<br />
で,この最小化問題の解が<br />
<br />
<blockquote>$({\bf I}+\lambda {\bf L}){\bf f}={\bf y}$</blockquote><br />
の解として求められます.<br />
<br />
<br />
以下,てけとーにノードクラスとリンクを決めて試してみました.要scipy.<br />
<br />
<script src="https://gist.github.com/3045713.js?file=label_propagation.py">
</script><br />
<br />
<br />
以下,結果をD3.jsで可視化しました.<br />
<br />
<b>予測前</b><br />
<br />
ブルーとグリーンが予めクラスを与えているノード.オレンジのノードのクラスを予測します.<br />
<div id="graph1"></div><br />
<b>予測後</b><br />
<br />
λ=1の結果です.node1とnode3はブルー,node8とnode9はグリーンに分けられました.ノードの色の濃さ(白か黒か)でどっちに近いか示しています.<br />
<div id="graph2"></div><br />
<br />
<script src="http://mbostock.github.com/d3/d3.js?2.6.0" type="text/javascript"></script><br />
<script type="text/javascript" src="http://mbostock.github.com/d3/d3.layout.js?2.6.0">
</script><script src="http://mbostock.github.com/d3/d3.geom.js?2.6.0" type="text/javascript">
</script><br />
<script>
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('D 13={1d:E(k,y){D w=1o,h=1o;D l=0;D m=V.1V(k).K("J:J").F("Y",w).F("1U",h);D o=[];D p=[];D q=[];D r=[];O(D i=0;i<y.L;i++){D s={1v:"H "+i,11:y[i]};o.N(s);p.N({H:s});p.N({H:s})};D W=1T 1f(o.L);O(D i=0;i<o.L;i++){W[i]=1f(o.L)}W[0][2]=W[0][4]=W[0][9]=W[1][2]=W[2][3]=W[3][4]=W[3][6]=W[5][9]=W[6][7]=W[6][8]=W[7][9]=1;O(D i=0;i<o.L;i++){O(D j=i+1;j<o.L;j++){P(W[i][j]==1)r.N({Q:i,R:j,1b:T.1w()})}q.N({Q:i*2,R:i*2+1,1b:1})};D t=V.1i.1j().1a([w,h]).U(o).1k(r).1l(1).1m(1Q).1p(-1M).1r(E(x){G x.1b*10});t.18();D u=V.1i.1j().U(p).1k(q).1l(0).1m(0).1r(8).1p(-1L).1a([w,h]);u.18();D v=m.Z("14.1h").X(r).15().K("J:14").F("16","1h").I("17","#1K");D s=m.Z("g.H").X(t.U()).15().K("J:g").F("16","H");s.K("J:1n").F("r",10).I("19",E(n){G V.1F(0,0,(n.11+1)/2)}).I("17",E(n){P(n.11>0)G"#1E";1c P(n.11<0)G"#1B";1c G"#1z"}).I("17-Y",3);s.M(t.1y);D z=m.Z("14.1x").X(q);D A=m.Z("g.1u").X(u.U()).15().K("J:g").F("16","1u");A.K("J:1n").F("r",0).I("19","#1R");A.K("J:1t").1t(E(d,i){G i%2==0?"":d.H.1v}).I("19","#1A").I("1s-1C","1D").I("1s-1a",12);D B=E(){S.F("1G",E(d){G d.Q.x}).F("1H",E(d){G d.Q.y}).F("1I",E(d){G d.R.x}).F("1J",E(d){G d.R.y})};D C=E(){S.F("1e",E(d){G"1q("+d.x+","+d.y+")"})};t.1N("1O",E(){u.18();s.M(C);A.1P(E(d,i){P(i%2==0){d.x=d.H.x;d.y=d.H.y}1c{D b=S.1g[1].1S();D a=d.x-d.H.x;D c=d.y-d.H.y;D e=T.1W(a*a+c*c);D f=b.Y*(a-e)/(e*2);f=T.1X(-b.Y,T.1Y(0,f));D g=5;S.1g[1].1Z("1e","1q("+f+","+g+")")}});A.M(C);v.M(B);z.M(B)})}};13.1d("#20",[1,0,1,0,1,-1,-1,-1,0,0]);13.1d("#21",[0.22,0.23,0.24,0.25,0.26,-0.27,-0.28,-0.29,-0.2a,-0.2b]);',62,136,'|||||||||||||||||||||||||||||||||||||||var|function|attr|return|node|style|svg|append|length|call|push|for|if|source|target|this|Math|nodes|d3||data|width|selectAll||value||labelPropagationGraph|line|enter|class|stroke|start|fill|size|weight|else|show|transform|Array|childNodes|link|layout|force|links|gravity|linkDistance|circle|400|charge|translate|linkStrength|font|text|anchorNode|label|random|anchorLink|drag|fc7|555|7f7|family|Arial|77f|hsl|x1|y1|x2|y2|CCC|100|3000|on|tick|each|50|FFF|getBBox|new|height|select|sqrt|max|min|setAttribute|graph1|graph2|459660107335|23023255814|460465116279|151967799642|537209302326|579516994633|389803220036|516279069767|194901610018|159033989267'.split('|'),0,{}))
</script>satomacotohttp://www.blogger.com/profile/07541695914895617284noreply@blogger.com0