在Math Net数字中按列折叠,跟踪列数

时间:2015-12-06 03:21:12

标签: c# .net f# mathnet

使用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上做这些事情吗?)

2 个答案:

答案 0 :(得分:0)

F#扩展中确实存在索引的逐列功能(MathNet.Numerics.FSharp包)。我不明白为什么你要在你的折叠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

答案 1 :(得分: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]