Tính toán hiệu quả của nghịch đảo căn bậc hai ma trận


15

Một vấn đề phổ biến trong thống kê là tính toán nghịch đảo căn bậc hai của ma trận xác định dương đối xứng. Điều gì sẽ là cách hiệu quả nhất của máy tính này?

Tôi đã xem qua một số tài liệu (mà tôi chưa đọc) và một số mã R ngẫu nhiên ở đây , mà tôi sẽ sao chép ở đây để thuận tiện

# function to compute the inverse square root of a matrix
fnMatSqrtInverse = function(mA) {
  ei = eigen(mA)
  d = ei$values
      d = (d+abs(d))/2
      d2 = 1/sqrt(d)
      d2[d == 0] = 0
      return(ei$vectors %*% diag(d2) %*% t(ei$vectors))
}

Tôi không hoàn toàn chắc chắn tôi hiểu dòng d = (d+abs(d))/2. Có cách nào hiệu quả hơn để tính toán nghịch đảo căn bậc hai ma trận không? Hàm R eigengọi LAPACK .


d(d+|d|)/2tối đa(d,0)Một-1/2Một-1/2x

@DanielShapero Cảm ơn bình luận của bạn. Vậy nếu tôi có ma trận PSD, tôi không cần dòng đó? Ứng dụng của tôi yêu cầu tính toán các dạng bậc hai như . Một-1/2BMột-1/2
tchakravarty

Tôi không quen thuộc với R, nhưng được đưa ra dòng 7 Tôi cho rằng nó có lập chỉ mục logic như Matlab. Nếu vậy, tôi đề nghị bạn viết lại dòng 5 như d[d<0] = 0, nó có ý nghĩa hơn.
Federico Poloni

Mã này có đúng không? Tôi đã chạy nó trên một ví dụ đơn giản trong MATLAB và thấy câu trả lời là sai. Ma trận của tôi là xác định dương nhưng chắc chắn không đối xứng. Xin vui lòng xem câu trả lời của tôi dưới đây: Tôi đã chuyển mã sang matlab.
roni

Câu trả lời:


10

Mã mà bạn đã đăng sử dụng phân tách eigenvalue của ma trận đối xứng để tính . Một-1/2

Tuyên bố

d = (d + abs (d)) / 2

có hiệu quả lấy bất kỳ mục tiêu cực nào trong d và đặt nó thành 0, trong khi chỉ để lại các mục không âm. Nghĩa là, bất kỳ giá trị riêng âm nào của đều được xử lý như là 0. Về lý thuyết, các giá trị riêng của A đều không âm, nhưng trong thực tế, người ta thường thấy các giá trị riêng âm nhỏ khi bạn tính giá trị riêng của một giá trị xác định dương. ma trận hiệp phương sai gần như số ít. Một

Nếu bạn thực sự cần nghịch đảo của căn bậc hai ma trận đối xứng của và nhỏ một cách hợp lý (không lớn hơn 1.000 bằng 1.000), thì điều này cũng tốt như bất kỳ phương pháp nào bạn có thể sử dụng. MộtMột

Trong nhiều trường hợp, thay vào đó, bạn có thể sử dụng hệ số Cholesky của nghịch đảo của ma trận hiệp phương sai (hoặc thực tế là giống nhau, yếu tố Cholesky của chính ma trận hiệp phương sai). ma trận dày đặc và hiệu quả hơn rất nhiều (cả về thời gian tính toán và lưu trữ bắt buộc) cho ma trận lớn và thưa thớt. Do đó, việc sử dụng hệ số Cholesky trở nên rất mong muốn khi lớn và thưa thớt. Một


6
AAMột= =BTBBBRMột

5

Theo kinh nghiệm của tôi, phương pháp Higham Newton của Higham hoạt động nhanh hơn nhiều (xem Chương 6 về Chức năng của ma trận của N. Higham). Trong ghi chú ngắn này của tôi có các ô so sánh phương pháp này với các phương pháp đặt hàng đầu tiên. Ngoài ra, các trích dẫn cho một số cách tiếp cận căn bậc hai ma trận khác được trình bày, mặc dù chủ yếu là phép lặp Newton cực có vẻ hoạt động tốt nhất (và tránh thực hiện các tính toán eigenvector).

% compute the matrix square root; modify to compute inverse root.
function X = PolarIter(M,maxit,scal)
  fprintf('Running Polar Newton Iteration\n');
  skip = floor(maxit/10);
  I = eye(size(M));
  n=size(M,1);
  if scal
    tm = trace(M);
    M  = M / tm;
  else
    tm = 1;
  end
  nm = norm(M,'fro');

  % to compute inv(sqrt(M)) make change here
  R=chol(M+5*eps*I);

  % computes the polar decomposition of R
  U=R; k=0;
  while (k < maxit)
    k=k+1;
    % err(k) = norm((R'*U)^2-M,'fro')/nm;
    %if (mod(k,skip)==0)
    %  fprintf('%d: %E\n', k, out.err(k));
    %end

    iU=U\I;
    mu=sqrt(sqrt(norm(iU,1)/norm(U,1)*norm(iU,inf)/norm(U,inf)));
    U=0.5*(mu*U+iU'/mu);

   if (err(k) < 1e-12), break; end
  end
  X=sqrt(tm)*R'*U;
  X = 0.5*(X+X');
end

0

Tối ưu hóa mã của bạn:

Tùy chọn 1 - Tối ưu hóa mã R của bạn:
a. Bạn có thể apply()một chức năng dđó sẽ cả hai max(d,0)d2[d==0]=0trong một vòng lặp.
b. Hãy thử hoạt động ei$valuestrực tiếp.

Tùy chọn 2 - Sử dụng C ++:
Viết lại toàn bộ chức năng trong C ++ với RcppArmadillo. Bạn vẫn có thể gọi nó từ R.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.