สร้างตัวเลขสุ่มที่กระจายแบบกระจายด้วยเมทริกซ์ความแปรปรวนร่วมแบบไม่แน่นอนที่แน่นอน


15

ฉันประเมินเมทริกซ์ความแปรปรวนร่วมตัวอย่างของตัวอย่างและรับเมทริกซ์สมมาตร ด้วย , ผมอยากจะสร้าง -variate rn กระจายปกติ แต่เพราะฉะนั้นเราจึงจำเป็นต้องมีการสลายตัว Cholesky ของCฉันควรทำอย่างไรถ้าไม่แน่นอนแน่นอนC n CCCnCC


1
อะไรคือข้อแตกต่างของคำถามนี้stackoverflow.com/questions/17295627/… ?
dickoa

1
เมทริกซ์ Positive-semidefinite มีหลายสแควร์รูท (ดูคำอธิบายในตอนท้ายของstats.stackexchange.com/a/71303/919เป็นต้น) คุณไม่จำเป็นต้องมีสิ่งที่ผลิตโดยการสลายตัวของ Cholesky ในนั้นคือหัวใจของปัญหา: ค้นหาวิธีการคำนวณรากที่สองที่ทำงานได้แม้ว่าเมทริกซ์นั้นจะเอกพจน์ @amoeba ชื่อเรื่องแสดงว่าการตีความของคุณถูกต้อง
whuber

คำตอบ:


8

ความกังวลคำถามวิธีการสร้าง variates สุ่มจากการกระจายปกติหลายตัวแปรด้วย (อาจจะ) เอกพจน์แปรปรวนเมทริกซ์{C} คำตอบนี้อธิบายวิธีหนึ่งที่จะใช้ได้กับเมทริกซ์ความแปรปรวนร่วมใด ๆ มันให้การใช้งานที่ทดสอบความถูกต้องR


การวิเคราะห์พีชคณิตของเมทริกซ์ความแปรปรวนร่วม

เนื่องจากเป็นเมทริกซ์ความแปรปรวนร่วมมันจึงจำเป็นต้องมีความสมมาตรและบวก - semidefinite ในการทำให้ข้อมูลพื้นหลังเสร็จสมบูรณ์ให้เป็นเวกเตอร์ของค่าเฉลี่ยที่ต้องการ μμ

เนื่องจากมีความสมมาตรการแยกย่อยคุณค่าเอกเทศ (SVD) และ eigendecomposition จะมีแบบฟอร์มโดยอัตโนมัติ

=VD2V'

สำหรับบางฉากเมทริกซ์และเส้นทแยงมุมเมทริกซ์ 2 โดยทั่วไปองค์ประกอบในแนวทแยงของนั้นไม่เป็นค่าลบ (หมายความว่าพวกเขาทั้งหมดมีรากที่สองจริง: เลือกองค์ประกอบที่เป็นบวกเพื่อสร้างเมทริกซ์ในแนวทแยง ) ข้อมูลที่เรามีเกี่ยวกับบอกว่าองค์ประกอบเส้นทแยงมุมเหล่านั้นอย่างน้อยหนึ่งรายการเป็นศูนย์ - แต่นั่นจะไม่ส่งผลกระทบต่อการดำเนินการใด ๆ ที่ตามมาและจะไม่ป้องกันการคำนวณ SVDD 2 D 2 D CVD2D2D

การสร้างค่าสุ่มหลายตัวแปร

Letมีมาตรฐานหลายตัวแปรกระจายปกติ: แต่ละองค์ประกอบมีศูนย์หมายถึงหน่วยความแปรปรวนและ covariances ทั้งหมดเป็นศูนย์: เมทริกซ์ความแปรปรวนของมันคือตัวตนที่{I} จากนั้นตัวแปรสุ่มมีเมทริกซ์ความแปรปรวนร่วมI Y = V D XXผมY=VDX

Cov(Y)=E(YY)=E(VDXXDV)=VDE(XX)DV=VDIDV=VD2V=C.

ดังนั้นตัวแปรสุ่มมีการกระจายปกติหลายตัวแปรที่มีค่าเฉลี่ยและความแปรปรวนเมทริกซ์{C}μ+Yμ

การคำนวณและรหัสตัวอย่าง

Rโค้ดต่อไปนี้สร้างเมทริกซ์ความแปรปรวนร่วมของมิติข้อมูลและอันดับที่กำหนดวิเคราะห์ด้วย SVD (หรือในโค้ดที่ใส่เครื่องหมายคอมเม้นต์พร้อมด้วย eigendecomposition) ใช้การวิเคราะห์นั้นเพื่อสร้างจำนวนการรับรู้ที่ระบุของ (ด้วยค่าเฉลี่ยเวกเตอร์ ) แล้วเปรียบเทียบเมทริกซ์ความแปรปรวนร่วมของข้อมูลเหล่านั้นกับเมทริกซ์ความแปรปรวนร่วมที่ตั้งใจไว้ทั้งแบบตัวเลขและแบบกราฟิก ดังที่แสดงจะสร้างเข้าใจที่มิติของคือและอันดับของคือ50ผลลัพธ์คือY010,000Y10050

        rank           L2 
5.000000e+01 8.846689e-05 

นั่นคืออันดับของข้อมูลยังเป็นและเมทริกซ์ความแปรปรวนร่วมที่ประเมินจากข้อมูลอยู่ในระยะทางของซึ่งอยู่ใกล้ จากการตรวจสอบอย่างละเอียดยิ่งขึ้นค่าสัมประสิทธิ์ของถูกวางแผนกับค่าที่ประมาณไว้ พวกเขาทั้งหมดอยู่ใกล้กับสายของความเสมอภาค:508×10-5

รูป

รหัสตรงกับการวิเคราะห์ก่อนหน้านี้อย่างชัดเจนและควรอธิบายด้วยตนเอง (แม้จะไม่ใช่Rผู้ใช้ที่อาจเลียนแบบในสภาพแวดล้อมการใช้งานที่พวกเขาชื่นชอบ) สิ่งหนึ่งที่เปิดเผยคือความจำเป็นในการใช้ความระมัดระวังเมื่อใช้อัลกอริธึมทศนิยม: รายการของสามารถลบได้อย่างง่ายดาย (แต่เล็ก ๆ ) เนื่องจากไม่แม่นยำ รายการดังกล่าวจะต้องถูกทำให้เป็นศูนย์ก่อนที่จะคำนวณสแควร์รูทเพื่อหาตัวเองD2D

n <- 100         # Dimension
rank <- 50
n.values <- 1e4  # Number of random vectors to generate
set.seed(17)
#
# Create an indefinite covariance matrix.
#
r <- min(rank, n)+1
X <- matrix(rnorm(r*n), r)
C <- cov(X)
#
# Analyze C preparatory to generating random values.
# `zapsmall` removes zeros that, due to floating point imprecision, might
# have been rendered as tiny negative values.
#
s <- svd(C)
V <- s$v
D <- sqrt(zapsmall(diag(s$d)))
# s <- eigen(C)
# V <- s$vectors
# D <- sqrt(zapsmall(diag(s$values)))
#
# Generate random values.
#
X <- (V %*% D) %*% matrix(rnorm(n*n.values), n)
#
# Verify their covariance has the desired rank and is close to `C`.
#
s <- svd(Sigma <- cov(t(X)))
(c(rank=sum(zapsmall(s$d) > 0), L2=sqrt(mean(Sigma - C)^2)))

plot(as.vector(C), as.vector(Sigma), col="#00000040",
     xlab="Intended Covariances",
     ylab="Estimated Covariances")
abline(c(0,1), col="Gray")

2
+1 แต่เมื่อคุณพูดว่า "ไม่ จำกัด " ในประโยคแรกของคุณคุณหมายถึงอะไร? ฉันจะตรวจสอบในวิกิพีเดียและมันบอกว่า semidefinite บวกไม่แน่นอนคือความไม่แน่นอนหมายความว่า C มีทั้งบวกและลบค่าลักษณะเฉพาะ นั่นคือสิ่งที่คุณหมายถึงมี?
อะมีบาพูดว่า Reinstate Monica

2
@ อะมีบาใช่นั่นคือลื่น ขอบคุณที่สังเกต "ไม่ จำกัด " หมายถึงลายเซ็นของเมทริกซ์มีทั้งสัญญาณบวกและลบในขณะที่ "semidefinite" หมายถึงลายเซ็นมีเพียงหนึ่งสัญญาณ
whuber

6

โซลูชันวิธี A :

  1. ถ้า C ไม่สมมาตรก็ให้สมมาตร D <-0.5(+T)
  2. เพิ่มเมทริกซ์เอกลักษณ์จำนวนหนึ่งลงใน C แบบสมมาตรซึ่งเพียงพอที่จะทำให้มันเป็นบวกแน่นอนกับสิ่งที่ต้องการระยะขอบ, m, คือสิ่งที่ต้องการเช่นค่าลักษณะเฉพาะที่เล็กที่สุดของเมทริกซ์ใหม่มีค่า eigenvalue ขั้นต่ำ = m โดยเฉพาะ D <-โดยที่ฉันคือเมทริกซ์เอกลักษณ์ D มีเมทริกซ์ความแปรปรวนร่วมที่แน่นอนที่ต้องการบวกD+(ม.-ม.ผมn(อีผมก.อีnโวลต์aล.ยูอี(D)))ผม

ใน MATLAB รหัสจะเป็น

D = 0.5 * (C + C');
D =  D + (m - min(eig(CD)) * eye(size(D));

วิธีการแก้ปัญหา B : กำหนดและแก้ปัญหานูน SDP (โปรแกรม Semidefinite) เพื่อค้นหาเมทริกซ์ D ถึง C ที่ใกล้ที่สุดตามค่ามาตรฐาน frobenius ของความแตกต่างของพวกเขาเช่นนั้น D เป็นบวกแน่นอนมีค่า eigenvalue ขั้นต่ำ m

การใช้ CVX ภายใต้ MATLAB รหัสจะเป็น:

n = size(C,1);
cvx_begin
variable D(n,n)
minimize(norm(D-C,'fro'))
D -m *eye(n) == semidefinite(n)
cvx_end

การเปรียบเทียบวิธีการแก้ปัญหา : นอกเหนือจากสมมาตรเมทริกซ์เริ่มต้นแล้ววิธีการแก้ปัญหา A จะปรับ (เพิ่มขึ้น) เฉพาะองค์ประกอบในแนวทแยงด้วยจำนวนทั่วไปบางส่วนและทำให้องค์ประกอบนอกแนวทแยงไม่เปลี่ยนแปลง วิธีการแก้ปัญหา B พบเมทริกซ์แน่นอนที่ใกล้ที่สุด (กับเมทริกซ์ดั้งเดิม) ที่ใกล้ที่สุดซึ่งมีค่าลักษณะเฉพาะต่ำสุดที่ระบุในแง่ของมาตรฐาน Frobenius ขั้นต่ำของความแตกต่างของเมทริกซ์แน่นอนบวก D และเมทริกซ์ C ดั้งเดิม ความแตกต่างกำลังสองขององค์ประกอบทั้งหมดของ D - C, เพื่อรวมองค์ประกอบนอกแนวทแยงมุม ดังนั้นโดยการปรับองค์ประกอบนอกแนวทแยงมันอาจลดจำนวนที่ต้องเพิ่มองค์ประกอบในแนวทแยงและองค์ประกอบ diagoanl ไม่จำเป็นต้องเพิ่มขึ้นทั้งหมดในจำนวนเดียวกัน


2

ฉันจะเริ่มต้นด้วยการคิดเกี่ยวกับแบบจำลองที่คุณกำลังประเมิน

หากเมทริกซ์ความแปรปรวนร่วมไม่ได้เป็นค่ากึ่งบวกแน่นอนมันอาจบ่งบอกว่าคุณมีปัญหาเกี่ยวกับ colinearity ในตัวแปรของคุณซึ่งจะบ่งบอกถึงปัญหาของตัวแบบและไม่ควรถูกแก้ไขด้วยวิธีเชิงตัวเลข

ถ้าเมทริกซ์นั้นไม่ได้เป็น semidefinite บวกด้วยเหตุผลเชิงตัวเลขก็มีวิธีแก้ปัญหาบางอย่างที่สามารถอ่านได้ที่นี่


1
สมมติฐานคือโมเดลเป็นโมเดลเชิงเส้นผสม และสำหรับกรณีนี้มันไม่เกี่ยวข้องกับการหารูปแบบที่ถูกต้องสำหรับข้อมูลแทนที่จะให้ข้อมูลเป็นตัวอย่างสำหรับการคำนวณบางอย่าง ขณะนี้มีความเป็นไปได้ที่คุณจะได้เมทริกซ์กึ่งไม่มีค่าเป็นบวกซึ่งเป็นค่าประมาณของโควาเรนซี แล้วจะทำอย่างไรถ้าผมอยากหาความแปรปรวนร่วมจากประชากรที่กระจายตัวแบบปกติที่ข้อมูลมาจากไหน นั่นคือตัวอย่างที่กระจายปกติคือการระเบิด
Klaus

1

วิธีหนึ่งคือการคำนวณเมทริกซ์จากการสลายตัวของค่าเฉพาะ ตอนนี้ฉันจะยอมรับว่าฉันไม่รู้คณิตศาสตร์มากเกินไปที่อยู่เบื้องหลังกระบวนการเหล่านี้ แต่จากการวิจัยของฉันดูเหมือนว่ามีประโยชน์ที่จะดูไฟล์ช่วยเหลือนี้:

http://stat.ethz.ch/R-manual/R-patched/library/Matrix/html/chol.html

และคำสั่งอื่น ๆ ที่เกี่ยวข้องใน R.

นอกจากนี้ตรวจสอบ 'nearPD' ในแพ็คเกจ Matrix

ขออภัยฉันไม่สามารถช่วยเหลือได้อีก แต่หวังว่าการค้นหาของฉันจะช่วยผลักดันคุณไปในทิศทางที่ถูกต้อง


สวัสดีขอบคุณสำหรับลิงค์ การสลายตัวของค่าไอเกนการสลายตัวนี้ไม่ได้ช่วยเพราะจากที่นั่นคุณได้รับค่าลักษณะเฉพาะที่ซับซ้อนสำหรับเมทริกซ์รากที่สอง แต่ฉันต้องการเมทริกซ์ที่มีมูลค่า
Klaus

1

คุณสามารถรับผลลัพธ์จากฟังก์ชั่น nearPD ในแพ็คเกจ Matrix ใน R ซึ่งจะให้เมทริกซ์ที่มีคุณค่ากลับคืนมา

library(Matrix)
A <- matrix(1, 3,3); A[1,3] <- A[3,1] <- 0
n.A <- nearPD(A, corr=T, do2eigen=FALSE)
n.A$mat

# 3 x 3 Matrix of class "dpoMatrix"
#           [,1]      [,2]      [,3]
# [1,] 1.0000000 0.7606899 0.1572981
# [2,] 0.7606899 1.0000000 0.7606899
# [3,] 0.1572981 0.7606899 1.0000000

สำหรับผู้ใช้ R .. นี่อาจไม่ใช่เวอร์ชั่น "คนจน" ที่แย่ (มีการควบคุมน้อยกว่า) ของวิธีการแก้ปัญหา B ในคำตอบของฉัน
Mark L. Stone

ฉันยอมรับว่านี่ไม่เหมาะสม แต่บางครั้งมันก็หลอกลวง
ดร. ไมค์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.