ご多分に漏れず機械学習を学習しようとしたが基本的なところからやらないと全く理解できない
とりあえずパーセプトロンとかそのへんから。
とっかかり的にはだれかのエントリ読んで、単語がだいたい頭に入ったところで、ちょっと古い教科書的な本を読むのが良いぽい。
とはいっても、数式を展開したりするところは理解が追い付かないんですが。。まあ3年くらいかければなんとかなるかなと
Java8+Lombok、tinyorm、avansあたりをいじろう
↑
Javaからもう10年以上離れてた身には非常に参考になります。しかも最後にまじめにJava触ったのもWebObjectsっていう、、
個人的にはJava8+Lombok で、tinyorm、avansあたりをいじろうかと思ってます。
ご興味有る方、すでにいじってる方いましたら情報交換させていただけると嬉しいです。
リニアサーチ
とりあえず定本を写経
public class LinearSearch { static private class Entry { int key; Object data; private Entry(int key, Object data) { this.key = key; this.data = data; } } final static int MAX = 100; Entry[] table = new Entry[MAX]; int n = 0; public void add(int key, Object data) { if (n >= MAX){ throw new IllegalStateException("too many data"); } table[n++] = new Entry(key, data); } public Object search(int key) { int i = 0; while ( i < n) { if (table[i].key == key) return (table[i].data); i++; } return null; } } public class Sample01 { public static void main(String[] args) { // TODO Auto-generated method stub LinearSearch table = new LinearSearch(); table.add(1, "one"); table.add(10, "ten"); table.add(2, "two"); String x; x = (String)table.search(10); if (x != null){ System.out.println("Value = " + x); }else{ System.out.println("not found"); } } }
二分探索アルゴリズム(Binary Search)
再帰が無ければ普通に読めるなあ
public boolean contains(int v, int[] vs){ if (vs.length == 0) return false; int left = 0, right = vs.length; while( left + 1 < right){ int mid = left + ( right -left ) / 2; if (v < vs[mid]) right = mid; else left = mid; } return v == vs[left]; }
しかしO(N)とかO(logN)とかなんとなくしか理解していない。アルゴリズムから数学的に計算量を算出する、、ってことがこの先出来るようになる気がしない。
バイナリ法による冪剰余の計算
ここにコード書くのはどうやればいいんだ?と思ったらpreタグでいいらしい。
■冪剰余 - Wikipedia
http://ja.wikipedia.org/wiki/%E5%86%AA%E5%89%B0%E4%BD%99#.E9.80.94.E4.B8.AD.E3.81.A7.E5.89.B0.E4.BD.99.E3.82.92.E3.81.A8.E3.82.8B
Bignum modpow( Bignum b, Bignum e, Bignum m){ Bignum result = 1; while ( e > 0 ){ if (( e & 1 ) == 1 result = (result * b ) % m; e >>= 1; b = ( b * b ) % m; } return result; }
「アルゴリズムを学ぼう」に書いてあるk=2^tならn^k = n^t * n^tってのが何なのかようやく判ってきたのでメモっとく。
ちなみにそっちのコードはこんな↓で、これはこれで理解するのに一週間くらい掛かった。
long powmod( int a, int k, int m){
if ( k == 0 )
return 1;
long t = powmod( a, k / 2, m);
t = (t * t) % m;
if (k % 2 == 1)
t = (t * a) % m;
return (int) t;
}
どっちも要するに2で割って、
2で割り切れないなら ( t * a ) % m
2で割り切れるなら(t * t) % m
ってとこがポイントかなと。
ところでバイナリ法はモンゴメリ乗算の一つ、っていう理解で良いのだろうか。判らんことが多い。。