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