ラッ疎回帰の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

TRIE木全体を1つの論理式で表す

あらすじ

reTRIEval treeの名の通り、恐るべき検索効率を誇るTRIE木。これをPrologで実装しようとした所、最終的には「単語集合を1つの節に変換するRubyスクリプト」ができあがったので、記録として書いておきます。なお、この記事はTRIE木もRubyPrologも知っているという人を対象に書かれています。

続きを読む

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>
続きを読む

顔文字をMeCabで形態素解析する

顔文字を形態素解析

テキストコミュニケーションにおける「身振り手振り言語」とも言われる顔文字は、目・鼻・口などの顔のパーツから構成されています。ところで顔文字をパーツごとに分割し、パーツの種類(品詞)を推定するというタスクは、形態素解析と同じ問題に帰着します。そこで今回私は、形態素解析器として使われているMeCabを用いて、顔文字を形態素解析してみました。

続きを読む