ラッ疎回帰のCVがガチャなので禁を犯してcv.foldsを書き換える記事
最近ビッグデータ占い師の研究をしており、関数型言語Rと格闘しています。
LASSO回帰という便利な回帰があります。
Ridge回帰との主な違いとして、Ridgeは名詞、LASSOは略語*1です。
高次元空間ではL1-normが1となる点の集合が成す多面体の角っこがトゲトゲするので、二乗和誤差の等高線が軸上でぶつかりやすくなるため、パラメータの多くが0になります。
glmnetとlarsという2種類のパッケージがあるが、前者はなんかR3.0.3では使えなかった。
後者は正則化項の係数を交差検定で決定できるcv.larsなる関数がある。これで自動的に決定したい。
N <- 10 # N-fold cross validation cv.result <- cv.lars( ....., N )
で色々計算し、
lambda <- cv.result$index[which.min(cv.result$cv)]
で最適な生息加工の係数lambdaを得る。
cv.larsは、入力された事例を乱数に基づいてN個のグループに分割し、N分割交差確認でパラメータを決定する。
入力事例が少ないと、ランダムゆえ推定値が安定しない。交差検定ガチャ。なんとかしたい。
普通に考えて事例数Dのデータに対して、D分割をすれば、分割にランダム要素がなくなるため、結果も安定する。
でも以下のようにしてcv.larsが内部で呼ぶcv.foldsを書き換えても良さそう。
tmp <- function(n, folds) { comb <- combn(1:n, 1) rv <- list() for (i in 1:ncol(comb)) { rv[[sprintf("%d", i)]] <- as.numeric(comb[,i]) } return(rv) } unlockBinding("cv.folds", environment(fun=lars)) assignInNamespace("cv.folds", tmp, ns="lars", envir=environment(fun=lars)) assign("cv.folds", tmp, envir=environment(lars)) lockBinding("cv.folds", environment(lars)) cv.folds <- tmp # 今のnamespaceにも残滓が残るので。
ちなみに後半部では、名前空間を†解錠†してcv.foldsを†リライト†しています。
combnの第二引数を1から整数Kへ書き換えると、データ集合からKこの元を取り出す全ての組み合わせをfold-out集合とするようになる。
もはや分割ではない(これも交差確認と呼べるのか?)。第二引数を1から2へ変えて試しても、結果が一致しない。何がどう違うんだろう。
アイスコーヒーおいしい〜
*1:LASSO: least absolute shrinkage and selection operator
install: missing destination file operand after `mypackage'
$ R CMD install mypackage install: missing destination file operand after `mypackage'
と言われる問題。install -> INSTALL と置換すれば良いらしい。
uninstallする際も、
R CMD remove mypackage
ではなく、
R CMD REMOVE mypackage
とする。
Prologで4ナイト入れ替え問題を実装
4 Knights Problem?
4 Knights Problemという問題があります。「ナイト 入れ替え チェス」などとググれば、簡単にヒットしますが、簡単に説明すると、3x3のマスの四隅に白・黒のチェスのナイトが2つずつ置かれていて、それを動かして、白と黒の位置を交換するという問題です。本来のナイトの動きと異なる移動をしたり、盤面ごと回転させるというのはダメ。
今回私は必要に迫られて、このパズルを実装せざるを得なくなりました(ソルバではなく、パズルを人間が遊ぶための対話環境!)。
以下のような初期状態からはじまり、
♘ | ♘ | |
♞ | ♞ |
以下のような終了状態に移動させるのが目標。
♞ | ♞ | |
♘ | ♘ |
Java Appletで実装されたゲームがたくさんあるので、それでチャレンジしてみると面白いです。
パンくずリストを生成するJavaScript
はじめに
とても常識的なプログラムを書きました。パンくずリストを生成するJavaScriptです。
ファイルごとの名前をハッシュ形式で指定し、実行時に読み込んで生成しています。
例えば、下記の定義において、www.haroperi.info/emoticonは、はろぺり研>顔文字というリストが表示され、www.haroperi.info/emoticon/mecab.htmlを開くと、はろぺり研>顔文字>顔文字形態素解析と表示されます。
table = { "www.haroperi.info" : { "name": "はろぺり研", "profile.html" : { "name": "自己紹介" }, "products.html": { "name": "作品紹介" }, "emoticon" : { "name": "顔文字", "mecab.html": { "name": "顔文字形態素解析" }, "extraction.html": { "name": "顔文字抽出" }, }, }, }
このようなjavascriptの定義をサクッと書いて、すべてのページから以下のように読み込むだけで、簡単にパンくずリストが作成できます。
<div id="pankuz"></div> <script type="text/javascript" src="pankuz.js"></script>