SVMのおまけ(多項式カーネル)

昨日書いたSVMカーネルは線形カーネル(というかただの内積)だったので、多項式カーネルにパワーアップ!させてみた。

参考: perlでSGD版SVMを書いてみた - EchizenBlog-Zwei


といってもreturnをちょっといじっただけ。SVMは訓練データの影響がカーネル内で閉じているので、カーネルを色々置き換えるだけで様々な学習ができる。昨日の色分類の例ではRGB値の3次元で線形分離できてしまったので線形カーネルで十分だったのだが、折角なので多項式カーネルも用意してみた次第。さしあたり面白い適用例が見つからなかったのでカーネルのコードだけ置いておく。

sub kernel {
  my $x1 = shift;
  my $x2 = shift;
  my $p  = shift;
  my $c  = shift;

  my $k = 0;
  for (my $i = 0; $i < $d; $i++) {
    $k += ($x1->[$i] * $x2->[$i]);
  }
  return (($k + $c) ** $p);
}