从 scikit-learn 为 F# 编写 PolynomialFeatures 函数
Write PolynomialFeatures function from scikit-learn for F#
我最近开始学习F#,我了解了数据科学的fslab,但是我似乎找不到任何类似于Scikit-Learn的PolynomialFeatures的函数(http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.PolynomialFeatures.html)
此函数的一个简单示例是
f [x;y] 2 -> [1;x;y;x**2;x*y;y**2]
我想知道是否有人为 F# 编写了类似 PolynomialFeatures 的通用函数,谢谢。
我想现在使用 F# 的人不多,我通过查看 scikit-learn 中的 PolynomialFeatures 源代码找到了答案 (https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/preprocessing/data.py)。
但是,F# 没有 Python 中的 "combinations_w_r"(或任何等效代码),然后我查看了 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]
代码按预期工作,但我相信我的代码没有优化,并且可能会因大列表和高阶多项式而变慢。
我最近开始学习F#,我了解了数据科学的fslab,但是我似乎找不到任何类似于Scikit-Learn的PolynomialFeatures的函数(http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.PolynomialFeatures.html)
此函数的一个简单示例是
f [x;y] 2 -> [1;x;y;x**2;x*y;y**2]
我想知道是否有人为 F# 编写了类似 PolynomialFeatures 的通用函数,谢谢。
我想现在使用 F# 的人不多,我通过查看 scikit-learn 中的 PolynomialFeatures 源代码找到了答案 (https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/preprocessing/data.py)。
但是,F# 没有 Python 中的 "combinations_w_r"(或任何等效代码),然后我查看了 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]
代码按预期工作,但我相信我的代码没有优化,并且可能会因大列表和高阶多项式而变慢。