YelpAPIでお寿司屋を探す

Yelpというサービスがあります.

世界最大級の口コミローカル情報サイト「Yelp」が日本上陸
http://internet.watch.impress.co.jp/docs/news/20140409_643553.html 

食べログなど口コミサイトは数多ありますが,このYelpは食事だけでなくショッピングやファッションなど「住所」がある建物・サービスならば何でも評価できるサービスです.英語圏ではかなりのユーザーがいるそうです.ちなみに,YelpはSNS的な要素もあり,たとえば,泡にまみれる「泡パ」なんてイベントもあります.

「泡フェス」
http://www.yelp.co.jp/events/%E6%B1%9F%E6%9D%B1%E5%8C%BA-%E6%B3%A1%E3%83%95%E3%82%A7%E3%82%B9


さて,今回はこのYelpが提供しているAPIを使ってみます.(ちなみに,はじめは食べログのAPIが使いたかったのですが,最近公開終了しています.)

このAPIをつかって,まずは,「「場所 検索ワード」をtwitterのあるアカウントに投げたときに,検索結果を投げ返してくれる」を目標にしてみます.

流れとしては,
Twitterでreplyを拾ってくる→reply内の「場所,検索ワード」を拾う→Yelp APIを用いて検索→結果をTwitterで投げ返す,
という感じです.まずは要のYelp APIから見ていきます.

Yelp APIは次のサイトで登録できます.

Yelp for Developers
http://www.yelp.com/developers/

登録をすると,Consumer Key, Consumer Secret, Token, Token Keyをもらえます.

つぎに,このKeyたちを使って登録し,APIをたたいてみます.Yelpはとっても親切で色々な言語のサンプルコードが置いてあります.コメントもたくさんあるので,わかりやすいです.今回はC#で書いてみました(サンプルコードをちょっと変えただけです.)

コードを載せておきます.
https://github.com/kkhiroki/SearchRestaurant

QueryAPIAndPrintResult に,Twitterのreplyもとの情報と(後述),場所,検索ワードを投げると検索結果を投げ返してくれます.

さて,Twitterの方は,

Coretweet  http://coretweet.github.io/

をつかってみました.これも使い勝手の良いラッパーで,たとえば何かツイートしたいときは,
tokens.Statuses.Update(status => "hello"); 
なんて感じで,簡単です.
reply を取りたかったら,
tokens.Statuses.MentionsTimeline()
で,mention欄のツイート直近20件を拾ってくれます.

以上の機能を組み合わせれば,目標を達成できます.たとえば「shinjuku sushi」とやると,

result_shinjuku_sushi











こんな感じで検索結果を返してくれます.ratingでソートしたり,最寄りの駅の情報なんかもとれます.
寿司食べたいです.

参考サイト
C#でTwitterアプリを作る 第0回 - LINQになりたい http://laco0416.hatenablog.com/entry/2014/03/24/204509

[Java]Yelp APIを使ってみる
http://imagination-i.net/2014/04/15/javayelp-api%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b/
 

SDEを解く

うろうろしてると,こんなPDFを見つけます.

An Algorithmic Introduction to Numerical Simulation of Stochastic Differential Equations
http://www.caam.rice.edu/~cox/stoch/dhigham.pdf

これは確率微分方程式(SDE)を数値的に解くことを主眼において,確率の知識があまりない学生もSDEがどういう方程式なのか,それを数値的に解くにはどのような方法があるのか,その気分が味わえるようになっているレビュー論文です.またMATLABのコードや実装上の注意等も豊富に載っており,実装になじみのない人にもとっつきやすく書かれています.

かねてからこの辺を触ってみたいと思っていたので,この機会に読んで実装してみました,というのがこの記事の要旨です.

さて,そもそもSDEとはどのような方程式なのか,まず式を書くと,
\begin{eqnarray}
{\rm d}X = f(X) {\rm d}t + g(X) {\rm d}W.
\end{eqnarray}
イメージとしては$f {\rm d} t$の項はトレンドを表し,$g {\rm d} W$の方は確率的な揺らぎを表します.工学をはじめ経済・物理・数学等で,さまざまな現象を記述する際に登場します.

$f$や$g$の形によっては解けますが,一般にはその解析解(厳密解)は知られていません.そこで数値計算の出番です. 先のSDEを解く,とてもシンプルな方法が知られています.Euler--Maruyamaの方法です.(ODEでの,単純なEuler法に対応します.)
\begin{eqnarray}
X_{j+1} = X_{j} + f(X_j)\Delta t + g(X_j) (W_{j+1} - W_j).
\end{eqnarray} 
もとの式を見れば,このスキームが近似解を与えそうな気持ちになります.気づくこととして,$f,g$の評価が$X_j $で行われているのは,伊藤積分の定義によるものでしょう.今回はC#で実装してみました.コードはここに置いてみます.
https://github.com/kkhiroki/SDE1DimSolver/blob/master/SDE1DimSolver.cs
 
動かしてみると,こんな感じです.初期値1.0,時刻$T=1.0$まで解いてみた結果です.$f(x)= \mu x$,$g(x) = \lambda x$(線形なSDE.) 赤が解析解,青がEMで解いた結果です.
resLinSDE

さて,上のコードを動かして or PDFを見ると,もっと近似精度が高いスキームが欲しくなります. ODEではRK法で,微分の近似をいくらでも高精度に取れます.それにはTaylor展開を基礎とする計算に依拠してスキームが構成されます.それを伊藤解析でも行い,スキームを構成したのがMilsteinの方法です.以下スキーム.(これもC#で実装しています.)\begin{eqnarray}
X_{j+1} = X_{j} + f(X_j)\Delta t + g(X_j) (W_{j+1} - W_j) \\
+ \frac{1}{2} g(X_j) g'(X_j)((W_{j+1} - W_j)^2-\Delta t).
\end{eqnarray} 
高次の項が出ていますが,ODEの場合とスキームが異なります.これは伊藤積分の性質から由来するものです. 動かしてみると確かにEMよりもきれいに解けているように見えますし,PDFでは誤差の検証をしています.

この先にはSDE版のRK法や,symplectic解法などがあるらしく,時間があったら挑戦して読んでみたいです. 

このページのトップヘ

見出し画像
×