質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.31%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

7406閲覧

pythonでランダムに正定値行列をつくるアルゴリズム。

physics303

総合スコア89

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/11/13 02:30

編集2018/11/13 02:35

ランダムに2×2の正定値行列をつくりたいです。ここで、行列の各要素は-10から10の間とします。
どうしたらよいでしょうか。

なお、正定値行列とは固有値がすべて正の実正方行列です。実正方行列Aが正定値行列であることの必要十分条件として、「任意の非ゼロ縦ベクトルxに関して、(x^T)Ax >0が成り立つこと」が知られています。x^Tはxの転値です。

ランダムに行列を作ってみて、固有値を計算して、正定値行列だったら採用、そうじゃなかったら、棄却、というアイディアで実装しようかなと思っていますが、これでは計算コストがかさむので他にいい方法はないでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ランダムに作成してそれが正定値行列が見つかるまで繰り返すというのは、効率が悪すぎます。

例えば、AA^T のように正定値であることが既知の行列を作成するのはどうでしょうか。

python

1import numpy as np 2 3a = np.random.uniform(-10, 11, (2, 2)) 4print(a) 5 6spd = a.dot(a.T) 7print(spd)

AA^T が正定値であることの証明

イメージ説明
||_2 は行列の2ノルム

ちなみに (AA^T)^T = AA^T なので、正定値対称行列でもあります。

追記

AA^T の値の範囲を (-10, 10) に限定したい場合は作成したあとに (-10, 10) で minmax スケーリングしてください。

投稿2018/11/13 03:24

編集2018/11/13 03:27
tiitoi

総合スコア21960

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

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

0

行列の各要素は「 -10 から 10 の間」の「整数」ですか?であれば、総当たりで計算しても計算量はそう膨大にならないのではないかと直感的には思いますが、いかがでしょう(私が何か重大なことを見落としているかもしれません)。

得た正定値行列のセットを何かにお使いになりたいのであれば、まず「正定値行列を総当たりで計算してそれを csv 等でファイルに保存する」ためのスクリプトを書いて、利用側ではその csv を読み込んで利用する、という風にするとよいのではないかと思います。

投稿2018/11/13 02:45

gh640

総合スコア1407

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

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

physics303

2018/11/13 02:47

なるほど。2×2くらいだったら可能ですね 理想を言えば、整数ではなく実数にしたいところです。 (最終的には3×3に拡張予定です)
gh640

2018/11/13 03:00

そうですか。実数にしたい、行列のサイズも大きくしていきたい、とのであれば、上のやり方では限界がある感じがしますね。 すみません、コメントしておきながらアレなのですが、私は正定値行列関連の定理をまったく覚えていないので、他によい方法がぱっと思い浮かびません :( 他の方からの回答を待ってみてください。 すでにチェックされたかもしれませんが、ぐぐると `sklearn` に `sklearn.datasets.make_spd_matrix()` という関数があるのが見つかりました。もしかしたらこのあたりがお役に立つかもしれないと思うのですがいかがでしょう。 - https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_spd_matrix.html
physics303

2018/11/13 03:34

参考にしてみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問