ฉันประเมินเมทริกซ์ความแปรปรวนร่วมตัวอย่างของตัวอย่างและรับเมทริกซ์สมมาตร ด้วย , ผมอยากจะสร้าง -variate rn กระจายปกติ แต่เพราะฉะนั้นเราจึงจำเป็นต้องมีการสลายตัว Cholesky ของCฉันควรทำอย่างไรถ้าไม่แน่นอนแน่นอนC n C
ฉันประเมินเมทริกซ์ความแปรปรวนร่วมตัวอย่างของตัวอย่างและรับเมทริกซ์สมมาตร ด้วย , ผมอยากจะสร้าง -variate rn กระจายปกติ แต่เพราะฉะนั้นเราจึงจำเป็นต้องมีการสลายตัว Cholesky ของCฉันควรทำอย่างไรถ้าไม่แน่นอนแน่นอนC n C
คำตอบ:
ความกังวลคำถามวิธีการสร้าง variates สุ่มจากการกระจายปกติหลายตัวแปรด้วย (อาจจะ) เอกพจน์แปรปรวนเมทริกซ์{C} คำตอบนี้อธิบายวิธีหนึ่งที่จะใช้ได้กับเมทริกซ์ความแปรปรวนร่วมใด ๆ มันให้การใช้งานที่ทดสอบความถูกต้องR
เนื่องจากเป็นเมทริกซ์ความแปรปรวนร่วมมันจึงจำเป็นต้องมีความสมมาตรและบวก - semidefinite ในการทำให้ข้อมูลพื้นหลังเสร็จสมบูรณ์ให้เป็นเวกเตอร์ของค่าเฉลี่ยที่ต้องการ μ
เนื่องจากมีความสมมาตรการแยกย่อยคุณค่าเอกเทศ (SVD) และ eigendecomposition จะมีแบบฟอร์มโดยอัตโนมัติ
สำหรับบางฉากเมทริกซ์และเส้นทแยงมุมเมทริกซ์ 2 โดยทั่วไปองค์ประกอบในแนวทแยงของนั้นไม่เป็นค่าลบ (หมายความว่าพวกเขาทั้งหมดมีรากที่สองจริง: เลือกองค์ประกอบที่เป็นบวกเพื่อสร้างเมทริกซ์ในแนวทแยง ) ข้อมูลที่เรามีเกี่ยวกับบอกว่าองค์ประกอบเส้นทแยงมุมเหล่านั้นอย่างน้อยหนึ่งรายการเป็นศูนย์ - แต่นั่นจะไม่ส่งผลกระทบต่อการดำเนินการใด ๆ ที่ตามมาและจะไม่ป้องกันการคำนวณ SVDD 2 D 2 D C
Letมีมาตรฐานหลายตัวแปรกระจายปกติ: แต่ละองค์ประกอบมีศูนย์หมายถึงหน่วยความแปรปรวนและ covariances ทั้งหมดเป็นศูนย์: เมทริกซ์ความแปรปรวนของมันคือตัวตนที่{I} จากนั้นตัวแปรสุ่มมีเมทริกซ์ความแปรปรวนร่วมI Y = V D X
ดังนั้นตัวแปรสุ่มมีการกระจายปกติหลายตัวแปรที่มีค่าเฉลี่ยและความแปรปรวนเมทริกซ์{C}
R
โค้ดต่อไปนี้สร้างเมทริกซ์ความแปรปรวนร่วมของมิติข้อมูลและอันดับที่กำหนดวิเคราะห์ด้วย SVD (หรือในโค้ดที่ใส่เครื่องหมายคอมเม้นต์พร้อมด้วย eigendecomposition) ใช้การวิเคราะห์นั้นเพื่อสร้างจำนวนการรับรู้ที่ระบุของ (ด้วยค่าเฉลี่ยเวกเตอร์ ) แล้วเปรียบเทียบเมทริกซ์ความแปรปรวนร่วมของข้อมูลเหล่านั้นกับเมทริกซ์ความแปรปรวนร่วมที่ตั้งใจไว้ทั้งแบบตัวเลขและแบบกราฟิก ดังที่แสดงจะสร้างเข้าใจที่มิติของคือและอันดับของคือ50ผลลัพธ์คือ
rank L2
5.000000e+01 8.846689e-05
นั่นคืออันดับของข้อมูลยังเป็นและเมทริกซ์ความแปรปรวนร่วมที่ประเมินจากข้อมูลอยู่ในระยะทางของซึ่งอยู่ใกล้ จากการตรวจสอบอย่างละเอียดยิ่งขึ้นค่าสัมประสิทธิ์ของถูกวางแผนกับค่าที่ประมาณไว้ พวกเขาทั้งหมดอยู่ใกล้กับสายของความเสมอภาค:
รหัสตรงกับการวิเคราะห์ก่อนหน้านี้อย่างชัดเจนและควรอธิบายด้วยตนเอง (แม้จะไม่ใช่R
ผู้ใช้ที่อาจเลียนแบบในสภาพแวดล้อมการใช้งานที่พวกเขาชื่นชอบ) สิ่งหนึ่งที่เปิดเผยคือความจำเป็นในการใช้ความระมัดระวังเมื่อใช้อัลกอริธึมทศนิยม: รายการของสามารถลบได้อย่างง่ายดาย (แต่เล็ก ๆ ) เนื่องจากไม่แม่นยำ รายการดังกล่าวจะต้องถูกทำให้เป็นศูนย์ก่อนที่จะคำนวณสแควร์รูทเพื่อหาตัวเอง
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")
โซลูชันวิธี A :
ใน 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 ไม่จำเป็นต้องเพิ่มขึ้นทั้งหมดในจำนวนเดียวกัน
ฉันจะเริ่มต้นด้วยการคิดเกี่ยวกับแบบจำลองที่คุณกำลังประเมิน
หากเมทริกซ์ความแปรปรวนร่วมไม่ได้เป็นค่ากึ่งบวกแน่นอนมันอาจบ่งบอกว่าคุณมีปัญหาเกี่ยวกับ colinearity ในตัวแปรของคุณซึ่งจะบ่งบอกถึงปัญหาของตัวแบบและไม่ควรถูกแก้ไขด้วยวิธีเชิงตัวเลข
ถ้าเมทริกซ์นั้นไม่ได้เป็น semidefinite บวกด้วยเหตุผลเชิงตัวเลขก็มีวิธีแก้ปัญหาบางอย่างที่สามารถอ่านได้ที่นี่
วิธีหนึ่งคือการคำนวณเมทริกซ์จากการสลายตัวของค่าเฉพาะ ตอนนี้ฉันจะยอมรับว่าฉันไม่รู้คณิตศาสตร์มากเกินไปที่อยู่เบื้องหลังกระบวนการเหล่านี้ แต่จากการวิจัยของฉันดูเหมือนว่ามีประโยชน์ที่จะดูไฟล์ช่วยเหลือนี้:
http://stat.ethz.ch/R-manual/R-patched/library/Matrix/html/chol.html
และคำสั่งอื่น ๆ ที่เกี่ยวข้องใน R.
นอกจากนี้ตรวจสอบ 'nearPD' ในแพ็คเกจ Matrix
ขออภัยฉันไม่สามารถช่วยเหลือได้อีก แต่หวังว่าการค้นหาของฉันจะช่วยผลักดันคุณไปในทิศทางที่ถูกต้อง
คุณสามารถรับผลลัพธ์จากฟังก์ชั่น 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