2008-08-02(土)
■[java][機械学習]ガウシアンカーネルのパラメータを自動的に求めてみる

サポートベクターマシンでよく使うガウシアンカーネルでは、パラメータが重要になるということを書きました。
で、ちょうどいいところに、id:audioswitch:20080730で、そのガウシアンカーネルのパラメータを自動的に求める方法が書かれていたので、試してみました。
σ^2=100程度の数値が出てきます。(リンク先でのパラメータはσとかいてますが、ぼくのところでは同じ値をσ^2としてます。)
今回のデータでは、だいたいいい感じだけど、もう少し大きい数値のほうがいいかな〜という感じですね。それにしても、とりあえずの値を求めるにはよさそうです。
関係ある部分のソースだけを書いておきます。
private void btnLearnActionPerformed(java.awt.event.ActionEvent evt) { if(patterns.size() == 0) return; solveGaussianParam(); learn(); learned = true; paint(); canvas.repaint(); } void solveGaussianParam(){ double s = 0; int count = 0; for(Map.Entry<Integer, Point> p1 : patterns){ double m = Double.MAX_VALUE; for(Map.Entry<Integer, Point> p2 : patterns){ double d = (p1.getValue().x - p2.getValue().x) * (p1.getValue().x - p2.getValue().x) + (p1.getValue().y - p2.getValue().y) * (p1.getValue().y - p2.getValue().y); if(d == 0) continue; if(d < m) m = d; } if(m == Double.MAX_VALUE) continue; s += m; ++count; } sig = Math.sqrt(s / count); System.out.println(sig); } double sig = 35; double kernel(Point x1, Point x2){ //ガウシアンカーネル double n = (x1.x - x2.x) * (x1.x - x2.x) + (x1.y - x2.y) * (x1.y - x2.y); return Math.exp(-n / (sig * sig));//5 1.2 .5は分散の2乗 }
コメントを書く
トラックバック - http://d.hatena.ne.jp/nowokay/20080802/1217703265
リンク元
- 17 http://reader.livedoor.com/reader/
- 4 http://twitter.com/kis
- 3 http://fastladder.com/reader/
- 3 http://search.yahoo.co.jp/search?p=三毛猫+遺伝 エピジェネティックス&ei=UTF-8&fr=top_ga1&x=wrt
- 3 http://www.forest.impress.co.jp/article/2007/08/24/laftan.html
- 2 http://d.hatena.ne.jp/audioswitch/
- 2 http://ezsch.ezweb.ne.jp/search/?sr=0101&query=オイラーグラフ
- 2 http://search.yahoo.co.jp/search?p=エピジェネティックス 三毛猫&ei=UTF-8&fr=top_ga1&x=wrt
- 2 http://search.yahoo.co.jp/search?p=三毛猫 エピジェネティックス&search.x=1&fr=top_ga1&tid=top_ga1&ei=UTF-8
- 2 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GGIH_jaJP270&q=サポートベクターマシン 収束


