タイトルにアルゴリズムとあるが、中身の多くは最近良く話題になる人工知能について割かれている。アルゴリズム自体の話よりも、いかに使われてきたか、それを開発した人たちにどのようなドラマがあったかを中心にまとめられている。
ウォール・ストリートの株式市場で人工知能が使われていることは有名だが、本書によると1987年ころには早くも使われていたとのことだ。正直、インターネットも一般的に普及していないような時代から利用されていたとは意外であった。
また、本書の別の箇所では、山をぶちぬいて二地点間を直線に高速回線を引いてしまうエピソードが載せられている。「最低でも2億ドル」と本書が述べる工事予算に出資していまう投資家がさらりと現れるところが、なんともアメリカらしい逸話だ。
金融以外では、音楽の自動作曲を試みた大学教授の話が興味深い。楽曲自体は優れたものでありながらも、自動生成されたということを知った途端、聴衆の興味が削がれている様など、古くから人工知能の限界に挑んでいた様子が詳細に描かれている。
2014年11月14日金曜日
Hatching Twitter(Twitter創業物語)
Twitterの創業にまつわるエピソードを書いた本。
Twitterを立ち上げる前に取り組んでいたサービスなども詳細に書かれており、どのような経緯でTwitterが生まれていったかよく分かる。
また創業者間の人間関係の確執なども、せきららに書かれており、Twitterの創業の場に居合わせたかのような臨場感を味わうことが出来る。正直、よく許可を出したなと思えるくらい恥部が満載なのも読み手としては非常におもしろい。
読んでいて興味深いと思ったことをいくつか纏めてみる。
1. 創業者の一人(Evan)はすでに、スタートアップで実績があった
ずっと利益0の状態なのに、なぜか投資家による資金投入が行われているのは本を読むから知っていて、アメリカは違うなーと単純に思ってたんですが、EvanはすでにGoogleにブログサービス(私も使っているこのBlogger)を売却した実績があって、スタートアップ界隈ではすでに有名人だったようだ。
別に有象無象の人間に投資を続けていたわけではなく、投資されるだけの理由がちゃんとあったわけです。あと、はじめの方はEvan本人がBloggerの売却益を回したりしていたようだ。
2. テレビ業界などのメディアが積極的にTwitterを利用していた。
最近は若干ましになった気もするが、日本のメディアのIT嫌いは異常なほど。それに比べると積極的にテレビの番組などでTwitterを利用している様子は印象的だった。
2014年10月21日火曜日
Gitレポジトリの移行方法
gitのレポジトリを移行する方法のメモ。
bitbucketで管理してたレポジトリをgithubで管理したくて調べてみた。
export/importやるのかと思いきや、remoteサーバのurl設定を替えるだけでいいようだ。
まず、今の設定を確認
%>git remote -v
origin https://kentan@bitbucket.org/kentan/test.git (fetch)
origin https://kentan@bitbucket.org/kentan/test.git (push)
次に、remoteレポジトリの変更
%>git remoteset-url origin https://github.com/kentan/test2.git%>git remote -v
origin https://github.com/kentan/test2.git (fetch)
origin https://github.com/kentan/test2.git (push)
そして、ソースのpush
%> git push origin mastergit logをすると、きちんと過去のcommit logまでpushされており、はじめからgithubにcommitしていたかのように移行できる。
2014年9月30日火曜日
[R言語] table関数
table関数の挙動をメモしておく。
vには"a"が2回,"b"が2回,"c"が1回出現したとういう意味。引数に与えたvectorの頻度が得られる。
列(row)のためのVentorを用意する。
そして、次に行(Colomn)のためのVectorを用意する。
これを、table関数の第一引数、第二引数にそれぞれ渡す。
すると下記の値が得られる。
これがどのような値か解説すると、 ("a","A")のペアが3組, ("b","B")のペアが3組, ("b","A")のペアが0組, ("a","B")のペアが0組、というデータ形式を表すことになる。
ペアは、ベクターrとcの同じ順序の値が選択される。例えばrの第一要素は"a", cの第一要素は"A"であるので、ペアとして("a","A")が選ばれる。
ペアを全部列挙すると、
("a","A")
("b","B")
("a","A")
("b","B")
("a","A")
("b","B")
という6組のペアが生成され、このペアの出現頻度を行列形式で表したのがtable(r,c)ということになる。
tableって名前から結果が想像しづらい。
参考文献
Table(v)
まず引数一つのパターン。
引数に渡すVectorを用意する。
v <- c("a","b","a","b","c")
これをtable関数に渡す。
t <- table(v)
結果は次のようになる。
a b c
2 2 1
Table(r,c)
次に引数2つのパターン。列(row)のためのVentorを用意する。
r <- c("a","b","a","b","a","b")
そして、次に行(Colomn)のためのVectorを用意する。
c <- c("A","B","A","B","A","B")
これを、table関数の第一引数、第二引数にそれぞれ渡す。
t <- table(r,c)
すると下記の値が得られる。
A B
a 3 0
b 0 3
これがどのような値か解説すると、 ("a","A")のペアが3組, ("b","B")のペアが3組, ("b","A")のペアが0組, ("a","B")のペアが0組、というデータ形式を表すことになる。
ペアは、ベクターrとcの同じ順序の値が選択される。例えばrの第一要素は"a", cの第一要素は"A"であるので、ペアとして("a","A")が選ばれる。
ペアを全部列挙すると、
("a","A")
("b","B")
("a","A")
("b","B")
("a","A")
("b","B")
という6組のペアが生成され、このペアの出現頻度を行列形式で表したのがtable(r,c)ということになる。
tableって名前から結果が想像しづらい。
参考文献
Frequency tables
2014年9月9日火曜日
機械学習入門 サンプルコードの間違い
Oreilly社発行の「機械学習入門」にて、サンプルコードの誤りを見つけたので、ここに残しておきます。
サンプルが管理されているgithubではissueとして報告されており、pull requestも出しているが、1年以上前のpull requestが放置されている状態をみると、公式に直される可能性は残念ながら低そうな様子。今回見つけたバグは3章のemail classifyのコード。
classify.email <- function(path, training.df, prior = 0.5, c = 1e-6)
{
# Here, we use many of the support functions to get the
# email text data in a workable format
msg <- get.msg(path)
msg.tdm <- get.tdm(msg)
msg.freq <- rowSums(as.matrix(msg.tdm))
# Find intersections of words
msg.match <- intersect(names(msg.freq), training.df$term)
# Now, we just perform the naive Bayes calculation
if(length(msg.match) < 1)
{
return(prior * c ^ (length(msg.freq))) ★
}
else
{
match.probs <- training.df$occurrence[match(msg.match, training.df$term)]
return(prior * prod(match.probs) * c ^ (length(msg.freq) - length(msg.match))) ★
}
}
パッと見た感じ問題がなさそうなんですが、実は★で示した行の処理は、ものすごい小さい浮動小数点になるため、値が0になってしまします。
c = 1e-6( = 0.000001)であり、それに対して(length(msg.freq) - length(msg.match)))という最大で数百になる数でべき乗を求めているので、数値上は1e-1000を越えることがあり、Rで扱える浮動小数点の最小値を下回ってしまっているようです。
そのため、数をRで扱える範囲に移動させるために、全体に対してlog10を与えます。
if(length(msg.match) > 1)
{
return (log10(prior) + length(msg.freq) * log10(c)) ★
}
else
{
match.probs >- training.df$occurrence[match(msg.match, training.df$term)]
return (log10(prior) + sum(log10(match.probs)) + (length(msg.freq) - length(msg.match)) * log10(c)) ★
}
}
なお計算の途中で下記のlogに関する定理を利用しています。
log(A * B) = logA + logBまた prod(match.probs)は、match.probsというベクトルの全要素を掛け合わせるという計算式ですので、これにlog10を適用すると下記のようになります。
log(A ^ C) = C*logA
log(prod(match.probs) = log(a1 * a2 * ... * an)= log(a1) + log(a2) + ... + log(an)
= sum(log(match.probs))ちなみにissue#17にも報告がある通り、これを適用するとスパム判定結果が書籍の値と全く違う値になりますなんか、Amazonレビューによると書籍自体も作りが甘い箇所が多いようですし、加えてコードにもかなり致命的があります。本のコンセプト自体は他に類がない希少なものでありながら、結果としてこのような適当な作りに仕上がってしまったのはなんとも残念です。
2014年9月3日水曜日
tmパッケージを使ったサンプル [R言語]
R言語でtmパッケージを使ったサンプル
まずコーパスを作成して、TermDocumentMatrixを作る。
得られたTermDocumentMatrixをいろいろいじってみる。
例えば一行目は"This is a first line"だったので、Docs 1としてfirst, line, thisがそれぞれ1回カウントされている。
まずコーパスを作成して、TermDocumentMatrixを作る。
R> library('tm')読み込んでるsource.txtの内容は次のようなサンプル文
R> con <- file(file.path("source.txt"),open="rt")
R> text <- readLines(con)
R> close(con)
R> corpus <- Corpus(VectorSource(text))
R> tdm <- TermDocumentMatrix(corpus)
This is a first line.
This is a second line.
This is a third line.
The forth line is being written.
得られたTermDocumentMatrixをいろいろいじってみる。
inspect()
各Docs(今の例では1行がひとつのDocに対応)に出てくるTermを全部表示する。R> inspect(tdm)
A term-document matrix (10 terms, 4 documents)
Non-/sparse entries: 14/26
Sparsity : 65%
Maximal term length: 8
Weighting : term frequency (tf)
Docs
Terms 1 2 3 4
being 0 0 0 1
first 1 0 0 0
forth 0 0 0 1
line 0 0 0 1
line. 1 1 1 0
second 0 1 0 0
the 0 0 0 1
third 0 0 1 0
this 1 1 1 0
written. 0 0 0 1
例えば一行目は"This is a first line"だったので、Docs 1としてfirst, line, thisがそれぞれ1回カウントされている。
findFreqTerms
3回以上登場するtermを抽出する。R> findFreqTerms(tdm,3)
[1] "line." "this"
findAssocs
指定した単語に共起されるtermを抽出する。第3引数は共起率。R> findAssocs(tdm,"this",0.1)
line. first second third
1.00 0.33 0.33 0.33
2014年9月2日火曜日
R言語でのsapplyを使ったサンプルコード
プログラミング言語Rにあるsapplyを使ったサンプルコード。
sapplyはvector型の各要素に対して同じ処理を適用したいときに使用する関数。
例えば、vectorの全要素を2倍したりしたいときに使える。
例えば、渡された引数を2倍にして返す次の関数を考える。
sapplyはvector型の各要素に対して同じ処理を適用したいときに使用する関数。
例えば、vectorの全要素を2倍したりしたいときに使える。
例えば、渡された引数を2倍にして返す次の関数を考える。
%>times2 <- function(v){return (v*2)}試しにこれを実行するとちゃんと2倍した値が返される。
%> times2(20)これをsapplyと組み合わせると、vectorの値を2倍した値が得られる
%> [1] 40
%> l <- c(1,2,3,4,5)
%> sapply(l,times2)
%> [1] 2 4 6 8 10
登録:
投稿 (Atom)