2011-07-04 38 views
16

Tôi đang giải quyết vấn đề tối ưu hóa đơn giản. Tập dữ liệu có 26 cột và hơn 3000 hàng. Mã nguồn trông giống nhưR giải quyết: hệ thống là chính xác số ít

Means <- colMeans(Returns) 
Sigma <- cov(Returns) 
invSigma1 <- solve(Sigma) 

Và mọi thứ hoạt động perfect- nhưng sau đó tôi muốn làm tương tự cho thời gian ngắn hơn (chỉ 261 hàng) và các chức năng giải quyết viết các lỗi sau:

solve(Sigma) 
Error in solve.default(Sigma) : 
    Lapack routine dgesv: system is exactly singular 

Thật kỳ lạ bởi vì khi tôi làm tương tự với một số số ngẫu nhiên:

Returns<-matrix(runif(6786,-1,1), nrow=261) 
Means <- colMeans(Returns) 
Sigma <- cov(Returns) 
invSigma <- solve(Sigma) 

không xảy ra lỗi. Ai đó có thể giải thích cho tôi nơi có thể là vấn đề và làm thế nào để đối xử với nó. Cảm ơn bạn rất nhiều, Alex

Trả lời

10

Tôi đoán mã của bạn sử dụng ở đâu đó trong trường hợp thứ hai là ma trận số ít (nghĩa là không đảo ngược) và chức năng giải quyết cần đảo ngược. Điều này không có gì để làm với kích thước nhưng với thực tế là một số vectơ của bạn là (có thể) colinear.

+0

Tập dữ liệu chứa trả về hàng ngày của 26 nội dung trả về, nó sẽ không thể đảo ngược, phải không? Tôi bối rối tại sao không có vấn đề gì khi tôi có toàn bộ tập dữ liệu trong khi rút ngắn lỗi sản xuất. Bất kỳ ý tưởng làm thế nào để đối phó với nó? – Alex

+4

@Alex Check 'det (Sigma)': Nếu nó bằng 0 thì không thể đảo ngược. – James

+0

Thật vậy, đó là 0. Sự cố khi tôi rút ngắn tập dữ liệu là gì? – Alex

16

Sử dụng solve với thông số duy nhất là yêu cầu đảo ngược ma trận. Thông báo lỗi cho bạn biết rằng ma trận của bạn là số ít và không thể đảo ngược.

+0

trang sau, gần phía dưới, đã giúp tôi hiểu các khái niệm về vấn đề đảo ngược và kỳ dị: [link] (https://www.mathsisfun.com/algebra/matrix-inverse.html) – Jacksonsox

5

Lapack là gói Đại số tuyến tính được sử dụng bởi R (thực tế nó được sử dụng ở mọi nơi) bên dưới solve(), dgesv phun loại lỗi này khi ma trận bạn truyền dưới dạng tham số là số ít.

Là phụ lục: dgesv thực hiện phân rã LU, khi sử dụng ma trận của bạn, buộc phân chia bằng 0, vì điều này không được xác định, nó sẽ ném lỗi này. Điều này chỉ xảy ra khi ma trận là số ít hoặc khi số ít trên máy của bạn (do xấp xỉ bạn có thể có một số thực sự nhỏ được coi là 0)

Tôi muốn kiểm tra yếu tố quyết định nếu ma trận bạn đang sử dụng số nguyên và không lớn. Nếu nó lớn, hãy xem this link.

Các vấn đề liên quan