Let X be any rectangular matrix. What is the trace of the crossproducts matrix, X'*X? Interestingly, you do not need to form the crossproducts matrix to compute the answer! It turns out that tr(X'*X) equals the sum of the squared elements of X.
Theorem: For any matrix, X, the trace of the crossproducts matrix is the sum of the squared elements: \(\mathrm{tr}(X'X) = \sum_i \sum_j X_{ij}^2\).
Proof: By definition of matrix multiplication, the i_th diagonal element of \(X'X\) is \((X'X)_{ii} = \sum_j (X')_{ij} X_{ji} = \sum_j X_{ji} X_{ji} = \sum_j X_{ji}^2\). Therefore, the trace of \(X'X\) is \(\mathrm{tr}(X'X) = \sum_i (X'X)_{ii} = \sum_i \sum_j X_{ji}^2\).
You can use the TRACE function and the SSQ function in the SAS IML matrix language to verify that the formula holds for the following example:
proc iml; /* read in any numeric matrix, X */ use sashelp.class; read all var {age weight height} into X; close; traceDef = trace(X`*X); /* slow: explicitly forms X`*X */ traceSSQ = ssq(X); /* fast: does not forms X`*X */ diff = max(abs(traceDef - traceSSQ)); reset fuzz=1E-10; /* print tiny numbers as 0 */ print traceDef traceSSQ diff; |
The program shows that you can compute the trace of a crossproducts matrix directly from X without ever forming the crossproducts matrix. Notice that the traditional formation of X'*X requires O(n2m) when X is an n x m matrix. In contrast, the sum of the squared elements is O(nm).