読者です 読者をやめる 読者になる 読者になる

木構造に対してイテレータを作る

Rubyistなら知ってて当然みたいな内容かもしれませんが、自分で作るのはたぶん初めてのように思うのでメモ。本当はC++で同様のことがやりたいのだが、Rubyのほうがぱっとやるには早いのでとりあえずRubyにて。状況、モチベーションRubyにしろ、C++にしろコン…

mapとunordered_mapの違いについてまとめておく

NLPだとstd::mapとtr1::unordered_mapなら後者を使うことになることが多いと思うけど、あれこれ混乱してきたのでメモる。NLPerなら押さえておくべき常識のはず。。。それぞれの特徴 データ構造 std::map tr1::unordered_map 実装 赤黒木 ハッシュテーブル fi…

stlのコンテナをgdbできれいに表示する

vectorの要素を見たいんですよ。こんな風にできる。 (gdb) p f.c.x $2 = std::vector of length 2, capacity 2 = {1.4141999999999999, 3.1415000000000002} STLSupport - GDB Wiki gdbのversionを上げて(macportで入れていたのを上げたんだが、上がっていな…

logsumexpを使って乱数生成 + X^2検定

空港で暇にしていたので書いてみる(出発時間が遅れた)。takanori-i君がベイジアンHMMを作っているらしく、相談に乗る。確率の積が入ってきて、数値計算で死んでしまうときがあるとのことだったので、logsumexpについて教える。logsumexpについては高村本が分…

コピー演算子、代入演算子

C++

自分用メモ。C++でメンバ変数にスマートポインタ系のものがいる場合にはコピー演算子や代入演算子に注意を払っておかないと(勝手にだけど)ひどい目に合う。例えば左の木構造をコピーしようと思ったら差しているポインタがコピー元のleafではなく新しいほうの…

staticと翻訳単位と乱数生成器

C++

明日はもう研究会だというのにC++ではまってなかなか進まないorz(ダメ院生)。staticな変数とかはメモリの上で1つしか存在しないんだと思っていたら、そういうわけではなくソースファイルの中で、ということらしい(キーワード: 翻訳単位)。ちょっと長いが、下…

スマートポインタの先もコピー

C++

シングルスレッドで走っていたプログラムを並列で走らせようとしたら案の定困ったことが起きたりしたので、メモ。Chinese Restaurant Processとかでポインタを使ったりしていて、tableに座っている客の数を増減させたりする。生ポインタはあれなので、スマー…

Gamma分布からのサンプリング

自分用メモ。DPMにおいてハイパーパラメータのサンプリングをする必要がある場合、Gamma分布からサンプリングしてこなければならない。「Boostさんにお願いしてどうにかしてもらおう...」と思っていたところ、BoostさんはGamm分布の1変数のバージョンでしかA…

lower_boundの挙動

C++

あんまり使ったことがなかったので挙動の把握メモ。でかい順に並べておいて、最大のやつを取り除いたときに次にでかいのを知りたい。priority_queueでいいかなと思ったけど、最大以外のものも消えることを想定。 #include <iostream> #include <set> int main(int argc, cha</set></iostream>…

Multinomial DPMを実装してみた

ちょっと前に実装してたんだけど、メモを書くがてら公開してみる。やりたいこととしてはnested Chinse Restaurant Processまで行きたいんだけど、ノンパラベイズ初心者なので一番取りかかりやすいであろうDirichlet Process Mixture(DPM)を文書モデルでやっ…

C++のメモ書き

C++

実験しようと思うもあれこれ詰まる。。。 親クラスのメソッドを呼び出す 子クラスに同名のメソッドがあるとして。base::do_something(hoge);のような形で呼べばよい。 baseが変わったら子クラスのほうを書き換えるのが面倒なんだが、Javaでいうところのsuper…

FOBOSを使ってL1正則化SVM + L1正則化ロジステック回帰を実装しました

というか一ヶ月前くらいに実装してたんですけど、コード公開してなかったというだけです。 GitHub - syou6162/fobos news20のデータ使って遊んでみたりしていて、元々は100万次元以上あったものを正則化かけまくって次元を1000くらいに落としても精度はほと…

仮想関数、純粋な仮想関数についてまとめる

C++

「実験しよう」→「コードが分かりづらいなぁ...」→「ちょっと書き換えるか」→「コンパイル通らなくなった\(^o^)/」というよくある事態に陥ったので、ちょっとまとめて整理を試みる。いつもの通り自分用メモ。以下の本を中心に整理していきます。Javaを最初…

A*アルゴリズムについて整理

辞書を参考にしながら。NAISTのI期辺りでやったはずなんだが、かなりすっ飛んでいる。デジタル人工知能学事典 [CD-ROM付]作者: 人工知能学会出版社/メーカー: 共立出版発売日: 2008/05/16メディア: 単行本購入: 1人 クリック: 6回この商品を含むブログ (6件)…

C++でページランクを実装

実験で使いそうなベースラインがページランク的なアルゴリズムだったので、Rubyの実装を適当にC++に翻訳してみただけ。超簡単なのでよい。 Rubyでもっとも重要なライブラリは何か?PageRankで計算してみた - aikeの日記 #include <map> #include <cmath> #include <iostream> #incl</iostream></cmath></map>…

StackをLinked Listを使って実装

自分用メモ。データ構造とちょっとしたコードの例。StackA stack is a last in, first out data structure. There are two main fundamental operation for stack: push and pop. The push operation adds an item to the top of the stack. The pop operati…

練習がてらC++でHMMのコードを書いた

いわゆるお勉強的なコードなので特に新しいところはないです。HMMをベースにしたモデルを作る必要が(たぶん)出てきそうなんですが、そういえばHMMの前向き後ろ向きアルゴリズムの付近とか実装したことねぇやべぇと思ったので書いてみました*1。系列の長さが1…

配列なめる順序とその方法&実験

C++

ちょっと試してみる。sum取るところはどうでもいいんだが、配列なめる順序によってどれくらい速さが違うのか、iterator使うと速度どうなるのか、accumulateとか使うと早くなるのかなどを試したかった。実験に使ったのは以下のコードで、処理XXXを実験すると…

2010年は未定義です

C++

C++の話。vectorで範囲外参照をしたときに死んでくれるならいいけど、死ななくて範囲外参照していることに気づかないことがある(あった)。atにするのもなんだかなぁと思っていたんだけど、id:mickey24に_GLIBCXX_DEBUGというのを使う方法を教えてもらった。 …

ガンマ関数

C++

メモ。math.hのgamma関数はガンマ関数ではなく、ガンマ関数の値に対数を取ったもの(=lgamma)を返す。tgammaで所望のものが手に入る。なんでこんな名前になっているのか意味が分からん(歴史的な経緯なんだろうけど)。manを見たら"本当の"とか書いてあって冗談…

とあるモデルのMCMC

飽きもせずにGibbs Samplingとかばっかりやってますが、久しぶりにはまった。離散確率分布とかからサンプリングするのにrandとかを使ってたんだけど、これがとてもとてもとてもいけなかった。CとかC++のrandは線形合同法で実装されているとかで周期性が問題…

glogのmesseageを吐く場所

C++

Googleのloggingライブラリでglogというのがあって便利だなーと思って使っていたら/tmp以下のバカでかいlogファイルがたまっていることを教えてもらってあたふたしていたところ。ここを見るに"logtostderr"をtrueにしといてやればlogfileを吐く変わりにstder…

C++でのオブジェクトをRで使い回す

R C++

TokyoCabinetをRから使えるようなライブラリを書くとしたら、例えばこんな感じできる。 GitHub - syou6162/RTokyoCabinet: Simple wrapper of TokyoCabinet for R. しかし、これだとgetやputをするたびにopen&closeしに行っているのでアホな感じである。TCHD…

uint8とかMiniseのコード読んだりとか

C C++

Miniseのコード読みの続き。uint8とかuint64とか出てきてなんじゃいなという感じだったので調べてみる。Minise::addFilehttp://developers.curlap.com/curl/docs/rte/6.0/ja/docs/ja/dguide/primitive.htmlによると データ型 説明 既定値 サイズ(ビット) 有…

C++でUTF-8単位で一文字とか

C++

UTF-8単位で1文字とか - Seeking for my unique color.をC++で書いただけ。あとで自分で使うかもなので。 #include <iostream> #include <string> #include <vector> std::vector<std::string> split_utf8(const std::string& str) { std::vector<std::string> result; std::string tmp; bool first = true; for (</std::string></std::string></vector></string></iostream>…

SRM439 Div1 250 MazeMaker

迷路関係の問題。上下左右に動けるんじゃなくって、動き方が決まっている。いくつか行けない場所が指定されていて、その中で行くのに一番遠い場所に行くためのステップ数を返せ、というような問題。幅優先。 // BEGIN CUT HERE // END CUT HERE // Xの場所は…

pthread関係のメモ

C++

関数ポインタめんどくせえ、無名関数作らせろって感じです!! プログラムの命令やグローバルデータのようなものはプロセスに収める プログラムカウンタやスタックといった実行状態に関連する情報はスレッドに収める #include <iostream> #include <pthread.h> void* do_one_thing(v</pthread.h></iostream>…

shared_ptrのシリアライズ

基本的にここに書いてあることなんだが、解決策が書いてない。 Gmane Loom portで入れたboostのバージョンが $ port installed boost The following ports are currently installed: boost @1.41.0_1 (active) のときはコンパイルで怒られる。1.40.0_0のとき…

グラフ関連のアルゴリズムの俺俺クラスを作ってみた

が、色々網羅する前に力尽き(ry。 深さ、幅優先探索 強連結成分分解 ベルマンフォード法 くらいしか書いてない。 #include <iostream> #include <string> #include <vector> #include <map> #include <queue> #include <math.h> #include <boost/assign.hpp> #include <boost/shared_ptr.hpp> #include <boost/foreach.hpp> template </boost/foreach.hpp></boost/shared_ptr.hpp></boost/assign.hpp></math.h></queue></map></vector></string></iostream>

gtestとstd::tr1::tupleの相性が悪い

C++

テストのコンパイルが通らなくて少しはまったりしたので、メモ。gtestとstd::tr1::tupleを一緒に使っているとこんな感じのエラーが出る。 c++ namespace collision with gtest and boost - Stack Overflow ここに書いてある方法か #ifndef GTEST_HAS_TR1_TUP…

Knuth-Morris-Pratt algorithm with C++

#include <iostream> #include <string> #include <map> // ref http://infoshako.sk.tsukuba.ac.jp/~yamamoto/Courses/files/page2_13.pdf class KnuthMorrisPatt { public: std::string text; std::string pattern; int n; int m; std::map<int, int> pi; // prefix function KnuthMorrisPat</int,></map></string></iostream>…

Boyer-Moore String Search Algorithm with C++

The Boyer-Moore string search algorithm is one of the efficient string searching algorithm. This is based on a naive string searching algorithm which slides a pattern forward by 1 position and verifies whether a substring of text matches t…

Boost勉強会のrecordとかlogを見る

土曜だか日曜だかにBoost勉強会というのが開かれていました。Boostは使いこなせているわけではないけど、ないとすごく困り始めていたので参加したいなーと思っていたのですが80人の枠が一瞬にして埋まるという盛況振りだったので、その日は教習所の予定を入…

構築した辞書を元にAho Corasick法を使ってキーワードを探す

どのようなときにAho Corasick法が必要か辞書構築した後の応用先(?)の一つとして、辞書を元にした転置インデックスを作ることがあげられる。「どのキーワードがどの文章に登場したか」が一番簡単な転置インデックスだと思うんだけど、今回は登場した文章のど…

部分文字列の組み合わせをC++で

C++

これのC++版のメモ。 MeCabで切った後の複合名詞に対して、部分文字列の組み合わせを考える - Seeking for my unique color. #include <iostream> #include <string> #include <vector> #include <boost/foreach.hpp> std::vector<std::vector<std::string> > enum_cons(std::vector<std::string> v, int n) { std::vector<std::vector<std::string> > result; uns…</std::vector<std::string></std::string></std::vector<std::string></boost/foreach.hpp></vector></string></iostream>

バイナリデータの読み込み書き込み

C++

学習データの数がだんだんでかくなってきており、2000万サンプルくらいになってきている。こうなってくると「素性をファイルに書き出し、学習木に読み込ませる(学習はさせてない)」というプロセスすら結構時間がかかってくる。自然言語処理だとこのくらいの…

半教師あり学習でollを使いたいので、ollをライブラリとして使ってみる

バイトにて、岡野原さんが作られているオンライン学習をサポートした機械学習ライブラリ「oll」をめちゃくちゃ使わせてもらっている。 Google Code Archive - Long-term storage for Google Code Project Hosting. 自然言語処理のような大規模かつスパースな…

有理数を使って、ベクトルの正規化

C++

水曜日に困っていたところ。 割合の合計して1にならない - Seeking for my unique color. コメントで有理数を使うとよいと教えてもらった。boostのほうは分数の形で渡さないといけないので、今回のにはちょっと使えなさそう。ということで、こちらのを使わせ…

はまった。。。

boost::tokenizerでうまくいかないときがあるなあと思っていたらはまっていた。 このようにやると、結果がめちゃくちゃです。悩んだ挙句 tokenizer.hpp を覗いてみて原因判明。tokenizer 内部では、コンストラクタの第1引数で渡されたオブジェクトの iterato…

割合の合計して1にならない

C++

Rでいうところの > sum(1:10 / sum(1:10)) [1] 1 という感じで、全部足すと1になるように正規化したいんですが、C++でうまくいかない。 /Users/syou6162/cpp% ./a.out The sum is 9.9999999999809e-01 The sum is not 1.0 以下ソース。

TBBのインストール

C++

基本ここを真似する。make installができないので精神衛生上よくないように思う。 http://ppwww.phys.sci.kobe-u.ac.jp/~akusumoto/linux/detail.php?d=config/tbb/install ヘッダーファイルは/usr/local/include、ライブラリは/usr/local/lib/tbbみたいな感…

差集合的なにか

C++

"cppref algorithm/set_difference"とかで調べればすぐに分かるだろう、と思ったら分からんかった><inserterって何やねん。 #include <iostream> #include <algorithm> #include <set> #include <boost/foreach.hpp> using namespace std; int main(int argc, char *argv[]) { set<int> s1; s1.insert(1); s1.</int></boost/foreach.hpp></set></algorithm></iostream>…

言語モデルの準備

自然言語処理特論で使うやつの準備の準備くらいの。準備として青空文庫のテキストを食わせる。で、何か入力の文を与えるとUnigram、Bigram、Trigramの言語モデルでのその文が出てくる確率を計算する。確率は非常に小さくなるので、出力するところでは対数を…

素晴しい!!

C++

PerlもRもヘルプが大変充実しているんですが、C++にはないので非常に苦痛でした。が、こんなのができたらしい! GitHub - kazuho/cppref: man-style access to cppreference.com documents これでイライラしなくてよいですね!!boostにも同じようなものがある…

Trieとかtcとか系列タギングとか

タブ区切りデータの三列目を取り出す「-F」の使い方、すぐ忘れる。。。 perl -F"\t" -anle 'print $F[2]' umls2ja.tab Trieを構築するためのライブラリTx http://www-tsujii.is.s.u-tokyo.ac.jp/~hillbig/tx-j.htm dartsのほうは日本語だとうまく動かない…?T…

マルチスレッドとstl

C++

スレッドの中でvectorに次々につっこんでいくプログラム。 #include <iostream> #include <vector> #include <boost/foreach.hpp> #include <boost/thread.hpp> #include <boost/bind.hpp> using namespace std; vector<int> v; void greetingWithID(int i) { v.push_back(i); } int main(int argc, char *argv[]) { int n = 1000; boost::</int></boost/bind.hpp></boost/thread.hpp></boost/foreach.hpp></vector></iostream>…

mapのvalueでソートしたい

C++

PerlやRubyみたいに。stlのmapはディフォルトでキーでソートされていて、valueではできないっぽい。結論からするとpriority_queueを使うとよさそう。 #include <iostream> #include <map> #include <queue> #include <string> #include <boost/foreach.hpp> typedef std::map<std::string, int> container; typedef std::pair<std::string, int> val</std::string,></std::string,></boost/foreach.hpp></string></queue></map></iostream>…

segmantation faultの原因をつきとめる

g++ -g hoge.cpp という形で、コンパイルしてからgdbを起動。runしてwhereすると原因に近い場所がつきとめられる、らしい。

RserveをC++から使ってみる

R C++

最近Rを使っていなさすぎて死ぬレベルなので、Rを使うことにした。ただし、C++を通して。RserveというRを叩けるTCP/IPサーバーがあるらしいので、それを使います。主にJavaで使うことを想定されているらしいですが、Javaはもう覚えていないので*1、C++で触り…

stringとwcharの変換

C++

自分用メモ。ああああ、C++で文字列めんどくせえええ。 #include <iostream> #include <string> #include <vector> #include <locale> #include <cstdlib> using namespace std; void narrow(const std::wstring &src, std::string &dest) { char *mbs = new char[src.length() * MB_CUR_MAX + 1]; wcsto</cstdlib></locale></vector></string></iostream>…