2011年05月28日

ニューラルネットワークで画像の拡大

なぜかたまに画像を拡大したくなります。

ニューラルネットワークでやってみましたが、普通にバイキュービックとかLanczos使ったほうが早くてきれいでしたね。

まぁ使い方が良くないんだと思いますが。

概要は下図のような感じです。

nn_scaleup_001.png

入力12素子、中間層100素子、出力12素子で学習に数時間かかりました。拡大するときも中間層が多いと時間がかかると思います。

実行結果

nn_scaleup_002.bmp

128x128の画像を512x512に拡大した結果です。右端と下端がおかしいのは仕様です。

web拍手 by FC2
posted by シンドラー at 17:46 | Comment(2) | TrackBack(0) | Neural Network | このブログの読者になる | 更新情報をチェックする

2011年05月12日

OBBの求め方 その2

先月ぐらいにOBBを求めて何も使っていなかったので、衝突判定のテストでもやってみようかと思います。

今回はOBBTreeを作ってみただけで、衝突判定はまた次回ということにしたいと思います。

参考サイトは前回と同じ所です。

実行結果



分割レベルを上げると計算時間が増えてしまいますね。
まぁここまで分割する必要はないのかもしれませんが。
web拍手 by FC2
posted by シンドラー at 19:20 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2011年05月07日

修正トンプソン−τ法について

学習に使うデータを正規分布と仮定した場合、異常値が混じっているとそれが影響して精度が下がることがあります。
この異常値を取り除くための手法として修正トンプソン−τ法というものがあるようです。

参考サイト:
http://applied.bpe.agr.hokudai.ac.jp/education/measurement/02.pdf

参考サイトでは1次元データでしたので、ノルムや内積に置き換えて一応n次元にしてみましたが、合っているのかどうかは分かりません。

実行結果

2次元の場合ですが、適当にマウスで点を打って異常値を除去してみました。


web拍手 by FC2
posted by シンドラー at 00:35 | Comment(0) | TrackBack(0) | Pattern Recognition | このブログの読者になる | 更新情報をチェックする

2011年05月04日

ベイズの定理を使った識別のテスト

ベイズの定理を使って格闘ゲームのプレイヤーの次の攻撃を予測するというお話が「ゲーム開発者のためのAI入門」に載っていました。

ベイズの定理の説明は、「フリーソフトでつくる音声認識システム」がわかりやすかったです。
以下一部本の引用があるので問題があればお知らせください。

条件付確率
P(A|B):Bという条件下でAが起こる確率

ベイズの定理

P(ωi|x)=P(x|ωi)P(ωi)/P(x)

xという未知パターンがあった場合、そのパターンがωiというカテゴリに属している確率は、
ωiというカテゴリの中でxが起こる確率と、ωi自体が起こる確率を掛けたものを、
xが起こる確率で割ると求まります。というお話です。

xがどこに所属するかということは、N個(i=1,2,...,N)のカテゴリのP(ωi|x)を計算して、一番起こる確率が高いカテゴリに分類するということになります。

数式で表すと、P(ωi|x)が最大になるiを求めるということで、
arg max {P(ωi|x)} = arg max {P(x|ωi)P(ωi)/P(x)}
となります。

つまり、arg max {P(x|ωi)P(ωi)/P(x)}が計算できれば、ベイズの定理を使って識別ができることになります。

1. 厄介者のP(x)を消そう

xが起こる確率は無限にある未知パターンのひとつが起こる確率ということでわかるわけがありません。

幸い、arg max {P(x|ωi)P(ωi)/P(x)}でP(x)はiに依存していませんので、消すことができます。

arg max {P(x|ωi)P(ωi)/P(x)} = arg max P(x|ωi)P(ωi)

2. 事前確率の計算

事前確率(カテゴリωiが起こる確率)は、教師データの数から推定することにします。
各カテゴリの教師データがTni個、教師データ全体がTN個あった場合、各カテゴリが発生する確率は以下の式で計算できます。

P(ωi)=Tni/TN

3. 最後の難敵「尤度」

P(x|ωi)は、確率密度関数というもので、教師データから推定します。ここで、確率密度関数は正規分布と仮定して、教師データから正規分布を生成するための計算をしておきます。

正規分布の式は下記サイトを参照してください。
http://www.orsj.or.jp/~wiki/wiki/index.php/%E5%A4%9A%E6%AC%A1%E5%85%83%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83

ここから、教師データから共分散行列を作って、行列式と逆行列、平均ベクトルが分かれば正規分布の式で計算できることが分かります。

で、共分散行列を作成し、LU分解で行列式と逆行列と平均ベクトルを計算しておきます。

後は未知パターンxを分類するとき、正規分布の式に当てはめて計算すれば、P(ωi|x)が計算できます。

4. 識別

P(ωi|x)P(ωi)は小さい値になってしまいますので、logをとって計算した方が良いようです。

arg max {log(P(ωi|x))+log(P(ωi))}

そういうわけでマウスで適当に打った座標を教師データとして、残りの座標がどのカテゴリに所属するかを識別するサンプルを作ってみました。

実行結果




web拍手 by FC2
posted by シンドラー at 19:00 | Comment(0) | TrackBack(0) | Pattern Recognition | このブログの読者になる | 更新情報をチェックする

2011年05月02日

LU分解で行列式と逆行列の計算

N×N行列の行列式と逆行列を計算したかったので、LU分解で行うことにしました。

参考サイト:
[1] LU分解 - 物理のがきしっぽ
[2] 連立一次方程式の解法 - SHIMIZUS
[3] LU分解 - Wikipedia

LU分解は、A=LUにする分解で、Lが下三角行列、Uが上三角行列です。
行列式は|A|=|L||U|で良くて、しかも|L|と|U|は対角成分の積で良いため、LU分解した後その対角成分を掛ければ計算できます。
(参考サイト[2]では行の交換回数が偶数なら正、奇数なら負となる係数を掛けていました)

AA'=EとなるA'(逆行列)を求めたいわけですが、LU分解は連立一次方程式Ax=bを解く方法のようなので、bをどうすれば良いのかよくわかりませんでした。(A:NxN行列、x:N次元ベクトル、b:N次元ベクトル)

参考サイト[2]のソースコードを見た所、下記のような仕組みだということが分かりました。
(Ax=bをN回計算してAA'=Eを作る)

lu_001.png

注意点として、対角成分が大きくなるように列の入れ替えを行いますので、入れ替えが行われた場合はbについても入れ替える必要があるということです。


web拍手 by FC2
posted by シンドラー at 20:42 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。