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)