PA-IIをGoで書いた
論文はこちら。
Online Passive-Aggressive Algorithms
ソースコードはこちら。 下の関数でおこなわれている重みの更新以外はほとんどパーセプトロンと一緒です。
func (p *PassiveAggressive) Update(X map[string]float64, y string, sign float64) Weight {
loss := math.Max(0, 1-sign*Dot(X, p.weight[y]))
// tau := loss / Norm(X) // PA
tau := loss / (Norm(X) + 1 / (2 * p.C)) // PA-II
if _, ok := p.weight[y]; ok == false {
p.weight[y] = map[string]float64{}
}
for f, _ := range X {
if _, ok := p.weight[y][f]; ok {
p.weight[y][f] += tau * sign
} else {
p.weight[y][f] = tau * sign
}
}
return p.weight
}