Recursos polinomiais de geração automática para aprendizado de máquina

Gerar recursos polinomiais para aprendizado de máquina pode parecer complicado à primeira vista, mas realmente não é:

def af[T](features: List[T], power: Int, combine: (T, T) => T) = {
def af0(acc: List[T], p: Int) : List[T] =
if( p == 0 ) acc else af0( acc ++ (for {
s1
<- acc
s2
<- features
} yield combine(s1,s2)), p-1)
af0
(features, power-1)
}

Uso:

println(af[Int](List(2, 3), 2, (a: Int, b: Int) => a * b))
List(2, 3, 4, 6, 6, 9)

println
(af[String](List("a", "b"), 2, (a: String, b: String) => (a + b)))
List(a, b, aa, ab, ba, bb)

println
(af[String](List("a", "b"), 3, (a: String, b: String) => (a + b)))
List(a, b, aa, ab, ba, bb, aa, ab, ba, bb, aaa, aab, aba, abb, baa, bab, bba, bbb)