2015-12-06 42 views
0

使用Math.Net數字組成號碼跟蹤,我願做一個任務:折在數學淨NUMERICS列,列

折過每一列,並通過指數來乘以該列的值我向量。問題是,沒有一個摺疊函數產生一個計數器......並且在摺疊函數內計數是有問題的...並且對於這種類型的循環來說是死亡......

無論如何,理想情況下我會做點什麼如:

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

(這是用F#語法編寫的)。

聲明是完全等同於使用NumPy的廣播在Python這樣的說法:

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

它是做什麼用的線性迴歸係數相乘的一組點,並把它們變成一個單一的預測點。

(還是我真的只是瘋狂地試圖做.NET?這東西)

+0

真正的數學家使用Matlab進行處理。您可以將matlab腳本轉換爲dll(實用程序附帶matlab),然後從C#應用程序中調用dll。我們一直這樣做。 – jdweng

+0

不確定你的意思是「counter」,但也許'mapi'會爲你工作? –

+0

@jdweng'真正的數學家'必須真正討厭類型安全性,可靠性以及與其他.NET軟件平臺的緊密集成。 Math.NET是一個非常好設計的庫,它支持F#和C#中的慣用用法,並且有很多合法的理由可以在MATLAB dll上使用它。你應該使用正確的工具來完成正確的工作。 – TheInnerLight

回答

0

確實是有一個索引倍逐列函數的F#擴展(MathNet.Numerics.FSharp包) 。我不明白爲什麼你會貴了一倍拉姆達內分配一些可變的變量,但假設你要尋找的是沿着這一線的東西:

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 
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]