Python Pandasメモ
Rを先に覚えたので、Rだと簡単に書けるようになったもののそれと同じ事をPython(numpy+pandas)でやりたいときに良いやり方が思いつかない AND ググっても時間がかかる AND 多分すぐ忘れる。
ので特にはまったのをメモしておく。
DataFrame ある条件を満たす行の、あるカラムの値を書き換えたい
Rだと
> df <- data.frame(x=1:5, t=sample(0:1, size=5, replace=T)) > df x t 1 1 0 2 2 0 3 3 0 4 4 1 5 5 0 # t==0 の行だけ t=-1 にしたい > df[df['t']==0, ]$t = -1 > df x t 1 1 -1 2 2 -1 3 3 -1 4 4 1 5 5 -1
PandasのDataFrameでは
df['t'] = df.apply(lambda row: (1 if row['t']==1 else -1), axis=1)
とりあえずやりたいことはできた
「基礎線形代数と固有値問題」読んだ
- 作者: 柴田正和
- 出版社/メーカー: 森北出版
- 発売日: 2013/12/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
- 対角化重要
- 機械学習に関連しそうなもの (ここで詰まったら復習する)
- 固有値問題に必要最小限の定理のみに絞って書いてある印象
- より厳密な数学書を読むときに、実用に直結する定理と基礎・土台としての定理の区別がしやすくなる(といいな)
線型代数は次線型代数入門 (基礎数学1)を読みたい。
StackOverflowの質問数で見るプログラミング言語
GoogleのDeep Learning論文読んだ
Representation Learning: A Review and New Perspectives を読んだ。
どこまで理解出来てるかいまいちだがメモとしてAbstractの要約をまとめとく。読んだことメモってことで。
- 高レベルの特徴抽出器(教師なし)を構築した (high-level, class-specific feature detectors)
- # 人間や猫の顔を識別するニューラルネットワークが教師なし学習でできたと
- 9-layered locally connected sparse autoencoder
- # この辺の技術用語は日本語がよくわからない。とにかく9層のニューラルネットワーク。
- 使用したデータセットは、1,000,000の画像(200x200px)
- 使用したコンピューターは1,000台(コア数で言うと16,000コア)
- 学習期間3日
- (直感には難しそうな)ラベル無し(=教師無し)画像のみから顔認識器(face detector)が構築できる事を示すことができた。
- 他には猫の顔や人影も識別できる。
- (deep learningによって学習した)特徴を用いた識別により、過去の研究を上回る制度を達成できた。
本文も一応読んだけどAbstract以上に理解が深まった感じはしない。
アルゴリズムの解説とかではなく、大規模計算リソース+大規模データぶん回したら教師なしでここまでできたよーっていう紹介なんだと思う。
Deep Learning 資料まとめのまとめ
Yet Another まとめのまとめ。資料ありすぎて混乱してきたので自分用メモということで。
まとめ系
- ニューラルネットの逆襲 | Preferred Research
- Deep Learningを勉強する際に参考にしたサイト・書籍まとめ - fz-qqq's diary
- Googleの猫認識 (Deep Learning) - 大人になってからの再学習
- Deep Learningの技術と未来
使ってみる系
- 実装ディープラーニング
- iAnalysisの人
- pylearn2 入門したい編 - laughingのブログ
Googleの猫なやつ
読みたい論文
正規分布 vs t分布 - 外れ値に影響されやすい度グラフ化してみた
PRML 図2.16を再現してみた。
まずはグラフから
上は外れ値なし、下はあり。赤が正規分布で青はt分布。
外れ値なしでは2つのグラフはほぼ重なる。このグラフは乱数を何度か取り直してあえて重なりが少なくなるものを選んだが、たいていはほぼ完全に一致する。
Rコード
data <- rnorm(50, -1, 1.2) noise <- rnorm(5, 10, 1) # 外れ値なしの場合は第一引数を0にする data <- c(data, noise) # norm log.likelihood.norm <- function(x) { return(function(par) { mu <- par[1] sigma2 <- par[2] - length(x) / 2 * log(sigma2) - 1 / 2 * sum((x - mu)^2) / sigma2 }) } my.dt <- function(x, mu, lambda, v) { gamma(v/2 + 1/2) / gamma(v/2) * (lambda/pi/v)^(1/2) * (1 + lambda*(x - mu)^2 / v)^(-v/2 -1/2) } my.dt.log <- function(x, mu, lambda, v) { log(gamma(v/2 + 1/2)) - log(gamma(v/2)) + (1/2)*log(lambda/pi/v) + (-(v/2) - (1/2)) * log(1 + lambda*(x - mu)^2 / v) } # t likelihood.t <- function(x) { return(function(par) { mu <- par[1] lam <- par[2] v <- par[3] sum(my.dt.log(x, mu, lam, v)) }) } # 解析的に求められる式で計算 mu <- mean(data) sigma2 <- sum((data - mu)^2) / length(data) # 数値的に求めた結果 # norm opt <- optim(par=c(0,1), fn=log.likelihood.norm(data), control=list(fnscale=-1)) mu.guess <- opt$par[1] sigma2.guess <- opt$par[2] print(list( title="norm", mu=mu, sigma=sigma2, mu.guess=mu.guess, sigma2.guess=sigma2.guess )) # t opt <- optim(par=c(0,1,1), fn=likelihood.t(data), control=list(fnscale=-1)) mu.t.guess <- opt$par[1] lambda.guess <- opt$par[2] v.guess <- opt$par[3] print(list( title="t", mu=mu.t.guess, lambda=lambda.guess, v=v.guess )) # --- # visualization # --- x.max <- 15 x.min <- -5 y.max <- 0.5 # raw data hist(data, xlim=c(x.min, x.max), ylim=c(0, y.max), breaks=seq(x.min, x.max, 1), freq=F) par(new=T) # norm f <- function(x) dnorm(x, mean=mu.guess, sd=sqrt(sigma2.guess)) curve(f, xlab='', ylab='', xlim=c(x.min, x.max), ylim=c(0, y.max), col="red") par(new=T) # t f2 <- function(x) my.dt(x, mu.t.guess, lambda.guess, v.guess) curve(f2, xlab='', ylab='', xlim=c(x.min, x.max), ylim=c(0, y.max), col="blue")
数式
t分布
本に載ってる定義
はまったところ
この程度のグラフは簡単に描けると思ったがかなり苦戦した。t分布のパラメータ推定でいろいろ苦労したので書いておく。
- t分布というと、「正規分布のパラメータ推定の時に脇役的に登場するあのヒトね」という感じだが、t分布自体のデータへの当てはめというのは知らなかった。ググっても情報少なめ。
- 推定値の計算
- 解析的に求める式が本に載っていないし自力で計算できるかも謎。Rのoptim関数というものがあることを知ったのでそれを使ってみることに。
- 最終推定でlogとらないバージョンで結果を求めると推定値が求まらない。(初期値として与えたのとほぼ同じ値が返ってくる)
- 調べてみると絶対値の小さな値を多量に掛け算しているので結果が0になっている(アンダーフロー)
- t分布の関数logバージョンで再度optimに掛けてそれらしき値が得られる
おまけ
せっかくコード書いたのでいろいろ遊んでいたら発見したこと
データ数の1/4が「外れ値」でもt分布はぶれない!ここまで来るともはや鈍感としか