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# 構文で記述されています)。

このステートメントは、Numpy ブロードキャストを使用した Python の次のステートメントとまったく同じです。

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

それが行っているのは、一連のポイントにそれらの線形回帰係数を掛けて、それらを単一の予測ポイントに変換することです。

(または、.NET でこのようなことをしようとするのは、本当に頭がおかしいのでしょうか??)

4

2 に答える 2

1

実際、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
于 2015-12-06T07:27:08.137 に答える
0

あなたの質問をもう一度読むと、次の行に沿って何かを探しているようです。ここでは、次元ごとではなくポイントごとに 1 つの係数があります (および切片):

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 に答える