ご多分に漏れず機械学習を学習しようとしたが基本的なところからやらないと全く理解できない

とりあえずパーセプトロンとかそのへんから。

とっかかり的にはだれかのエントリ読んで、単語がだいたい頭に入ったところで、ちょっと古い教科書的な本を読むのが良いぽい。

とはいっても、数式を展開したりするところは理解が追い付かないんですが。。まあ3年くらいかければなんとかなるかなと

機械学習いじり

いろいろ本を買ってみたけど、やっぱQiitaとかの記事の方がとりあえず動かすまでのところでは参考になるという

 

Pythonでなんとかいうライブラリ使って、自然言語クラスタリング程度はとりあえず動かすのはできるけど、仕様を説明せよと言われたら即答は出来ないなあと

Java8+Lombok、tinyorm、avansあたりをいじろう

Javaで1から10まで書いた話(sanitized)


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
ってとこがポイントかなと。

 

ところでバイナリ法はモンゴメリ乗算の一つ、っていう理解で良いのだろうか。判らんことが多い。。