การคำนวณเมทริกซ์ผกผันใน R อย่างมีประสิทธิภาพ


21

ฉันต้องการคำนวณเมทริกซ์ผกผันและใช้solveฟังก์ชัน ในขณะที่มันใช้งานได้ดีกับเมทริกซ์ขนาดเล็ก แต่solveมีแนวโน้มที่จะช้ามากในเมทริกซ์ขนาดใหญ่ ฉันสงสัยว่ามีฟังก์ชั่นอื่น ๆ หรือการรวมกันของฟังก์ชั่น (ผ่าน SVD, QR, LU หรือฟังก์ชั่นการสลายตัวอื่น ๆ ) ที่สามารถให้ผลลัพธ์ที่เร็วขึ้น


2
คุณสามารถให้ข้อมูลเพิ่มเติมได้หรือไม่ ขนาดโดยประมาณคืออะไร เมทริกซ์มีโครงสร้างพิเศษใด ๆ หรือไม่ (สมมาตร, sparsity ฯลฯ )? คำจำกัดความเชิงปริมาณของคุณของ "ช้า" คืออะไร? และ "เร็ว"?
พระคาร์ดินัล

ขนาดโดยประมาณเป็นเช่น 2000x2000 เมทริกซ์ไม่มีโครงสร้างพิเศษใด ๆ ดีsolveวิธีแน่นอนการทำงานของฉัน แต่ฉันต้องการขั้นตอนวิธีการที่จะได้เร็วขึ้น ดังนั้นฉันแค่สงสัยว่ามีฟังก์ชัน (ในบริบทเวลา) ที่มีประสิทธิภาพมากขึ้นสำหรับการคำนวณค่าผกผันสำหรับเมทริกซ์ขนาดใหญ่เช่นนั้นหรือไม่
jitendra

1
คุณลองคำแนะนำอื่น ๆ ในหน้าความช่วยเหลือsolveหรือยัง แน่นอนว่าไม่มีโครงสร้างพิเศษคุณไม่สามารถหลีกเลี่ยงขอบเขตความซับซ้อนเชิงทฤษฎีบนการผกผันเมทริกซ์ทั่วไปได้
พระคาร์ดินัล

3
@Cardinal เคล็ดลับคือตรวจสอบเพิ่มเติมเกี่ยวกับแอปพลิเคชันจริงตามที่คุณทราบในหลาย ๆ กรณีการสลับเมทริกซ์นั้นไม่จำเป็น (และใช้เวลานานและมีแนวโน้มผิดพลาด)
whuber

@whuber: นี่เป็นจุดที่ดีมาก ฉันคิดว่าบางครั้งฉันก็เข้าใกล้คำถามเหล่านี้เล็กน้อยเกินไป
พระคาร์ดินัล

คำตอบ:


23

คุณได้ลองสิ่งที่พระคาร์ดินัลแนะนำและสำรวจวิธีการทางเลือกสำหรับการคำนวณอินเวอร์ส? ลองพิจารณาตัวอย่างที่เฉพาะเจาะจง:

library(MASS)

k   <- 2000
rho <- .3

S       <- matrix(rep(rho, k*k), nrow=k)
diag(S) <- 1

dat <- mvrnorm(10000, mu=rep(0,k), Sigma=S) ### be patient!

R <- cor(dat)

system.time(RI1 <- solve(R))
system.time(RI2 <- chol2inv(chol(R)))
system.time(RI3 <- qr.solve(R))

all.equal(RI1, RI2)
all.equal(RI1, RI3)

ดังนั้นนี้เป็นตัวอย่างของหนึ่งสัมพันธ์เมทริกซ์ที่เราต้องการที่ผกผัน บนแล็ปท็อปของฉัน (Core-i5 2.50Ghz) ใช้เวลา 8-9 วินาทีใช้เวลามากกว่า 4 วินาทีและใช้เวลา 17-18 วินาที (แนะนำให้ใช้โค้ดหลาย ๆ ตัวเพื่อให้ได้ผลลัพธ์ที่มีเสถียรภาพ)2000×2000solvechol2inv(chol())qr.solve()

ดังนั้นผกผันผ่านการสลายตัว Choleski solveเป็นเรื่องเกี่ยวกับรวดเร็วเป็นสองเท่า อาจมีวิธีที่เร็วกว่าในการทำเช่นนั้น ฉันเพิ่งสำรวจสิ่งที่ชัดเจนที่สุดที่นี่ และดังที่ได้กล่าวไปแล้วในความคิดเห็นหากเมทริกซ์มีโครงสร้างพิเศษดังนั้นสิ่งนี้อาจถูกนำมาใช้เพื่อความเร็วที่มากขึ้น


ขอบคุณมากสำหรับโซลูชันนี้ อย่างน้อยฉันก็รู้วิธีการหนึ่งที่สามารถแก้ปัญหานี้ได้ครึ่งหนึ่งเมื่อเทียบกับsolve:-)
jitendra

8
การสลายตัวของโคลเลสกี้เป็นทางเลือกที่ดีสำหรับเมทริกซ์ความแปรปรวนร่วม / ความสัมพันธ์ แต่จำไว้ว่าโดยทั่วไปเมทริกซ์จะต้องเป็นเฮอร์มีเชียน (ในกรณีของเมทริกซ์จริงที่หมายถึงสมมาตร) เมทริกซ์แน่นอนบวก ที่ใช้ครึ่งหนึ่งของหน่วยความจำที่จำเป็นสำหรับการย่อยสลาย LU
Raxel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.