Напишите функцию PolynomialFeatures из scikit-learn для F#

Недавно я начал изучать F#, я узнал о fslab для науки о данных, однако я не могу найти какую-либо функцию, аналогичную PolynomialFeatures из Scikit-Learn (http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.PolynomialFeatures.html)

Простой пример для этой функции:

f [x;y] 2 -> [1;x;y;x**2;x*y;y**2]

Интересно, написал ли кто-нибудь общую функцию вроде PolynomialFeatures для F#, спасибо.


person Jose Vu    schedule 23.04.2018    source источник


Ответы (1)


Я предполагаю, что сейчас мало кто использует F#, я нашел ответ, просмотрев исходный код PolynomialFeatures в scikit-learn (https://github.com/scikit-learn/scikit-learn/blob/master)./sklearn/preprocessing/data.py).

Однако в F# нет «combinations_w_r» (или любого эквивалента), как в Python, затем я посмотрел на Rosettacode (http://rosettacode.org/wiki/Combinations_with_repetitions) и, к счастью, их код OCAML точно такой же, как F#, я объединил их все в следующий код

let PolyFeature ndgree (x:float list) = 
  let rec combsWithRep xxs k =
    match k, xxs with
    | 0,  _ -> [[]]
    | _, [] -> []
    | k, x::xs ->
        List.map (fun ys -> x::ys) (combsWithRep xxs (k-1))
        @ combsWithRep xs k
  let rec genCombtill n xlen =
      match n with
      | 0 -> List.empty
      | n -> (genCombtill (n-1) xlen) @ combsWithRep [0..(xlen-1)] n
  let rec mulList list1 =
     match list1 with
     | head :: tail -> head * (mulList tail)
     | [] -> 1.0
  let mul2List (b:float list) (a:int list) = [for i in a -> b.[i]] |>   mulList    
  1.0 :: ((genCombtill ndgree x.Length) |> List.map (mul2List x))

Тест

> PolyFeature 2 [2.0;3.0];;
val it : float list = [1.0; 2.0; 3.0; 4.0; 6.0; 9.0]

Код работает, как и ожидалось, однако я считаю, что мой код не оптимизирован и, вероятно, будет медленным с большим списком и высоким порядком полинома.

person Jose Vu    schedule 24.04.2018