共分散行列とはなんですか?
共分散行列はどうやって求めるんですか?

このQ&Aに関連する最新のQ&A

A 回答 (1件)

共分散 covariance。

分野によって、例えば信号処理における使い方と、因子分析における使い方ではちょっと重点が違いますので、何に使うのか補足お願いします。

だいたいの所を申し上げれば....
サンプルi=1,2,.....,N(学生N人)のそれぞれについて、項目j=1,2,....,M(科目M種類)の測定(学力テスト)を行ったとします。これをN行M列の得点行列Aijで表します。Aij = サンプルiの項目jに関する測定値。
各項目jごとに、平均mj(平均点)を求めこれを引き去ります。つまり、
Bij = (Aij - mj )
これで、N行M列の行列Bijは各項目毎に平均0になっています。
共分散行列(の推定値)は
V = (B' B )/N ('は転置)
です。対角成分は項目jの分散で、平方根を取れば標準偏差ですね。非対角成分を共分散と言います。
    • good
    • 0
この回答へのお礼

ありがとうございました。
これでレポートがかけます
助かりました

お礼日時:2000/12/21 21:35

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q共分散行列と分散共分散行列の違いとはなんですか?

共分散行列と分散共分散行列の違いとはなんですか?
現在、共分散行列について調べているのですが、分散共分散行列ばかりが引っかかって混乱しています。

Aベストアンサー

両者は、全く同じものです。
共分散行列の対角要素が、
各確率変数の分散になっているため、
一部の流派では、分散共分散行列と呼ぶのです。
分散行列と呼んでしまう流派もあります。
もともと、分散と共分散を区別することが
つまらないことなのかもしれません。
ベクトルの内積を考えるとき、
a・b と a・a で用語を変えたりは
しませんよね。

Q分散共分散行列の逆行列

以下の行列を考えます.
行列X(M行N列,成分の値は分散1のガウスノイズ)
行列Xの分散共分散行列S(M行M列),
行列Sの逆行列Y(M行M列)

N=M+1のときはN≠M+1のときに比べて行列Yの各成分の大きさがかなり大きくなる,という結果が得られました.
(計算にはMATLABの関数covとpinvを用いました.)
これは数学的に正しいことなのでしょうか.
また,正しいとしたらどうしてこのようなことが起こるのでしょうか.

行列Yの計算結果の例を以下に示します.(行列Yを500回算出し,それらの平均値を示しています.)
http://wisteria.orz.ne.jp/download/pinvcovX.jpg
縦・横方向の軸は行列Yのインデックスを,高さ方向の軸は行列Yの成分の値を示しています.
上述した現象の原因についてご教授いただけると幸いです.

Aベストアンサー

Rで試してみたら同じような結果になりました。
その結果が添付画像です。
それぞれのz軸の上限は「z:上限」で表しています。

繰り返し回数を増やしたら各成分が小さくなると思っていたのですが、逆に大きくなりました。

Nが大きくなるにつれ、単位行列に近づいていくようです。
これ自体は分散共分散行列が単位行列に近づくことから当然ですか。

試したコード
func1 <- function(x, M)
{
y <- matrix(x, ncol = M)
z <- cov(y)
c(as.vector(z), as.vector(solve(z)))
}

func2 <- function(M = 20, N = 21, R = 500)
{
x <- matrix(rnorm(M*N*R), nrow = R)
y <- apply(x, 1, function(t) func1(t, M))
z <- rowMeans(y)
list(cov = matrix(z[1:(M*M)], ncol = M), covinv = matrix(z[(M*M+1):(2*M*M)], ncol = M))
}

x <- func2(20, 21, 10000)
y <- func2(20, 21, 500)
z <- func2(20, 22, 500)
w <- func2(20, 100, 500)

par(mfrow = c(2, 2))
persp(x$covinv, zlim = c(-0.5, 10^10), xlab = "x", main = "M = 20, N = 21, 10000回の平均, z:10^10")
persp(y$covinv, zlim = c(-0.5, 10^5), xlab = "x", main = "M = 20, N = 21, 500回の平均, z:10^5")
persp(z$covinv, zlim = c(-0.5, 10^3), xlab = "x", main = "M = 20, N = 22, 500回の平均, z:10^3")
persp(w$covinv, zlim = c(-0.5, 10), xlab = "x", main = "M = 20, N = 100, 500回の平均, z:10")
par(mfrow = c(1, 1))

Rで試してみたら同じような結果になりました。
その結果が添付画像です。
それぞれのz軸の上限は「z:上限」で表しています。

繰り返し回数を増やしたら各成分が小さくなると思っていたのですが、逆に大きくなりました。

Nが大きくなるにつれ、単位行列に近づいていくようです。
これ自体は分散共分散行列が単位行列に近づくことから当然ですか。

試したコード
func1 <- function(x, M)
{
y <- matrix(x, ncol = M)
z <- cov(y)
c(as.vector(z), as.vector(solve(z)))
}

func2 <- function(M = 20, N = 21, R =...続きを読む

Q分散共分散行列を簡単に手っ取り早く求めたい

株価データを使ってポートフォリオの収益率の分散を求めようとしています。(エクセルを使ってます)その過程で分散共分散行列が必要です。

個別銘柄を50社選び、それぞれの銘柄の月次終値を5年分用意し、それら変化率を求めました。〔(終値t+1)-(終値t)〕÷(終値t)のような感じで変化率を出しました。次にエクセルの共分散を求める関数COVARを使い、共分散を一つ一つ計算しようと思ったんですが、さすがに50社もあるのでできません。

楽に分散共分散行列を求められる方法はないのでしょうか。
また、数学は苦手ですし、プログラミングもやったことすらありませんので、簡単に求められる方法を教えてください。お願いします。

Aベストアンサー

「ツール」メニューの「分析ツール」に「共分散」があります.
「ツール」メニューに「分析ツール」が見当たらない場合は,
「ツール」「アドイン」で「分析ツール」にチェックを入れれば,
次から「分析ツール」が表示されます.
分散共分散行列が下三角行列の形で出力されます.

Q分散共分散行列

分散共分散行列

分散共分散行列とはどのような行列のことを言いますか?
どのようなものが分散共分散行列であり、どのようなものが分散共分散行列なり得ないのかわからないので教えてもらえますか?
たとえば

  
A=|1 1 |
  |1 -1|

B=|7 3|
|3 7|
の行列は分散共分散行列となりますか?
できたら理由も教えてください。

Aベストアンサー

x_i, x_jの共分散をγ_ij
γ_ij = E{(x_i-m_i)(x_j-m_j)}  (i≠j)

行列A=(γ_ij) を共分散行列といいます。
Aは、
(1)対称行列 γ_ij = γ_ji
(2)正値行列 Σ[1,k]Σ[1,k]γijx_ix_j >0 (x_i≠0,x_j≠0)
の性質をもちます。

ですから、(1),(2)を確かめればいいですね。
ご自分で確かめて下さい。

Q共分散行列の求め方

数個のデータから共分散行列を生成するプログラムを実装しようと
考えています。そこで、次のようなプログラムを書きましたが、
結果があっているかがわかりません。共分散行列の生成方法に
詳しい方がおられましたら、どうか教えて頂きたいと思います。
共分散行列生成に用いた式は
Σ = E[(X-E[X])(X-E[X])^T]  です。
(Σ:共分散行列 X:データ E[X]:Xの平均 ^T:転置行列)


double xave = 0.0; //式のE[x]にあたる部分
double work [ ]; //データを入れる一次元配列(式のXにあたる)
double a[][]; //共分散行列を入れる配列

work[0] = 3; //5つのデータを格納
work[1] = -2;
work[2] = 5;
work[3] = -3;
work[4] = 2;

for(i = 0; i < N; i++){   //E[x]を求めるためにxaveに全要素合計を入れる
xave += work[i];
}
xave /= N;        //全要素合計をデータ数で割る
for(i = 0; i < N; i++){   //要素Xから平均を引く(X-E[x]にあたる)
work[i] -= xave;
}
for(i = 0; i < N; i++){
for(j = 0; j < N; j++){
a[i][j] = work[i]*work[j]/N;  //a[][]に値を格納 Nで割っているのは式の一番外側のEにあたる
}
}

<実行結果>

0.0 | 0.0 | 0.0 | 0.0 | 0.0
0.0 | 4.0 | -6.0 | 8.0 | -8.0
0.0 | -6.0 | 9.0 | -12.0 | 12.0
0.0 | 8.0 | -12.0 | 16.0 | -16.0
0.0 | -8.0 | 12.0 | -16.0 | 16.0

数個のデータから共分散行列を生成するプログラムを実装しようと
考えています。そこで、次のようなプログラムを書きましたが、
結果があっているかがわかりません。共分散行列の生成方法に
詳しい方がおられましたら、どうか教えて頂きたいと思います。
共分散行列生成に用いた式は
Σ = E[(X-E[X])(X-E[X])^T]  です。
(Σ:共分散行列 X:データ E[X]:Xの平均 ^T:転置行列)


double xave = 0.0; //式のE[x]にあたる部分
double work [ ]; //データを入れる一次元配列(式のXにあたる)
double a[][]; //...続きを読む

Aベストアンサー

> ・言語は一応Javaでやっています。

Javaでしたか、ずいぶん前にちょっと使ってみただけでしたので思いつきませんでした。

> Σ = E[(X-E[X])(X-E[X])^T] の式から、(X-E[X])を一列の列ベクトル、
> (X-E[X])^Tを一行の行ベクトルと考え、二つの行列の積を考えるとちょうど
> 正方行列になるので、これでいいかと思っていました。しかし、この考え方
> では間違っているとういことでしょうか。

はい、そうなります。
E[X]は列ベクトルとなりますが、Xの要素が異なる変数なので、それぞれの期待値が等しくなるとは限りません。
なので、

> for(i = 0; i < N; i++){   //要素Xから平均を引く(X-E[x]にあたる)
> work[i] -= xave;
> }

とするのはおかしいのです。
引くなら、work[i]の値を引くべきです。
(データ数が1個なので平均はwork[i]そのもの。その結果共分散行列は5×5の零行列になる)


> それならば、共分散行列を生成するには、二次元以上のデータが必要ということでしょうか。

例えば、下記のようなデータなら計算できます。

番号  変数1  変数2  変数3  変数4  変数5
 1    5     3     4     6    1
 2    …


上のような形式のデータなら変数ごとの分散と変数間の共分散を求めて、共分散行列を得ることが出来ます。

> ・言語は一応Javaでやっています。

Javaでしたか、ずいぶん前にちょっと使ってみただけでしたので思いつきませんでした。

> Σ = E[(X-E[X])(X-E[X])^T] の式から、(X-E[X])を一列の列ベクトル、
> (X-E[X])^Tを一行の行ベクトルと考え、二つの行列の積を考えるとちょうど
> 正方行列になるので、これでいいかと思っていました。しかし、この考え方
> では間違っているとういことでしょうか。

はい、そうなります。
E[X]は列ベクトルとなりますが、Xの要素が異なる変数なので、それぞれの期待値が等しくなると...続きを読む


人気Q&Aランキング

おすすめ情報