Reservoir sampling
件のデータから 件をランダムサンプリングする場合のアルゴリズムで、
が未知数であっても、 を求める必要がなく、
1passでランダムサンプリングができる。
今まで を求めるためにかかっていた時間を家事や育児にあてることができる。
概要
件のデータを とする。
このアルゴリズムでは、Reservoir(貯水池)を として、
そこに 件のデータを随時貯めておく。
Reservoirは処理の過程でどんどん更新されていき、
最終的にはこれがサンプリング結果となる。
アルゴリズム
アルゴリズムは基本的に2つのステップから構成される。
ステップ①
最初の 件をとりあえずReservoirにぶっこんでおく。
にデータ を代入。
ステップ②
データ については の確率でReservoirの保持内容を更新する。
の整数値をとる一様乱数 を生成し、 の場合、 に を代入。
解釈
本当にランダムサンプリングされているのか気になるところ。
2つの場合に分けてデータ が選ばれる確率を考えてみる。
データ がReservoirに残る確率
が更新されない確率
データ がReservoirに残る確率
に が代入される確率 が更新されない確率
実装例
行数が未知のテキストファイルから 行をReservoir samplingにて取り出す例。
サンプリング結果はテキストファイルとして出力。
import random def random_sampling(inputFile, k=10000, header=True): R = [] columns = '' with open(inputFile) as fin: if header: columns = fin.next() for i in range(k): R.append(fin.next()) i = k for line in fin: j = random.randint(0,i) if j<k: R[j] = line i += 1 outputFile = inputFile.split('.')[0] + '_random' + str(k) + '.' \ + inputFile.split('.')[1] with open(outputFile,"w") as fout: if header: fout.write(columns) for line in R: fout.write(line)
Twitterと形態素解析
R Advent Calender 25日目の記事を担当しますメロスです。
12月25日である本日は街中がピンク色に包まれるあのクリスマスです。
今年ももうそんな時期なんですね。
ところで、街中がカップルで埋め尽くされる中、
ある重要なプロジェクトが裏ではしっていることをご存知でしょうか。
そう、卒論です。
卒論締め切り間近の学生にとっては、
クリスマスどころではないとか、
いや、むしろ絆を深めるチャンスであるとかないとか。。。
僕は誰かの役に立ちたいという気持ち、
すなわち自己承認欲求がえげつない人間ですから、
彼・彼女らの悲痛な叫びを汲み取って、
こんな僕にも手伝えることはないか考えてみました。
構想としてはこんな感じです。
①Twitterから「卒論」を含むツイートを取得
②ツイートに含まれる形容詞の使用頻度ランキングを出力
③ランキングの結果から卒論に没頭している学生の気持ちを察し、エールを送る
①Twitterから「卒論」を含むツイートを取得
ツイートデータをとってくるためには以下の3つが必要になります。
(1)Twtitterのアカウント
(2)TwitteRパッケージのインストール
(3)ROAuthパッケージのインストール
TwitteRパッケージを利用すると、
ツイートの取得やRからのツイートが可能になります。
詳細はこちらにありますので、ご参考に。
http://cran.r-project.org/web/packages/twitteR/twitteR.pdf
また、ROAuthパッケージはOAuth認証のためのパッケージとなっており、
そのー、深く考えたら負けです。
この記事では(2)以降について記していきます。
なんで、まずはTwitteRパッケージとROAuthパッケージをインストールしましょう。
install.packages("twitteR") install.packages("ROAuth")
インストールが完了したので、
実際に「卒論」というキーワードを含んでいるツイートを
とってきます。
#「卒論」を含むツイートを取得 library(twitteR) library(ROAuth) twit.oauth <- OAuthFactory$new( handshakeComplete = TRUE, signMethod = "HMAC", consumerKey = "*********************", consumerSecret = "*********************", oauthKey = "*********************", oauthSecret = "*********************) registerTwitterOAuth(twit.oauth) n <- 3200 tweet <- searchTwitter("卒論",n)
これで3200ツイートのデータがとれました。
②ツイートに含まれる形容詞の使用頻度ランキングを出力
ツイートがどういう単語から構成されているのか調べるために
RMeCabを使って形態素解析を行います。
そのためには、以下の2つが必要になります。
(1)MeCabのインストール
http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html#download
(2)RMeCabパッケージのインストール
http://rmecab.jp/wiki/index.php?RMeCab
実際にRMeCabを使って、大好きな言葉を形態素解析してみます。
> library(RMeCab) > RMeCabC("お家に帰るまでが遠足です") [[1]] 名詞 "お家" [[2]] 助詞 "に" [[3]] 動詞 "帰る" [[4]] 助詞 "まで" [[5]] 助詞 "が" [[6]] 名詞 "遠足" [[7]] 助動詞 "です"
RMeCabC()は日本語文字列に対して、
形態素解析の結果をリストとして返す関数です。
「お家に帰るまでが遠足です」という一文が
意味をもつ最小の言語単位に分割されたことになります。
先ほど取得したツイートデータにも形態素解析を行い、
形容詞を対象とした出現回数のランキングを算出してみます。
こんどはRMeCabFreq()を使ってみます。
RMeCabFreq()はテキストファイルを形態素解析し、
その頻度をデータフレームとして返す関数です。
tweet.text <- character(n) for (i in 1:n){ tweet.text[i] <- tweet[[i]]$text tweet.text[i] <- gsub("RT.?@.*","",tweet.text[i],perl=TRUE) #RT以降の文章を削除 tweet.text[i] <- gsub("@\\w*","",tweet.text[i],perl=TRUE) #アカウント名を削除 tweet.text[i] <- gsub("http:\\/\\/[\\w\\.\\/]*","",tweet.text[i],perl=TRUE) #URL削除 } write(tweet.text,file="tweetdata.txt") word <- RMeCabFreq("tweetdata.txt") adjective <- word[word$Info1 == "形容詞",] adjective <- adjective[order(-adjective$Freq),]
形容詞ランキングトップ30はこんなふうになりました。
> head(adjective,30) Term Info1 Info2 Freq 3955 ない 形容詞 自立 85 3919 いい 形容詞 自立 34 3971 やばい 形容詞 自立 31 4018 眠い 形容詞 自立 27 4004 早い 形容詞 自立 20 4041 いい 形容詞 非自立 20 4007 楽しい 形容詞 自立 19 3952 つらい 形容詞 自立 14 3992 忙しい 形容詞 自立 13 4013 無い 形容詞 自立 11 3946 すごい 形容詞 自立 10 3999 悪い 形容詞 自立 10 4027 良い 形容詞 自立 10 3972 よい 形容詞 自立 9 4032 辛い 形容詞 自立 8 3985 多い 形容詞 自立 7 3986 嬉しい 形容詞 自立 7 4015 痛い 形容詞 自立 7 4034 遅い 形容詞 自立 7 3935 かわいい 形容詞 自立 6 3958 はやい 形容詞 自立 6 3984 可愛い 形容詞 自立 6 3993 怖い 形容詞 自立 6 3916 っぽい 形容詞 接尾 5 3937 きつい 形容詞 自立 5 4008 欲しい 形容詞 自立 5 4047 良い 形容詞 非自立 5 3922 うまい 形容詞 自立 4 3928 おかしい 形容詞 自立 4 3949 だるい 形容詞 自立 4
あー、なるほどね。うん。
わかる。わかる。
大丈夫です。
完璧に理解しました。
卒論で苦しんでいる彼・彼女らへのエールでしたら、
僕に任せてください。
③ランキングの結果から卒論に没頭している学生の気持ちを察し、エールを送る
進捗どうですか♡
ラグランジュの未定常数法(the method of Lagrange mulitipliers)
概要
多変数実数値関数の停留点を変数間の制約条件下で求めるための方法。
束縛問題を極値問題として扱うことができる。
そのため、束縛されたいと強く望むあなたには、おすすめできない。
等式制約条件下での最適化問題
目的関数 が最大となる点を
個の等式制約
の下で求める。
この問題はラグランジュの未定常数法により解くことができる。
※等式制約条件下での最適化問題をラグランジュの未定常数法で解く場合、目的関数や制約条件式に対して微分可能性や凸関数である等の条件が必要であるが、それらがすべて満たされていると仮定する。
この問題に対してラグランジュ関数と呼ばれる次の実数値関数を定義する。
このとき、以下の連立方程式を解くことによって 最適点を求めることができる。
このようにして最適点を求める魔法が昨今、世間を賑わせているラグランジュの未定常数法である。
幾何学的な説明
例題を通して、幾何学的な説明をしていく。
例:
このとき、目的関数のグラフは以下のようになる。
何かに似ているが偶然である。
これを上から見た図が以下。
※黒い線は等高線を、青い線は制約によってがとりうる範囲(制約面)をそれぞれ表している。
まず、最適点においては制約面と等高線は接していなければならない。
もしそうでないとすると、制約面に沿っての値がさらに大きくなるように移動できてしまい、矛盾。
よって以下のことがいえる。
また、制約面と等高線が一致していたとしても、制約面上に解があるとは限らないので、
という条件も必要になる。
以上をまとめると次の連立方程式が導かれる。
これより、最適解が得られた。
不等式制約条件下での最適化問題
ラグランジュの未定常数法は不等式制約条件下での最適化問題にも適用できる。
ただ、僕はもう疲れ(手記はここで途絶えている)
参考
パターン認識と機械学習 上
言語処理のための機械学習入門
MySQLをMacOSにインストール
インストール
①ここからファイルをダウンロード
②ダウンロードしたファイルを開いて
次の2つのインストーラパッケージを実行
・mysql-5.6.12-osx10.7-x86_64.pkg
・MySQLStartupItem.pkg
③MySQL.prefpane を実行して
システム環境設定にMySQLを追加
これでインストールは終わり
MySQLの起動と終了
起動時にはターミナルから次のコマンドを入力
sudo /Library/StartupItems/MySQLCOM/MySQLCOM start mysql -u root -p
パスワードを聞かれたらEnter
終了時にはターミナルから次のコマンドを入力
sudo /Library/StartupItems/MySQLCOM/MySQLCOM stop
Rで行列を使って累積を求める方法
Rでベクトルの累積和を出す際に
行列かけてできないかな
なんてことを考えてみました。
#もしもこんなベクトルがあったとしたら x <- c(1:10) #ベクトルの大きさを調べて、その大きさの正方行列を作成 n <- length(x) A <- matrix(1,n,n) #上三角行列を0にする A[upper.tri(A)] <- 0 #Aはこんな行列 > A [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 1 0 0 0 0 0 0 0 0 0 [2,] 1 1 0 0 0 0 0 0 0 0 [3,] 1 1 1 0 0 0 0 0 0 0 [4,] 1 1 1 1 0 0 0 0 0 0 [5,] 1 1 1 1 1 0 0 0 0 0 [6,] 1 1 1 1 1 1 0 0 0 0 [7,] 1 1 1 1 1 1 1 0 0 0 [8,] 1 1 1 1 1 1 1 1 0 0 [9,] 1 1 1 1 1 1 1 1 1 0 [10,] 1 1 1 1 1 1 1 1 1 1 #各成分までの累積を求める y <- A %*% x #結果はこんな > y [,1] [1,] 1 [2,] 3 [3,] 6 [4,] 10 [5,] 15 [6,] 21 [7,] 28 [8,] 36 [9,] 45 [10,] 55
序章:どうも僕です。
そうです。僕があのメロスです。
昔は約束を守るために走ったりしましたが、
もうね、
この年になると自分が一番大事ですよね。
走ってらんないわけです。
セリヌンティウスとかどうでもいいし。
これが大人になるということなんでしょうか。
好きなことをやって生きていけたら
それは素晴らしいことで、
それを実現するために
流した汗(あせ)とか汚い汁(しる)とかを
一度、浄水器を通してから
ここに残していこうかなと企んでいます。