🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

2523閲覧

Rustのndarray_linalgで逆行列を求められない

BoKuToTuZenU

総合スコア51

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2020/12/21 15:36

編集2020/12/21 15:37

線形回帰をRustを用いて実装したいと考えております。最尤推定の計算の中で逆行列を計算する必要があります。そこで、rust-ndarrayを用いて実装をしていました。

ドキュメントを読んでみても、詳しい書き方がわからずとりあえず以下のように実行してみました。

rust

1use ndarray::prelude::*; 2use ndarray::Array; 3use ndarray_rand::RandomExt; 4use ndarray_rand::rand_disrt::Uniform; 5use ndarray_linalg; 6 7fn main() { // サンプルコード 8 let Phi = Array::<f64>::random((3, 2, 4), Uniform::new(0.,10)); 9 let Phi_inv = Array.Inverse(); 10}

上記のコードでは以下のエラーを得ました。

Compiling tensor v0.1.0 (/Users/kondouakira/Code/tensor) warning: unused import: `ndarray_linalg::*` --> src/main.rs:5:5 | 5 | use ndarray_linalg::*; | ^^^^^^^^^^^^^^^^^ | = note: `#[warn(unused_imports)]` on by default error[E0599]: no method named `Inverse` found for struct `ArrayBase<OwnedRepr<f64>, Dim<[usize; 3]>>` in the current scope --> src/main.rs:13:23 | 13 | let out_inv = out.Inverse(); | ^^^^^^^ method not found in `ArrayBase<OwnedRepr<f64>, Dim<[usize; 3]>>` error: aborting due to previous error; 1 warning emitted For more information about this error, try `rustc --explain E0599`. error: could not compile `tensor` To learn more, run the command again with --verbose.

公式のドキュメントには、ArrayBaseのトレイトとして実装されていると書いてあったので、このように書いたのですが、エラーメッセージにはArrayBaseにはInverseのメソッドは定義されていないと記載されていました。

どのように書けば逆行列を計算できますか?
ご回答の程よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ndarray_linalg::InverseInto trait を使うと inv_into() が生えます

use ndarray::Array2; use ndarray_linalg::{random, InverseInto}; fn main() { let a: Array2<f64> = random((3, 3)); println!("a = \n{}", a); let inv_a = a.inv_into().unwrap(); println!("a^-1 = \n{}", inv_a); }

他のはドキュメントで確認してください ndarray_linalg::solve

[dependencies] ndarray = "0.13" ndarray-linalg = { version = "0.12.1", features = ["intel-mkl"] }

投稿2020/12/21 16:03

termoshtt

総合スコア136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BoKuToTuZenU

2020/12/21 16:55 編集

ご回答いただきありがとうございます。いただいたコードをとCargo.tomlで実行したところ、 ``` Compiling tensor v0.1.0 (/Users/~~/Code/tensor) error[E0308]: mismatched types --> src/main.rs:5:26 | 5 | let a: Array2<f64> = random((3, 3)); | ----------- ^^^^^^^^^^^^^^ expected struct `ArrayBase`, found struct `ndarray::ArrayBase` | | | expected due to this | = note: expected struct `ArrayBase<OwnedRepr<f64>, Dim<[usize; 2]>>` found struct `ndarray::ArrayBase<_, ndarray::dimension::dim::Dim<[usize; 2]>>` = note: perhaps two different versions of crate `ndarray` are being used? error[E0599]: no method named `inv_into` found for struct `ArrayBase<OwnedRepr<f64>, Dim<[usize; 2]>>` in the current scope --> src/main.rs:7:19 | 7 | let inv_a = a.inv_into().unwrap(); | ^^^^^^^^ method not found in `ArrayBase<OwnedRepr<f64>, Dim<[usize; 2]>>` warning: unused import: `InverseInto` --> src/main.rs:2:30 | 2 | use ndarray_linalg::{random, InverseInto}; | ^^^^^^^^^^^ | = note: `#[warn(unused_imports)]` on by default error: aborting due to 2 previous errors; 1 warning emitted Some errors have detailed explanations: E0308, E0599. For more information about an error, try `rustc --explain E0308`. error: could not compile `tensor` To learn more, run the command again with --verbose.``` とエラーが出ました。また、ndarray-linalgの公式のExampleも実行してみましたが、同様にトレイトが実装されていない。というエラーが出ました。buildの方法に問題があるのでしょうか?
termoshtt

2020/12/21 16:57

> = note: perhaps two different versions of crate `ndarray` are being used? おそらくこれのとおりで、二つの ndarray のバージョンが混じっているはずです。今最新は ndarray 0.14 ですが、これに linalg の方は対応してい無いので 0.13 が必要です。 `cargo update` をすると直るかもしれません。
BoKuToTuZenU

2020/12/21 17:01

ndarray_linalgのバージョンのみ確認しており、ndarrayのバージョンを確認しておりませんでした。 バージョンを変更したところ、動作いたしました。ありがとうございます。
BoKuToTuZenU

2021/01/01 04:00 編集

Array2<T>(任意のFloat)に対してinv_into()を実装する際はTのトレイト境界はどのようなもので行えばいいのでしょうか? ndarray::NdFloatやnum_traits::Floatやndarray::Data<Elem=NdFloat>,<F: Scalar + Lapack, T: Data<Elem=F> + RawDataClone>などを試してみました
BoKuToTuZenU

2021/01/01 04:24

Scalar + Lapackで解決しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問