0

使用 Math.Net 数字,我想做一个任务:

折叠每一列,然后将该列的值乘以我的向量的索引。问题是,没有一个折叠函数产生一个计数器......并且在折叠函数中计数是有问题的......对于这种事情来说,for循环是死亡......

无论如何,理想情况下我会做类似的事情:

points.FoldByColumn(fun i acc x -> acc <- acc + x * coefficients_array.[i])
|> Array.map(fun x -> x + coefficients_array.[coefficients_array.length-1])

(这是用 F# 语法编写的)。

该语句与 Python 中使用 Numpy 广播的语句完全相同:

return (self.model_coefs[:-1] * points).sum(axis = 1) + self.model_coefs[-1]

它所做的是将一组点乘以它们的线性回归系数,并将它们变成一个预测点。

(或者我真的只是疯狂地尝试在 .NET 上做这些事情??)

4

2 回答 2

1

F# 扩展(MathNet.Numerics.FSharp 包)中确实有一个按列索引的功能。我不明白你为什么要在你的 fold lambda 中分配一些可变变量,但假设你正在寻找的东西是这样的:

let points = DenseMatrix.randomStandard<float> 10 3 // 10 points (3 dimensions)
let coefficients_array = [| 1.1; 2.1; -2.0; 4.1 |] // 4 coefficients (intercept at tail)

let m = points.RowCount // point count
let n = points.ColumnCount // number of coefficients minus intercept (=coefficients_array.Length-1)

let a =
    points
    |> Matrix.foldiCols (fun i acc v -> acc + v*coefficients_array.[i]) (DenseVector.zero m)
    |> Vector.map (fun x -> x + coefficients_array.[n])

然而,这实际上只是一个矩阵向量乘法。那么为什么不直接写如下呢?

// Split coefficients_array into coefficients and intercept
let coefficients = DenseVector.init n (fun i -> coefficients_array.[i])
let intercept = coefficients_array.[n]

let b = points * coefficients + intercept
于 2015-12-06T07:27:08.137 回答
0

在第二次阅读您的问题时,您似乎正在寻找更多类似于以下内容的内容,其中每个点有一个系数,而不是每个维度(加上截距):

let n = 3 // 3 columns
let m = 10 // 10 points
let points = DenseMatrix.randomStandard<float> m n

// one coefficient for each point, plus one intercept (11 total)
let coefficients = DenseVector.randomStandard<float> (m+1)

let c = coefficients.[0..m-1] * points + coefficients.[m]
于 2015-12-06T07:54:45.240 回答