« 2021年3月 | トップページ | 2021年6月 »

2021年5月29日 (土)

[R]特異値分解を行う

svd関数を使う。特異値分解の等式は以下のとおり。

A = U D V^T

UとVは直交行列。DはAの特異値を対角成分にもつ対角行列。

> a <- matrix(1:9, 3, 3)
> a
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> r <- svd(a)
> r
$d
[1] 1.684810e+01 1.068370e+00 5.543107e-16
$u
[,1] [,2] [,3]
[1,] -0.4796712 0.77669099 0.4082483
[2,] -0.5723678 0.07568647 -0.8164966
[3,] -0.6650644 -0.62531805 0.4082483
$v
[,1] [,2] [,3]
[1,] -0.2148372 -0.8872307 0.4082483
[2,] -0.5205874 -0.2496440 -0.8164966
[3,] -0.8263375 0.3879428 0.4082483

svd関数の戻り値はリストで、要素dに特異値が代入されている。

> r$d
[1] 1.684810e+01 1.068370e+00 5.543107e-16

上記の恒等式における、行列U(戻り値では要素u)と行列V(戻り値では要素v)が直交行列であることを確認する。

> t(r$u) %*% r$u
[,1] [,2] [,3]
[1,] 1.000000e+00 1.110223e-16 5.551115e-17
[2,] 1.110223e-16 1.000000e+00 -1.110223e-16
[3,] 5.551115e-17 -1.110223e-16 1.000000e+00
> t(r$v) %*% r$v
[,1] [,2] [,3]
[1,] 1.000000e+00 0.000000e+00 -1.110223e-16
[2,] 0.000000e+00 1.000000e+00 1.110223e-16
[3,] -1.110223e-16 1.110223e-16 1.000000e+00

上記の恒等式が成り立っているか確認する。

> r$u %*% diag(r$d) %*% t(r$v)
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9

行列Aの特異値は、A^T Aの正の固有値の兵の平方根でも求められる。

> sqrt(eigen(t(a) %*% a)$values)
[1] 1.684810e+01 1.068370e+00 7.942757e-08

3つ目は、実質0ということだが、高精度に計算されていないことがわかる。

2021年5月26日 (水)

[C#]コマンドプロンプトでコンパイルする(Visual Studio 2019 Professional)

Visual Studio 2019 Professionalを使ってコマンドプロンプトでコンパイルする場合、「スタートメニュー」→「Visual Studio 2019」→「Developer Command Prompt for VS 2019」で起動する専用のコマンドプロンプトを使うことが一般的だが、環境変数Pathに以下を追加するだけでも使えるようになる。

C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\Roslyn

追加方法は以下のとおり。

エクスプローラー→「PC」のプロパティ→左側のメニュー「システムの詳細設定」→「システムのプロパティ」ダイアログが開いて「環境変数」ボタン→ユーザー環境変数でもシステム環境変数でもどちらでもかまわないが「Path」をクリック→「編集」ボタンを押す→「環境変数名の編集」ダイアログが開くが右側の「新規」ボタン→上記のディレクトリを追加→すべて「OK」ボタンを押して元に戻る

コンパイラーの実行ファイルはcsc.exe。

2021年5月24日 (月)

[R]正規分布における下側、上側、両側の分布関数の値を求める

pnorm関数を使う。以下は、平均10、分散3^2(標準偏差3)の正規分布において、確率変数が15の場合の下側、上側、両側の分布関数の値を求めた例。なお、値は下側0.9522、上側0.04779、両側0.09558である。

> pnorm(15, mean = 10, sd = 3)
[1] 0.9522096
> pnorm(15, mean = 10, sd = 3, lower.tail = FALSE)
[1] 0.04779035
> 1 - pnorm(15, mean = 10, sd = 3)
[1] 0.04779035
> pnorm(15, mean = 10, sd = 3, lower.tail = FALSE) * 2
[1] 0.0955807
> (1 - pnorm(15, mean = 10, sd = 3)) * 2
[1] 0.0955807

特に何も指定しなければ下側を返す。上側を得るにはlower.tailオプションをFALSEとするか、全体を1から引く。両側は上側の値を2倍する。

2021年5月21日 (金)

[R]行列をベクトルに変換する

as.vector関数を使用する。

> mx1 <- matrix(6, nrow = 1, ncol = 1)
> mx2 <- matrix(1:9, nrow = 3, ncol = 3)
> mx1
[,1]
[1,] 6
> as.vector(mx1)
[1] 6
> mx2
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> as.vector(mx2)
[1] 1 2 3 4 5 6 7 8 9
> as.vector(t(mx2))
[1] 1 4 7 2 5 8 3 6 9

1列目の要素すべて、2列目の要素すべて、・・・、という順にベクトルの要素になる。これを1行目の要素すべて、2行目の要素すべて、・・・、としたい場合は、最後の例のとおりにt関数を使って元の行列の転置行列を指定する。

« 2021年3月 | トップページ | 2021年6月 »

無料ブログはココログ

■■

■■■