メモ帳

メモ帳です.

Fast and Exact Top-k Algorithm for PageRank [AAAI'13]

PageRankにおいて高速かつ正確にTop-kを求める

読んだ論文を忘れないうちにまとめておく.
この論文は,PageRankのTop-k検索を求める手法 F-Rank を提案した.

問題

Given: Arbitrary graph G and required number of answer nodes k.
Find: Top-k nodes with respect to thier PageRank scores exactly and efficiently.

提案手法

イデア

反復計算の各ステップにおいて,

  • ノードの最終的なスコアの上限値,下限値を推定.

  • 推定値に基づいて不必要なノードを枝刈りし,部分グラフを構築.

結果として,計算対象とするグラフのサイズが小さくなり,計算コストが削減される.

詳細

  • 各ステップにおいて,推定値はO(1)でincrementallyに計算可能.
  • 上限値,下限値は本来のスコアに収束する.
  • k-th highest lower bound estimation を εk とすると,upper bound estimationが εk よりも小さいノードは解になり得ない.
  • 解になり得るノードの集合を CCにreachableなノード集合をRとする.スコア計算はR全体に,推定値の計算はCを対象に行う.

実験

P2P,Web,Wikipediaの3種のデータセットを用いる.

実行時間

  • オリジナルのPageRank計算と比較して,それぞれ40%,70%,90%削減された.

正確性

  • オリジナルのPageRankで得られた結果と一致する.

以上より,高速かつ正確な結果が得られることが示された.

Macの読み上げ機能を使って英語の文書を読む

Macのデフォルトの読み上げ機能を使ってみたところ,思っていた以上に流暢な音声で読み上げてくれたので記事にまとめてみたいと思います.

Macの読み上げ機能

Macにはデフォルトで読み上げ機能が付いています.僕自身は読み上げ機能が付いていること自体はもともと知っていましたが,実際に使ったことはありませんでした.
大学4年次になってから論文などの英語の文章を読む機会が増えたため,試しに使って見ることにしました.

使い方

Mac標準のPDF表示アプリケーションであるプレビューを用いて説明したいと思います.読み上げたい文章を選択し,画面上部の「編集」から「スピーチ」を選択し,「読み上げを開始」を押すと読み上げが開始します.
デフォルトでは「Kyoko」という日本人女性の音声による読み上げが行われるため,英語の文章を読み上げた場合は片言の英語が音読されます.
システム環境設定から音声データを変更することができます.「システム環境設定」>「音声入力と読み上げ」を選択すると次の画面が表示されます. f:id:tomov3:20160517173851p:plain 「システムの声」>「カスタマイズ」を選択すると,音声データをダウンロードすることができます.
様々な言語のバリエーションがありますが,英語の場合は「Samantha」をオススメします.
ダウンロードが終了すると,無事にその音声が設定できるようになります.

長い文章の場合でも流暢に読み上げてくれるため,発音を確かめたい場合や音声によって頭にインプットしたい場合にとても有効です.

pythonの実行環境を整える

python2とpython3を切り替えるための方法がいろいろ公開されていますが、どれを使えば良いのかわからなかったのでメモ。
OSはMac OS X Yosemite (10.10.5)です。(El Capitanの別マシンでも同様に導入することができました。 )

参考ページ
pyenv および virtualenv の使い方

pyenvでpythonのバージョンを切り替える

pyenvのインストール

まずはpyenvのインストールから。

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

これでホームディレクトリ直下に.pyenvディレクトリがcloneされます。
そして.bash_profileに以下の3行を追記します。
zshを使っている方は.zshrcに追記してください。

export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"

シェルを再起動するか、

$ source .bash_profile

を実行して変更を反映します。
これでpyenvコマンドが使えるようになります。

pythonのインストール

pyenvを使ってpythonのいろいろなバージョンをinstallしていきます。

$ pyenv install --list

でインストール可能なpythonのバージョンの一覧が表示されます。
ここから仮に3.5.0をインストールする場合は下のコマンドを実行します。

$ pyenv install 3.5.0
$ pyenv rehash

rehashは~/.pyenv/shimsの更新をリフレッシュするコマンドです。
バージョンの一覧は

$ pyenv versions

で確認することができます。
いよいよバージョンの変更ですが、global、localの2通りの変更方法があります。

$ pyenv global 3.5.0

または

$ pyenv local 3.5.0

globalはシステム全体、localはそのディレクトリのみpythonのバージョンの変更を適用します。
実際にpythonのバージョンが変更したかどうかは以下のコマンドで確認することができます。

$ python --version

これで3.5.0に変更されていたら終了です。
もしシステムのデフォルトのpythonに戻したい場合はsystemに変更すれば大丈夫です。

$ pyenv global system

Gitの基本知識

Gitを使い始めて、便利だと思った機能等をメモ。

.gitignore

これはGitで管理する必要のないもの、例えば、エディタのバックアップファイル等を登録しておくことで、リポジトリの管理対象外にすることでできる。

*~    //emacs
*.swp //vimのバックアップファイル

ファイル名を変更

ファイル名を変更するには

git mv foo bar

これでファイル名をfooからbarに変更できる。コマンド実行後はワーキングツリー、インデックス共にファイル名が変更された状態になっている。

直前のコミットを変更する

コミットした後にコミット内容やコミットメッセージを変更したいときは、間違いを訂正して新たにコミットを行う機能がある。それが--amendオプションである。 ・コミット内容を変更する場合 コミット後にREADMEのタイプミスが見つかったとする。これを変更するにはまずファイルを修正してインデックスに追加する。

git add README

その後に以下のコマンドを実行すると直前のコミットが変更される。

git commit --amend

・コミットメッセージを修正する場合 この場合はすぐに以下のコマンドを打つと新たにコミットメッセージを入力できる。

git commit --amend

最新のコミット状態へ戻す

誤ってファイルを削除してしまったりした場合に用いる。 仮に.bashrcを削除してしまったとする。 このとき、ワーキングツリーからは削除されているが、インデックスには変わらずに登録されたままになっている。 そこで下のコマンドを実行すると、最新のコミット(HEAD)のときの.bashrcへ戻してくれる。

git checkout HEAD .bashrc

bareリポジトリ

リモートリポジトリを作成するときはbareリポジトリとして作成すると、変更のみを管理するリポジトリとなり、ワーキングツリーとインデックスとの差異で生じるトラブルを抑えることができる。

git init --bare

git config

git configは、ホームディレクトリにある.gitconfig、リポジトリ内の.git/configの2つあるが、優先順位としては後者が優先される。

git statusの詳細

On branch master: この状態でコミットすると、masterブランチにコミットされることを示す。

nothing to commit: ワーキングツリー、インデックスに対して変更がない場合。

Changes to be committed: ここに表示されるファイルは次回のコミットの対象になる。git addでインデックスに登録したファイルや、git mergeコマンドでマージされたファイルなどが含まれる。

Changes but not updated: ワーキンググリーで変更されているが、その変更がインデックスに登録されていないファイルが表示される。

Untracked files: ワーキングツリーには存在するが、Gitの管理対象外となっているファイルが表示される。

Gitを利用する準備

ホームディレクトリ下にあるいわゆるdotfilesを管理し、いろいろな端末から使えるようにするためにgitを導入することにした。

まずはgitをインストールする。

Mac OSの場合、MacPorts、Homebrewを用いると楽にインストールすることができる。

MacPortsの場合

sudo port install git-core

Homebrewの場合

brew install git

また、Linuxの場合はパッケージマネージャを用いて同様にインストールすることができる。 例えば、Debianの場合は

sudo apt-get install git

windowsCygwin等を用いた方法があるらしいが、windowsのマシンが手元にないため省略、、、

Gitで使う名前、メールアドレスの登録

Gitでログインするユーザの設定は以下の通りである。

git config --global user.name "hogehoge"
git config --global user.email foo@bar.hoge

こうすることで、この設定をしたPCにログインするユーザがGitを利用した場合、すべてのリポジトリに反映される。

基本的なワークフロー

1、リポジトリを作成 2、ファイルの作成、編集 3、インデックスへ登録 4、コミット

2〜4を繰り返すことが基本的な流れである。

リポジトリの作成は、管理したいディレクトリ(dotfilesとする)に移動して

git init

と打つだけである。 これで.gitディレクトリが作成される。 この場合、dotfilesディレクトリが作業領域、.gitディレクトリがリポジトリという扱いである。

このリポジトリで.bashrc、.bash_profileを管理する場合、リポジトリにこれらのフィアルを登録する必要がある。 そのため、ホームディレクトリにある.bashrc、.bash_profileをdotfilesディレクトリに移動し、ホームディレクトリに対して移動したファイルのシンボリックリンクを貼る。 こうすることで直接ホームディレクトリにリポジトリを作らなくて済む。

cd ~
mv .bashrc .bash_profile dotfiles
ln -s dotfiles/.bashrc .
ln -s dotfiles/.bash_profiles

これで2つのファイルはワーキングツリーには存在している状態にはなったが、Gitの管理対象にはなっていない。

そこでインデックスにファイルを登録する。

git add .bashrc .bash_profile

これで初めてリポジトリへコミットすることができる。 コミットするにはコミットメッセージが必要であるため、-mオプションで"Initial commit."等を指定する。

git commit -m "Initial commit."

コミットの履歴は

git log

で確認することができる。 -pオプションを指定すると実際にどのように変更したかが表示される。

ここから新たにファイルを編集する場合は、編集するたびにaddし、それをcommitすれば良い。

基本的な操作は以上である。