From 4f96ae7d1f6e3780970833c6d3513904d00ebf90 Mon Sep 17 00:00:00 2001 From: Christopher Paciorek Date: Tue, 24 Oct 2023 08:48:08 -0700 Subject: [PATCH 01/17] edits to unit 9 --- .../units/unit9-sim/execute-results/html.json | 4 +- .../units/unit9-sim/execute-results/tex.json | 4 +- .../figure-html/unnamed-chunk-2-1.png | Bin 32099 -> 31258 bytes .../figure-html/unnamed-chunk-4-3.png | Bin 232930 -> 229825 bytes .../figure-pdf/unnamed-chunk-2-1.pdf | Bin 9288 -> 9305 bytes .../figure-pdf/unnamed-chunk-4-3.pdf | Bin 15776 -> 15789 bytes units/unit9-sim.qmd | 37 +++++++++--------- 7 files changed, 22 insertions(+), 23 deletions(-) diff --git a/_freeze/units/unit9-sim/execute-results/html.json b/_freeze/units/unit9-sim/execute-results/html.json index 7e711e0..693be98 100644 --- a/_freeze/units/unit9-sim/execute-results/html.json +++ b/_freeze/units/unit9-sim/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "cbdd8f803c0d8aea56b6058ac9fdf84e", + "hash": "73dd2ece761033d701277fa08bc75ad5", "result": { - "markdown": "---\ntitle: \"Simulation\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-17\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\n---\n\n::: {.cell}\n\n:::\n\n\n\n[PDF](./unit9-sim.pdf){.btn .btn-primary}\n\n\nReferences:\n\n- Gentle: Computational Statistics\n- Monahan: Numerical Methods of Statistics\n\nMany (most?) statistical papers include a simulation (i.e., Monte Carlo)\nstudy. Many papers on machine learning methods also include a simulation\nstudy. The basic idea is that closed-form mathematical analysis of the properties of\na statistical or machine learning method/model is often hard to do. Even\nif possible, it usually involves approximations or simplifications. A\ncanonical situation in statistics is that we have an asymptotic result\nand we want to know what happens in finite samples, but often we do not\neven have the asymptotic result. Instead, we can estimate mathematical\nexpressions using random numbers. So we design a simulation study to\nevaluate the method/model or compare multiple methods. The result is\nthat the researcher carries out an experiment (on the computer, sometimes called *in silico*), generally varying\ndifferent factors to see what has an effect on the outcome of interest.\n\nThe basic strategy generally involves simulating data and then using the\nmethod(s) on the simulated data, summarizing the results to\nassess/compare the method(s).\n\nMost simulation studies aim to approximate an integral, generally an\nexpected value (mean, bias, variance, MSE, probability, etc.). In low\ndimensions, methods such as Gaussian quadrature are best for estimating\nan integral but these methods don't scale well, so in higher dimensions (e.g., the usual situation with $n$ observations) we\noften use Monte Carlo techniques.\n\nTo be more concrete:\n\n- If we have a *method for estimating a model parameter* (including\n estimating uncertainty), such as a regression coefficient, what properties do\n we want the method to have and what criteria could we use?\n\n- If we have a *prediction method* (including prediction uncertainty),\n what properties do we want the method to have and what criteria\n could we use?\n\n- If we have a *method for doing a hypothesis test*, what criteria\n would we use to assess the hypothesis test? What properties do we\n want the test to have?\n\n- If we have a *method for finding a confidence interval or a prediction interval*, what\n criteria would we use to assess the interval?\n\n\n# 1. Monte Carlo considerations\n\n## Motivating example\n\nLet's consider linear regression, with observations\n$Y=(y_{1},y_{2},\\ldots,y_{n})$ and an $n\\times p$ matrix of predictors/covariates/features/variables\n$X$, where\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. If we assume that we have\n$EY=X\\beta$ and $\\mbox{Var}(Y)=\\sigma^{2}I$, then we can determine\nanalytically that we have $$\\begin{aligned}\nE\\hat{\\beta} & = & \\beta\\\\\n\\mbox{Var}(\\hat{\\beta})=E((\\hat{\\beta}-E\\hat{\\beta})^{2}) & = & \\sigma^{2}(X^{\\top}X)^{-1}\\\\\n\\mbox{MSPE}(Y^{*})=E(Y^{*}-\\hat{Y})^{2}) & = & \\sigma^{2}(1+X^{*\\top}(X^{\\top}X)^{-1}X^{*}).\\end{aligned}$$\nwhere $Y^{*}$is some new observation we'd like to predict given $X^{*}$.\n\nBut suppose that we're interested in the properties of standard regression\nestimation when in reality the mean is not linear in $X$ or the\nproperties of the errors are more complicated than having independent\nhomoscedastic errors. (This is always the case, but the issue is how far\nfrom the truth the standard assumptions are.) Or suppose we have a modified procedure to produce\n$\\hat{\\beta}$, such as a procedure that is robust to outliers. In those\ncases, we cannot compute the expectations above analytically.\n\nInstead we decide to use a Monte Carlo estimate. To keep the notation\nmore simple, let's just consider one element of the vector $\\beta$\n(i.e., one of the regression coefficients) and continue to call that\n$\\beta$. If we randomly generate $m$ different datasets from some\ndistribution $f$, and $\\hat{\\beta}_{i}$ is the estimated coefficient\nbased on the $i$th dataset: $Y_{i}=(y_{i1},y_{i2},\\ldots,y_{in})$, then\nwe can estimate $E\\hat{\\beta}$ under that distribution $f$ as\n$$\\hat{E}(\\hat{\\beta})=\\bar{\\hat{\\beta}}=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}$$\nOr to estimate the variance, we have\n$$\\widehat{\\mbox{Var}}(\\hat{\\beta})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-\\bar{\\hat{\\beta}})^{2}.$$\nIn evaluating the performance of regression under non-standard\nconditions or the performance of our robust regression procedure, what\ndecisions do we have to make to be able to carry out our Monte Carlo\nprocedure?\n\nNext let's think about Monte Carlo methods in general.\n\n## Monte Carlo (MC) basics\n\n### Monte Carlo overview\n\nThe basic idea is that we often want to estimate\n$\\phi\\equiv E_{f}(h(Y))$ for $Y\\sim f$. Note that if $h$ is an indicator\nfunction, this includes estimation of probabilities, e.g., for a scalar\n$Y$, we have\n$p=P(Y\\leq y)=F(y)=\\int_{-\\infty}^{y}f(t)dt=\\int I(t\\leq y)f(t)dt=E_{f}(I(Y\\leq y))$.\nWe would estimate variances or MSEs by having $h$ involve squared terms.\n\nWe get an MC estimate of $\\phi$ based on an iid sample of a large number\nof values of $Y$ from $f$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i}),$$ which is justified by\nthe Law of Large Numbers:\n$$\\lim_{m\\to\\infty}\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=E_{f}h(Y).$$\n\nNote that in most simulation studies, $Y$ is an entire dataset (predictors/covariates), and the \"iid\nsample\" means generating $m$ different datasets from $f$, i.e.,\n$Y_{i}\\in\\{Y_{1},\\ldots,Y_{m}\\}$ not $m$ different scalar values. If the\ndataset has $n$ observations, then $Y_{i}=(Y_{i1},\\ldots,Y_{in})$.\n\n#### Back to the regression example\n\nLet's relate that back to our regression example. In that particular\ncase, if we're interested in whether the regression estimator is biased,\nwe want to know: $$\\phi=E\\hat{\\beta},$$ where $h(Y) = \\hat{\\beta}(Y)$. We can use the Monte Carlo\nestimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}=\\widehat{E(\\hat{\\beta})}.$$\n\nIf we are interested in the variance of the regression estimator, we have\n\n$$\\phi=\\mbox{Var}(\\hat{\\beta})=E_{f}((\\hat{\\beta}-E\\hat{\\beta})^{2})$$\nand we can use the Monte Carlo estimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-E\\hat{\\beta})^{2}=\\widehat{\\mbox{Var}(\\hat{\\beta)}}$$\nwhere $$h(Y)=(\\hat{\\beta}-E\\hat{\\beta})^{2}.$$\n\nFinally note that we also need to use the Monte Carlo estimate of\n$E\\hat{\\beta}$ in the Monte Carlo estimation of the variance.\n\nWe might also be interested in the coverage of a confidence interval. In\nthat case we have $$h(Y)=1_{\\beta\\in CI(Y)}$$ and we can estimate the\ncoverage as\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}1_{\\beta\\in CI(y_{i})}.$$\nOf course we want that $\\hat{\\phi}\\approx1-\\alpha$ for a $100(1-\\alpha)$\nconfidence interval. In the standard case of a 95% interval we want\n$\\hat{\\phi}\\approx0.95$.\n\n### Simulation uncertainty (i.e., Monte Carlo uncertainty)\n\nSince $\\hat{\\phi}$ is simply an average of $m$ identically-distributed\nvalues, $h(Y_{1}),\\ldots,h(Y_{m})$, the simulation variance of\n$\\hat{\\phi}$ is $\\mbox{Var}(\\hat{\\phi})=\\sigma^{2}/m$, with\n$\\sigma^{2}=\\mbox{Var}(h(Y))$. An estimator of\n$\\sigma^{2}=E_{f}((h(Y)-\\phi)^{2})$ is $$\\begin{aligned}\n\\hat{\\sigma}^{2} & = & \\frac{1}{m-1}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}\\end{aligned}$$\nSo our MC simulation error is based on\n$$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\frac{\\hat{\\sigma}^{2}}{m}=\\frac{1}{m(m-1)}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}.$$\nNote that this is particularly confusing if we have\n$\\hat{\\phi}=\\widehat{\\mbox{Var}(\\hat{\\beta})}$ because then we have\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$!\n\nThe simulation variance is $O(\\frac{1}{m})$ because we have $m^{2}$ in\nthe denominator and a sum over $m$ terms in the numerator.\n\nNote that in the simulation setting, the randomness in the system is\nvery well-defined (as it is in survey sampling, but unlike in most other\napplications of statistics), because it comes from the RNG that we\nperform as part of our attempt to estimate $\\phi$. Happily, we are in\ncontrol of $m$, so in principle we can reduce the simulation error to as\nlittle as we desire. Unhappily, as usual, the simulation standard error goes down\nwith the square root of $m$.\n\n> **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([7., 1., 5., 3., 2., 3., 4., 4., 2., 2., 5., 2., 1., 4., 7., 5., 5.,\n 5., 2., 5., 7., 4., 4., 7., 4.]), array([0.01909301, 0.05792482, 0.09675663, 0.13558843, 0.17442024,\n 0.21325205, 0.25208386, 0.29091567, 0.32974748, 0.36857929,\n 0.40741109, 0.4462429 , 0.48507471, 0.52390652, 0.56273833,\n 0.60157014, 0.64040194, 0.67923375, 0.71806556, 0.75689737,\n 0.79572918, 0.83456099, 0.8733928 , 0.9122246 , 0.95105641,\n 0.98988822]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-html/unnamed-chunk-4-3.png){width=960}\n:::\n:::\n\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nRecently [O'Neal proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she propose to use some of the initial bits (which behave the most randomly) to either shift bits by a random amount or rotate bits by a random amount. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^64$ and $2^32$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0 **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([ 5., 3., 2., 2., 6., 3., 2., 10., 3., 2., 5., 7., 4.,\n 3., 6., 4., 4., 4., 3., 5., 4., 0., 7., 1., 5.]), array([0.01856533, 0.05655676, 0.09454819, 0.13253961, 0.17053104,\n 0.20852247, 0.2465139 , 0.28450533, 0.32249675, 0.36048818,\n 0.39847961, 0.43647104, 0.47446247, 0.51245389, 0.55044532,\n 0.58843675, 0.62642818, 0.66441961, 0.70241103, 0.74040246,\n 0.77839389, 0.81638532, 0.85437675, 0.89236817, 0.9303596 ,\n 0.96835103]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-html/unnamed-chunk-4-3.png){width=960}\n:::\n:::\n\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0 **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([1., 3., 3., 3., 4., 5., 2., 3., 2., 5., 7., 2., 5., 8., 3., 5., 4.,\n 2., 5., 5., 3., 8., 5., 0., 7.]), array([0.01933199, 0.05834222, 0.09735246, 0.1363627 , 0.17537293,\n 0.21438317, 0.2533934 , 0.29240364, 0.33141388, 0.37042411,\n 0.40943435, 0.44844459, 0.48745482, 0.52646506, 0.56547529,\n 0.60448553, 0.64349577, 0.682506 , 0.72151624, 0.76052647,\n 0.79953671, 0.83854695, 0.87755718, 0.91656742, 0.95557766,\n 0.99458789]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-pdf/unnamed-chunk-4-3.pdf){fig-pos='H'}\n:::\n:::\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nRecently [O'Neal proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she propose to use some of the initial bits (which behave the most randomly) to either shift bits by a random amount or rotate bits by a random amount. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^64$ and $2^32$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0 **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([4., 5., 3., 1., 5., 8., 5., 3., 4., 3., 5., 5., 2., 5., 5., 2., 7.,\n 3., 1., 2., 6., 4., 4., 3., 5.]), array([0.00336545, 0.04319666, 0.08302787, 0.12285908, 0.16269029,\n 0.2025215 , 0.24235271, 0.28218392, 0.32201513, 0.36184634,\n 0.40167755, 0.44150876, 0.48133996, 0.52117117, 0.56100238,\n 0.60083359, 0.6406648 , 0.68049601, 0.72032722, 0.76015843,\n 0.79998964, 0.83982085, 0.87965206, 0.91948327, 0.95931448,\n 0.99914569]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-pdf/unnamed-chunk-4-3.pdf){fig-pos='H'}\n:::\n:::\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):03ESXEM;3Bj4(WZaQ)lpqZ`j%zqn$_io1o| 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%0ArEB(&TRXR@x0_6h2g70`lC#Yw1 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 literal 32099 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

Q)qey&c&VD<5J1Bmi{6vhmjEpKH-p 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

y#31;r@)~zZAnOAeF=#ytUU#23+eF(LB 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 Jw2fBB{s9VJyt@DZ diff --git a/_freeze/units/unit9-sim/figure-html/unnamed-chunk-4-3.png b/_freeze/units/unit9-sim/figure-html/unnamed-chunk-4-3.png index b033533ed9e4ee1dad81c6b80204658f0c8c21b3..11ccac8e2b33bf76308b9c0f7d5919f4969a77ea 100644 GIT binary patch literal 229825 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�N@DoRfLGjaa8A*Yp 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%0D#vz!NQ&@q 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 literal 232930 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 z%0AFgA>5DN?vq$6z1@7Yvo^X~qNOoR_Gl@rwZk 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 PL~B0#_{twX|MPzW%9KE| diff --git a/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-2-1.pdf b/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-2-1.pdf index 3af00af1cd0bf036b0bd0fd9e15050f7b288deea..71ab389dd444d94cc34379377cb7ea132842fbbc 100644 GIT binary patch delta 3247 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 delta 3244 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 DRdb*< diff --git a/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-4-3.pdf b/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-4-3.pdf index ccf79e1f9a7c6cdbef4186f43faac0f5e3ae5159..b7f57bf22682c9f274962f785f1c24080743287f 100644 GIT binary patch delta 6080 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 AQ~&?~ delta 6067 zcmZu#cQl;e+C>oEh#FnA48kyDX7pY{5Ot6cC4wl?f<$@s5jCPFWQ-a_bkTc@UJ{HR zhKT49BuZTQeRr*UZ+!1xXYIB3^XzAzbJkhwedmYuD@!5-p!_$`yJ;-mIF5t%MUvo| z7>?OE!ppYD3&$BrM*MTl#tV}$TV^^%;Rd6Z;FUei#|pe9MDh;btFfbi`+@zJ+$byVBXUl776oho~72v}1NkK>!9W3n#k= z$1C)EYv0i;gQ+!VPd$&nxyY zCW@)DB_y`d`Z2^5@STw;OppkfI&p34$Qms;okcLDbSu%2p;WI~nc#_lBF)>LSJ71e zD6VwIj4VXT|DquLPEY6$dE1F(`KgY)zu9EL!&MAxjw+R;$Gfw6nuiA0b#>XL8BzGJ z?gHt*kLS1+0_zoxZpHKq0>Hh@FC{~zW;^kr>cRa|FEFC^rqTN08D`YZ6vL#AYn@pW zg8frCN+v_%^{UE+o2wgLrI6ns+boOMq%y^uJuWpLN zt$7@6uHnI`VDS~3IN@G26lKnJ_gU#Ll6ww&uPkzTNlnY-_Oj2d^O@~W={5h}>Z$q2 zmI_{cVyY$-y%)Ie`fG9Xd&A1yQi>RJgL;1XxHNH*2#r=NB={%=Ux9DZB+5Lp{msVmBk^a=6 zt0&VMFHRq3pn0rydM{lKQ4;Br zc5O~5$ZkRi!--ijooR8~kw%}ghou>X)ta1%hLuKm%KfZR675iG3c7YuTeUSexG#j_ zs_B&~pSDk{i!+dS1lFDJ=6mX^o~O4p;6e_Q#`#Z3!mB2%#X`YU=})My0svcbGvnnW z&f+}Nyw&j}c5GI>sU>rOiL^+0t2~t!U%U>*kbMBHjr;cxR%Q#CP|JHsG?i3&Vc8A# zR3`7n`lARa?sPn`4RtYCYf|APD^YwEBa&3fl02_*tJ=*^Gx7E<)!zwT=H5(VtjVAS zZ3~?TvJP>1${D7-CWC8xgfjs7-XMeiX(l@FW2AE4uXEgH1(iQpU26cyT19!}(_vDOq`N>l(!Ch-Lfzj8eO-tG z&d?vq*gK+~`leMTiuew&5-b3Jv1K~g8Ypp#Sp0*2q82*!Nimx@zlT)fVKRoUr4{>C z8vEjAeFn{)p3h;MAvf9xtkm?^t}9!y;c|lZ-6tS@&qaN~o?P>pRxCE-JfP<$ji#UH z$~;*DgYG46eeJ>wv=V>sa0?ydJuGNl5XnyNc_01a@C6eva5sPvK1GF%_gsmR^BYnmYUAXnl)G^)p}p(f!o_QBId!4g5qrH zl#Yp&`{mXswe8qmCWG!fmHG6p7_3#8 z4-a+=@wU59y%^KC0lGVDbt`)I`citYlk~L?Dhu5-|0ylNXJj2x(7p7@hVU_?YV<^; zKi+!VO@RF9X+9tEJwprW*0zum0Tm|F4>^&~-75LUacN1Qk2&wUxngb#(N)G#y}7fYo3wlfjKZ{Yyh!Om^QI` zfS%KbGOT8^dC&PXIsUyV#rlB?!xy4;!fM}E{+$r=o?1X*iN*Ib`yr0g!4T8bR^ZRL zUl#SmUuHiL;^~X^_SYoHfF~8ZikfZTYdPLs-|kkfR)X<%+Ol?bcyW+U(NpzqR!lC& zO?`T!Ku~4V}p+yu#g(;|r0{D*I^pToG4W zk+EAapuo~pc;))t&?Qy(Fo8BjnN&qkpzMUOZg zRvD(Pcf;o`o%vNFA~sFoDI{}gW24L{H#B9Y^TG5k_Aq>maZYK_WrU{SSNU-a<9u)t zh`t)jL|+i)-{C_g39fE2u@GwQ0F=qcjF4pR6r+Z8oDNFQnm(=46$!U@Oppdp_gjsP zvKfV;n}}Z_3>QK<1&qQp*1JGj`cFnWYNK{QkBG)|wFEyGkkP783S<|cj!e{v4@e#6 zt4tnb3Q#YSZ)D?UuX8jhY4}!ky^ZxzbYGQehk9k)Rh4}?y>5chd^oU!krxotgI1Hv@LMPB{0O2 z*^zRT8w88IJQHIeSMc2VTduO~EN5D}zQw3y>n7t8kB~_j?)}&(3oH_SN;W(0X~KP;!$EqAaa!nS zaNnL${ZP;3xc7~1G9nKR)VYeiLh`8R+qlYIly2}?ldv_ac!o0;KIsX|Fkj?Q2N%C6 z^$T&Z6lzpKYb<%@Hv?#_=pu)t!zcT3g2TR47T)%>(zoRCht%`IS$AMP;}HFdI*RSG zUFz=0?Ar;P3!gdqw@Mgd^UA*%w#)21&U>T9?3EwpgIl#P+uN5UDMI*O7PU1LqFCmo zJlCn(ybx^%Wi*TzkP<&>DieIgC9yF*8TVfty0fp8zIhiX=zP1YP-&rL0~ z#uciNeKZL5adfgh zi6@P5pg=xAu@(08?ltpra(Y7&AK6nTMh}bo0{Ns{*GGc*-VQ^>CEd`zs292UVhNBfRv8J zF{#uMziSKIu@3caE#fXgxx73l;Gxz|!ch=_;-f*h_vfdONo=`(S~6=D{u$p))YpFs zD^Gk!L5ZVsBvB6NJjU!SBZ&$F74I^aXRF+NP_U!}7NnuuYxHy-2cpy;@KsB+4BeD% zWs4^uwG`*!Jk;n6{X8h8TA@(BD6`#yC-FzWB+~6OJ(OtP+v+(!`;D*O(Un;SB32*O z8glF(BUMet57%>MZf9}ah(x1gZ=jD!u#@BM3IocVL*|?h_H9Q>D2uN)H-kS$yyvFL z%IJRxd)%$skYS$4>BE^(@p$WDb(Wn>(3rOPTFE!f|HCm;(i0&%@8B8U`EQ@D&As|j zyKY@R>1DG2&6YD!AWV1D9;mP2-Sjwr1a@56hE4D#W^6gjc(byI6M6ew3*GX|I@p&g z2RHndzv3N%qgo>RpD*h;T6ub}p}A z*LH1s6?RAblt4o}b4~9}W=n%`2Jc8dmjPZ|h8LsZN{i2YmF5I20PLMFT~RzKRlALk zT*k%^UB*c284q5oh&b9>rjqCLacP8WEUkE@8`mwc+x7ZgU&Djzs-;qOT`RBMrgGF~ z`%q%a7Oy31cNO=i*ooE4nbJxzOr6AbgbkJE|-kKkk2okJ77bEZv9%| zZSPzQz4DuM*CU)62LMj_BVUOw`08{%5=_(;Mz#c!o&E>w56YnS%{*tSW=g^7HcGQc|z1~SdA(NJUr2;M*2Q0gzD(I27?$# z1acj2ky%>y{O+yhAjKzj(bf(sN?T{%A8ah<(Xb(6MkTe7n|Ktx!# z&fcua{iGa2~AppuT-{cPsfNuN>a&1VH&)kXy0Pmxk)5qz+j`QyW z$FtN;x7{W`{ETA;#@7|?EW#iM@ z$xi{Y!iTr;!a@kJ=cI6=H_`>zuw|1gwVWsoL&Rz<{h`*ahwC8Nkq6=m1cP5`e!LpU z-_>lycvOmxyxU2iyx8;``6PhK5jJNEUig|98qAl8ZId{14G zk2dh`(MK84k7kM~THa}$#08?>#R~R(OBCI5q3u(YN~(Ww&anjood;%CpU#!*y^5SP zbe$ln-$m&}?44V8t{AMV*U>Ek;gp<^8Hj^j=R}vW6&DW!(mo!~uEl}!_%}Hx@@t>{ z&!qcw`gT-qUSm*!IpV?dhc}t^i2k(TE0xWVJJ+RH;NPaN^|6_sY2pe$JeNF|F4vcS zI_?#xP*9?psDl{U$gG9Q0ry0h)?>OTPM7f-5mw^h0mnjvxR<;oyZ#e7np&ksr@d1- z07D>Ew;qnvXC~1Y(oK5Ea8VZ_YaYQ&6PdB*zX^cM|FJciJ>{b$8ibwY|dKS zN@u8Md|!!g;Nim+>~Hm6;ru@D)EE29^Z~|0tnq#qt*N9!Aa2cmMg9{F+i@WVxe{O2 z5E1fYKumv_hVZnUz^~@~--m4+~=>&czGbAj~xjKRqGoB4#;OIv= z!J27MQ|CF_-|R{F^HMVT@alkH6IUQ;6WUUChQg>0TW{^E`W(l2%hO_pvWKtG#2mIP z=;kZ{9jF?BXuS#KlSskDK?IYi1Tz)!UWP!VpfD&Raa!t@y`+>BH{{R9?aEE@&q5pq zgGgS)poj~YBouxTll*^p2xMZcv@{VMnb<2W0KhIVpb#kX?@AI#sQ3j8inySKL8SiX zK_ubGzw1FHk^goJ{AW~%q?F{}<3r%$5a?fxA#fP-B8Irw1Obtf_*;vBiNpRI1OB9Z zuDw7+N Date: Tue, 24 Oct 2023 11:39:38 -0700 Subject: [PATCH 02/17] update unit 10 --- .../unit10-linalg/execute-results/html.json | 4 +- .../unit10-linalg/execute-results/tex.json | 4 +- units/unit10-linalg.qmd | 56 ++++++++++++++----- 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/_freeze/units/unit10-linalg/execute-results/html.json b/_freeze/units/unit10-linalg/execute-results/html.json index 96365dd..8c2fe8d 100644 --- a/_freeze/units/unit10-linalg/execute-results/html.json +++ b/_freeze/units/unit10-linalg/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "740016d80c59b631f7fca3df0d936ca1", + "hash": "d1e8e71359879fb511c4018fa4d218a0", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-07-26\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n::: {.cell}\n\n:::\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\n$\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise. One commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum.\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a matrix in which all of the\ncolumns are orthogonal to each other and normalized. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-5.551115123125783e-16\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the second\napproach is faster in R. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be cognizant of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det() to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n::: {.cell}\n\n:::\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a matrix in which all of the\ncolumns are orthogonal to each other and normalized. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $z = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.1102230246251565e-15\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/units/unit10-linalg/execute-results/tex.json b/_freeze/units/unit10-linalg/execute-results/tex.json index c769b1e..b59ed10 100644 --- a/_freeze/units/unit10-linalg/execute-results/tex.json +++ b/_freeze/units/unit10-linalg/execute-results/tex.json @@ -1,7 +1,7 @@ { - "hash": "740016d80c59b631f7fca3df0d936ca1", + "hash": "d1e8e71359879fb511c4018fa4d218a0", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-07-26\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n::: {.cell}\n\n:::\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\n$\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise. One commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum.\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a matrix in which all of the\ncolumns are orthogonal to each other and normalized. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.440892098500626e-16\n```\n:::\n:::\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the second\napproach is faster in R. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be cognizant of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det() to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n::: {.cell}\n\n:::\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a matrix in which all of the\ncolumns are orthogonal to each other and normalized. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $z = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-3.3306690738754696e-16\n```\n:::\n:::\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/units/unit10-linalg.qmd b/units/unit10-linalg.qmd index 02415ed..bcd3f90 100644 --- a/units/unit10-linalg.qmd +++ b/units/unit10-linalg.qmd @@ -1,7 +1,7 @@ --- title: "Numerical linear algebra" author: "Chris Paciorek" -date: "2023-07-26" +date: "2023-10-24" format: pdf: documentclass: article @@ -179,18 +179,26 @@ them implicit. Ask me if it's not clear. ## Norms -$\|x\|_{p}=(\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean) +For a vector, $\|x\|_{p}=(\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean) norm is $\|x\|_{2}=\sqrt{\sum x_{i}^{2}}=\sqrt{x^{\top}x}$, just the length of the vector in Euclidean space, which we'll refer to as -$\|x\|$, unless noted otherwise. One commonly used norm for a matrix is +$\|x\|$, unless noted otherwise. + +One commonly used norm for a matrix is the Frobenius norm, $\|A\|_{F}=(\sum_{i,j}a_{ij}^{2})^{1/2}$. -In this Unit, we'll make use of the **induced matrix norm**, which is +In this Unit, we'll often make use of the **induced matrix norm**, which is defined relative to a corresponding vector norm, $\|\cdot\|$, as: $$\|A\|=\sup_{x\ne0}\frac{\|Ax\|}{\|x\|}$$ So we have $$\|A\|_{2}=\sup_{x\ne0}\frac{\|Ax\|_{2}}{\|x\|_{2}}=\sup_{\|x\|_{2}=1}\|Ax\|_{2}$$ If you're not familiar with the supremum ("sup" above), you can just -think of it as taking the maximum. +think of it as taking the maximum. In the case of the 2-norm, the norm turns +out to be the largest singular value in the singular value decomposition (SVD) +of the matrix. + +We can interpret the norm of a matrix as the most that the matrix +can stretch a vector when multiplying by the vector (relative to the +length of the vector). A property of any legitimate matrix norm (including the induced norm) is that $\|AB\|\leq\|A\|\|B\|$. Also recall that norms must obey the triangle @@ -438,6 +446,10 @@ produced as a linear combination of eigenvectors as basis vectors, with the variance attributable to the basis vectors determined by the eigenvalues. +To go the other direction, we can project a vector $y$ onto the space +spanned by the eigenvectors: $z = (\Gamma^{\top}\Gamma)^{-1}\Gamma^{\top}y = \Gamma^{\top}y$, +where the simplification of course comes from $\Gamma$ being orthogonal. + If $x^{\top}Ax\geq0$ then $A$ is nonnegative definite (also called positive semi-definite). In this case one or more eigenvalues can be zero. Let's interpret this a bit more in the context of generating @@ -612,8 +624,8 @@ but the first might be better for row-major matrices (so might be how we would implement in C) and the second for column-major (so might be how we would implement in Fortran). -**Challenge**: check whether the second -approach is faster in R. (Write the code just doing the outer loop and +**Challenge**: check whether the first +approach is faster in Python. (Write the code just doing the outer loop and doing the inner loop using vectorized calculation.) #### General computational issues @@ -662,7 +674,7 @@ xPerturbed = np.linalg.solve(A, bPerturbed) What's going on? Some manipulations with inequalities involving the induced matrix norm (for any chosen vector norm, but we might as well -just think about the Euclidean norm) (see Gentle-CS Sec. 5.1) give +just think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give $$\frac{\|\delta x\|}{\|x\|}\leq\|A\|\|A^{-1}\|\frac{\|\delta b\|}{\|b\|}$$ where we define the condition number w.r.t. inversion as $\mbox{cond}(A)\equiv\|A\|\|A^{-1}\|$. We'll generally work with the @@ -746,7 +758,7 @@ with np.printoptions(suppress=True): The basic story is that simple strategies often solve the problem, and -that you should be cognizant of the absolute and relative magnitudes +that you should be aware of the absolute and relative magnitudes involved in your calculations. One rule of thumb is to try to work with numbers whose magnitude is @@ -1438,7 +1450,7 @@ Often we will have the factorization as a result of other parts of the computation, so we get the determinant for free. We can use `np.linalg.logdet()` or (definitely not recommended) -`np.linalg.det() to calculate the determinant in Python. +`np.linalg.det()` to calculate the determinant in Python. These functions use the LU decomposition. @@ -1546,6 +1558,9 @@ where $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$ is the rank of $A$ (which is at most the minimum of $n$ and $m$ of course). The diagonal elements of $D$ are the singular values. +That representation is as the sum of rank-one matrices (since +each term is the scaled outer product of two vectors). + If $A$ is positive semi-definite, the eigendecomposition is an SVD. Furthermore, $A^{\top}A=VD^{2}V^{\top}$ and $AA^{\top}=UD^{2}U^{\top}$, so we can find the eigendecomposition of such matrices using the SVD of @@ -1565,13 +1580,23 @@ a pseudo-inverse ($A^{+}=VD^{+}U^{\top})$. We can use the SVD to approximate $A$ by taking $A\approx\tilde{A}=\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\top}$ for $p Date: Wed, 25 Oct 2023 09:42:28 -0700 Subject: [PATCH 03/17] add ps6 and minor edit to unit 10 --- .../unit10-linalg/execute-results/html.json | 4 +- .../unit10-linalg/execute-results/tex.json | 4 +- ps/ps6.qmd | 93 +++++++++++++++++++ schedule.md | 1 + units/unit10-linalg.qmd | 5 +- 5 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 ps/ps6.qmd diff --git a/_freeze/units/unit10-linalg/execute-results/html.json b/_freeze/units/unit10-linalg/execute-results/html.json index 8c2fe8d..68206d1 100644 --- a/_freeze/units/unit10-linalg/execute-results/html.json +++ b/_freeze/units/unit10-linalg/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "d1e8e71359879fb511c4018fa4d218a0", + "hash": "0898502e36877c05b5b0f84a868d5a42", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n::: {.cell}\n\n:::\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a matrix in which all of the\ncolumns are orthogonal to each other and normalized. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $z = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.1102230246251565e-15\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n::: {.cell}\n\n:::\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $z = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-2.220446049250313e-16\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/units/unit10-linalg/execute-results/tex.json b/_freeze/units/unit10-linalg/execute-results/tex.json index b59ed10..966bac9 100644 --- a/_freeze/units/unit10-linalg/execute-results/tex.json +++ b/_freeze/units/unit10-linalg/execute-results/tex.json @@ -1,7 +1,7 @@ { - "hash": "d1e8e71359879fb511c4018fa4d218a0", + "hash": "0898502e36877c05b5b0f84a868d5a42", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n::: {.cell}\n\n:::\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a matrix in which all of the\ncolumns are orthogonal to each other and normalized. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $z = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-3.3306690738754696e-16\n```\n:::\n:::\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n::: {.cell}\n\n:::\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $z = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n5.551115123125783e-16\n```\n:::\n:::\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/ps/ps6.qmd b/ps/ps6.qmd new file mode 100644 index 0000000..ef9173e --- /dev/null +++ b/ps/ps6.qmd @@ -0,0 +1,93 @@ +--- +title: "Problem Set 6" +subtitle: "Due Friday Nov. 3, 10 am" +format: + pdf: + documentclass: article + margin-left: 30mm + margin-right: 30mm + toc: false + html: + theme: cosmo + css: ../styles.css + toc: false + code-copy: true + code-block-background: true +execute: + freeze: auto +--- + +## Comments + +- This covers material in Units 8 and 9. +- It's due at 10 am (Pacific) on November 3, both submitted as a PDF to Gradescope as well as committed to your GitHub repository. +- Please see PS1 for formatting and attribution requirements. +- Note that is is fine to hand-write solutions to the the non-coding questions, but make sure your writing is neat and insert any hand-written parts in order into your final submission. + + +## Problems + +1. In class and in the Unit 8 notes, I mentioned that integers as large as $2^{53}$ can be stored exactly in the double precision floating point representation. (Note that for this problem, you don't need to write out `e` in base 2; you can use base 10). + a. Demonstrate how the integers 1, 2, 3, ...,$2^{53}-2$, $2^{53}-1$ can be stored exactly in the $(-1)^{S}\times1.d\times2^{e-1023}$ format where d is represented as 52 bits. I'm not expecting anything particularly formal - just write out for a few numbers and show the pattern. + b. Then show that $2^{53}$ and $2^{53}+2$ can be represented exactly but $2^{53}+1$ cannot, so the spacing of numbers of this magnitude is 2. Finally show that for numbers starting with $2^{54}$ that the spacing between integers that can be represented exactly is 4. Then confirm that what you've shown is consistent with the result of executing $2.0^{53}-1$, $2.0^{53}$, and $2.0^{53}+1$ in Python (you can use base Python floats or numpy). + c. Finally, calculate the relative error in representing numbers of magnitude $2^{53}$ in base 10. (This should, of course, look very familiar, and should be the same as the relative error for numbers of magnitude $2^{54}$ or any other magnitude...) + +2. If we want to estimate a derivative of a function on a computer + (often because it is hard to calculate the derivative analytically), + a standard way to approximate this is to compute: + $$f'(x)\approx\frac{f(x+\epsilon)-f(x)}{\epsilon}$$ for some small + $\epsilon$. Since the limit of the right-hand side of the expression + as $\epsilon\to0$ is exactly $f'(x)$ by the definition of the + derivative, we presumably want to use $\epsilon$ very small from the + perspective of using a difference to approximate the derivative. + + a. Considering the numerator, if we try to do this on a computer, in what ways (there are more than + one) do the limitations of arithmetic on a computer affect our choice of $\epsilon$? (Note that I am ignoring the denominator because that just scales the magnitude of the result and itself has 16 digits of accuracy.) + b. Write a Python function that calculates the approximation and explore how the error in the estimated derivative for some $x$ varies as a function of $\epsilon$ for a (non-linear) function that you choose such that you can calculate the derivative analytically (so that you know the truth). + + +3. Consider multiclass logistic regression, where you have + quantities like this: + $$p_{j}=\text{Prob}(y=j)=\frac{\exp(x\beta_{j})}{\sum_{k=1}^{K}\exp(x\beta_{k})}=\frac{\exp(z_{j})}{\sum_{k=1}^{K}\exp(z_{k})}$$ + for $z_{k}=x\beta_{k}$. Here $p_j$ is the probability that the observation, $y$, is in class $j$. + + a. What will happen if the $z$ values are very large in magnitude (either positive or negative)? + b. How can we reexpress the equation so as to be able to do the calculation even when either of those situations occurs? + +4. Let's consider importance sampling and explore the need to have the +sampling density have heavier tails than the density of interest. +Assume that we want to estimate $\phi=EX$ and $\phi=E(X^{2})$ with +respect to a density, $f$. We'll make use of the Pareto distribution, +which has the pdf $p(x)=\frac{\beta\alpha^{\beta}}{x^{\beta+1}}$ +for $\alpha0$, $\beta>0$. The mean is $\frac{\beta\alpha}{\beta-1}$ +for $\beta>1$ and non-existent for $\beta\leq1$ and the variance +is $\frac{\beta\alpha^{2}}{(\beta-1)^{2}(\beta-2)}$ for $\beta>2$ +and non-existent otherwise. + + a. Does the tail of the Pareto decay more quickly or more slowly than +that of an exponential distribution? + b. Suppose $f$ is an exponential density with parameter value equal +to 1, shifted by two to the right so that $f(x)=0$ for $x<2$. Pretend +that you can't sample from $f$ and use importance sampling where +our sampling density, $g$, is a Pareto distribution with $\alpha=2$ +and $\beta=3$. Use $m=10000$ to estimate $EX$ and $E(X^{2})$ and +compare to the known expectations for the shifted exponential. Recall +that $\mbox{Var}(\hat{\phi})\propto\mbox{Var}(h(X)f(X)/g(X))$. Create +histograms of $h(x)f(x)/g(x)$ and of the weights $f(x)/g(x)$ to +get an idea for whether $\mbox{Var}(\hat{\phi})$ is large. Note if +there are any extreme weights that would have a very strong influence +on $\hat{\phi}$. + c. Now suppose $f$ is the Pareto distribution described above and pretend +you can't sample from $f$ and use importance sampling where our sampling +density, $g$, is the exponential described above. Respond to the +same questions as for part (b), comparing to the known values for +the Pareto. + + +5. Extra credit: This problem explores the smallest positive number that base Python or numpy can represent and how numbers just larger than the smallest positive number that can be represented. + + a. By trial and error, find the base 10 representation of the smallest positive number that can be represented in Python. Hint: it's rather smaller than $1\times10^{-308}$. + + b. Explain how it can be that we can store a number smaller than $1\times2^{-1022}$, which is the value of the smallest positive number that we discussed in class. Start by looking at the bit-wise representation of $1\times2^{-1022}$. What happens if you then figure out the natural representation of $1\times2^{-1023}$? You should see that what you get is actually a very "well-known" number that is not equal to $1\times2^{-1023}$. Given the actual bit-wise representation of $1\times2^{-1023}$, show the progression of numbers smaller than that that can be represented exactly and show the smallest number that can be represented in Python written in both base 2 and base 10. + + Hint: you'll be working with numbers that are not normalized (i.e., denormalized); numbers that do not have 1 as the fixed number before the radix point in the floating point representation we discussed in Unit 8. \ No newline at end of file diff --git a/schedule.md b/schedule.md index e95ed04..013872d 100644 --- a/schedule.md +++ b/schedule.md @@ -9,6 +9,7 @@ Submit your solutions on Gradescope and (for problem sets but not assignments) v | PS 3 [(HTML)](ps/ps3.html) [(PDF)](ps/ps3.pdf) [(code)](ps/ps3start.py) | Wednesday Sep. 27 | 10 am | | PS 4 [(HTML)](ps/ps4.html) [(PDF)](ps/ps4.pdf) | Monday Oct. 9 | 10 am | | PS 5 [(HTML)](ps/ps5.html) [(PDF)](ps/ps5.pdf) | Friday Oct. 27 | 10 am | +| PS 6 [(HTML)](ps/ps6.html) [(PDF)](ps/ps6.pdf) | Friday Nov. 3 | 10 am | Problem set solutions need to follow the rules discussed in Lab 1 (Sep. 1) and documented [here](howtos/ps-submission). diff --git a/units/unit10-linalg.qmd b/units/unit10-linalg.qmd index bcd3f90..7bc9b84 100644 --- a/units/unit10-linalg.qmd +++ b/units/unit10-linalg.qmd @@ -213,8 +213,9 @@ $$\theta=\cos^{-1}\left(\frac{\langle x,y\rangle}{\sqrt{\langle x,x\rangle\langl ## Orthogonality Two vectors are orthogonal if $x^{\top}y=0$, in which case we say -$x\perp y$. An **orthogonal matrix** is a matrix in which all of the -columns are orthogonal to each other and normalized. Orthogonal matrices +$x\perp y$. An **orthogonal matrix** is a square matrix in which all of the +columns are orthogonal to each other and normalized. The same holds for +the rows. Orthogonal matrices can be shown to have full rank. Furthermore if $A$ is orthogonal, $A^{\top}A=I$, so $A^{-1}=A^{\top}$. Given all this, the determinant of orthogonal $A$ is either 1 or -1. Finally the product of two orthogonal From dc4ba3a3f8065bcb936169215e60a4775873925b Mon Sep 17 00:00:00 2001 From: Christopher Paciorek Date: Wed, 25 Oct 2023 12:36:12 -0700 Subject: [PATCH 04/17] update unit 9 to try to get figs --- .../units/unit9-sim/execute-results/html.json | 2 +- .../units/unit9-sim/execute-results/tex.json | 2 +- .../figure-html/unnamed-chunk-2-1.png | Bin 31258 -> 33792 bytes .../figure-html/unnamed-chunk-4-3.png | Bin 229825 -> 229410 bytes .../figure-pdf/unnamed-chunk-2-1.pdf | Bin 9305 -> 9392 bytes .../figure-pdf/unnamed-chunk-4-3.pdf | Bin 15789 -> 15783 bytes 6 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_freeze/units/unit9-sim/execute-results/html.json b/_freeze/units/unit9-sim/execute-results/html.json index 693be98..0549ca1 100644 --- a/_freeze/units/unit9-sim/execute-results/html.json +++ b/_freeze/units/unit9-sim/execute-results/html.json @@ -1,7 +1,7 @@ { "hash": "73dd2ece761033d701277fa08bc75ad5", "result": { - "markdown": "---\ntitle: \"Simulation\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-17\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\n---\n\n::: {.cell}\n\n:::\n\n\n\n[PDF](./unit9-sim.pdf){.btn .btn-primary}\n\n\nReferences:\n\n- Gentle: Computational Statistics\n- Monahan: Numerical Methods of Statistics\n\nMany (most?) statistical papers include a simulation (i.e., Monte Carlo)\nstudy. Many papers on machine learning methods also include a simulation\nstudy. The basic idea is that closed-form mathematical analysis of the properties of\na statistical or machine learning method/model is often hard to do. Even\nif possible, it usually involves approximations or simplifications. A\ncanonical situation in statistics is that we have an asymptotic result\nand we want to know what happens in finite samples, but often we do not\neven have the asymptotic result. Instead, we can estimate mathematical\nexpressions using random numbers. So we design a simulation study to\nevaluate the method/model or compare multiple methods. The result is\nthat the researcher carries out an experiment (on the computer, sometimes called *in silico*), generally varying\ndifferent factors to see what has an effect on the outcome of interest.\n\nThe basic strategy generally involves simulating data and then using the\nmethod(s) on the simulated data, summarizing the results to\nassess/compare the method(s).\n\nMost simulation studies aim to approximate an integral, generally an\nexpected value (mean, bias, variance, MSE, probability, etc.). In low\ndimensions, methods such as Gaussian quadrature are best for estimating\nan integral but these methods don't scale well, so in higher dimensions (e.g., the usual situation with $n$ observations) we\noften use Monte Carlo techniques.\n\nTo be more concrete:\n\n- If we have a *method for estimating a model parameter* (including\n estimating uncertainty), such as a regression coefficient, what properties do\n we want the method to have and what criteria could we use?\n\n- If we have a *prediction method* (including prediction uncertainty),\n what properties do we want the method to have and what criteria\n could we use?\n\n- If we have a *method for doing a hypothesis test*, what criteria\n would we use to assess the hypothesis test? What properties do we\n want the test to have?\n\n- If we have a *method for finding a confidence interval or a prediction interval*, what\n criteria would we use to assess the interval?\n\n\n# 1. Monte Carlo considerations\n\n## Motivating example\n\nLet's consider linear regression, with observations\n$Y=(y_{1},y_{2},\\ldots,y_{n})$ and an $n\\times p$ matrix of predictors/covariates/features/variables\n$X$, where\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. If we assume that we have\n$EY=X\\beta$ and $\\mbox{Var}(Y)=\\sigma^{2}I$, then we can determine\nanalytically that we have $$\\begin{aligned}\nE\\hat{\\beta} & = & \\beta\\\\\n\\mbox{Var}(\\hat{\\beta})=E((\\hat{\\beta}-E\\hat{\\beta})^{2}) & = & \\sigma^{2}(X^{\\top}X)^{-1}\\\\\n\\mbox{MSPE}(Y^{*})=E(Y^{*}-\\hat{Y})^{2}) & = & \\sigma^{2}(1+X^{*\\top}(X^{\\top}X)^{-1}X^{*}).\\end{aligned}$$\nwhere $Y^{*}$is some new observation we'd like to predict given $X^{*}$.\n\nBut suppose that we're interested in the properties of standard regression\nestimation when in reality the mean is not linear in $X$ or the\nproperties of the errors are more complicated than having independent\nhomoscedastic errors. (This is always the case, but the issue is how far\nfrom the truth the standard assumptions are.) Or suppose we have a modified procedure to produce\n$\\hat{\\beta}$, such as a procedure that is robust to outliers. In those\ncases, we cannot compute the expectations above analytically.\n\nInstead we decide to use a Monte Carlo estimate. To keep the notation\nmore simple, let's just consider one element of the vector $\\beta$\n(i.e., one of the regression coefficients) and continue to call that\n$\\beta$. If we randomly generate $m$ different datasets from some\ndistribution $f$, and $\\hat{\\beta}_{i}$ is the estimated coefficient\nbased on the $i$th dataset: $Y_{i}=(y_{i1},y_{i2},\\ldots,y_{in})$, then\nwe can estimate $E\\hat{\\beta}$ under that distribution $f$ as\n$$\\hat{E}(\\hat{\\beta})=\\bar{\\hat{\\beta}}=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}$$\nOr to estimate the variance, we have\n$$\\widehat{\\mbox{Var}}(\\hat{\\beta})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-\\bar{\\hat{\\beta}})^{2}.$$\nIn evaluating the performance of regression under non-standard\nconditions or the performance of our robust regression procedure, what\ndecisions do we have to make to be able to carry out our Monte Carlo\nprocedure?\n\nNext let's think about Monte Carlo methods in general.\n\n## Monte Carlo (MC) basics\n\n### Monte Carlo overview\n\nThe basic idea is that we often want to estimate\n$\\phi\\equiv E_{f}(h(Y))$ for $Y\\sim f$. Note that if $h$ is an indicator\nfunction, this includes estimation of probabilities, e.g., for a scalar\n$Y$, we have\n$p=P(Y\\leq y)=F(y)=\\int_{-\\infty}^{y}f(t)dt=\\int I(t\\leq y)f(t)dt=E_{f}(I(Y\\leq y))$.\nWe would estimate variances or MSEs by having $h$ involve squared terms.\n\nWe get an MC estimate of $\\phi$ based on an iid sample of a large number\nof values of $Y$ from $f$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i}),$$ which is justified by\nthe Law of Large Numbers:\n$$\\lim_{m\\to\\infty}\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=E_{f}h(Y).$$\n\nNote that in most simulation studies, $Y$ is an entire dataset (predictors/covariates), and the \"iid\nsample\" means generating $m$ different datasets from $f$, i.e.,\n$Y_{i}\\in\\{Y_{1},\\ldots,Y_{m}\\}$ not $m$ different scalar values. If the\ndataset has $n$ observations, then $Y_{i}=(Y_{i1},\\ldots,Y_{in})$.\n\n#### Back to the regression example\n\nLet's relate that back to our regression example. In that particular\ncase, if we're interested in whether the regression estimator is biased,\nwe want to know: $$\\phi=E\\hat{\\beta},$$ where $h(Y) = \\hat{\\beta}(Y)$. We can use the Monte Carlo\nestimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}=\\widehat{E(\\hat{\\beta})}.$$\n\nIf we are interested in the variance of the regression estimator, we have\n\n$$\\phi=\\mbox{Var}(\\hat{\\beta})=E_{f}((\\hat{\\beta}-E\\hat{\\beta})^{2})$$\nand we can use the Monte Carlo estimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-E\\hat{\\beta})^{2}=\\widehat{\\mbox{Var}(\\hat{\\beta)}}$$\nwhere $$h(Y)=(\\hat{\\beta}-E\\hat{\\beta})^{2}.$$\n\nFinally note that we also need to use the Monte Carlo estimate of\n$E\\hat{\\beta}$ in the Monte Carlo estimation of the variance.\n\nWe might also be interested in the coverage of a confidence interval. In\nthat case we have $$h(Y)=1_{\\beta\\in CI(Y)}$$ and we can estimate the\ncoverage as\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}1_{\\beta\\in CI(y_{i})}.$$\nOf course we want that $\\hat{\\phi}\\approx1-\\alpha$ for a $100(1-\\alpha)$\nconfidence interval. In the standard case of a 95% interval we want\n$\\hat{\\phi}\\approx0.95$.\n\n### Simulation uncertainty (i.e., Monte Carlo uncertainty)\n\nSince $\\hat{\\phi}$ is simply an average of $m$ identically-distributed\nvalues, $h(Y_{1}),\\ldots,h(Y_{m})$, the simulation variance of\n$\\hat{\\phi}$ is $\\mbox{Var}(\\hat{\\phi})=\\sigma^{2}/m$, with\n$\\sigma^{2}=\\mbox{Var}(h(Y))$. An estimator of\n$\\sigma^{2}=E_{f}((h(Y)-\\phi)^{2})$ is $$\\begin{aligned}\n\\hat{\\sigma}^{2} & = & \\frac{1}{m-1}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}\\end{aligned}$$\nSo our MC simulation error is based on\n$$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\frac{\\hat{\\sigma}^{2}}{m}=\\frac{1}{m(m-1)}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}.$$\nNote that this is particularly confusing if we have\n$\\hat{\\phi}=\\widehat{\\mbox{Var}(\\hat{\\beta})}$ because then we have\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$!\n\nThe simulation variance is $O(\\frac{1}{m})$ because we have $m^{2}$ in\nthe denominator and a sum over $m$ terms in the numerator.\n\nNote that in the simulation setting, the randomness in the system is\nvery well-defined (as it is in survey sampling, but unlike in most other\napplications of statistics), because it comes from the RNG that we\nperform as part of our attempt to estimate $\\phi$. Happily, we are in\ncontrol of $m$, so in principle we can reduce the simulation error to as\nlittle as we desire. Unhappily, as usual, the simulation standard error goes down\nwith the square root of $m$.\n\n> **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([ 5., 3., 2., 2., 6., 3., 2., 10., 3., 2., 5., 7., 4.,\n 3., 6., 4., 4., 4., 3., 5., 4., 0., 7., 1., 5.]), array([0.01856533, 0.05655676, 0.09454819, 0.13253961, 0.17053104,\n 0.20852247, 0.2465139 , 0.28450533, 0.32249675, 0.36048818,\n 0.39847961, 0.43647104, 0.47446247, 0.51245389, 0.55044532,\n 0.58843675, 0.62642818, 0.66441961, 0.70241103, 0.74040246,\n 0.77839389, 0.81638532, 0.85437675, 0.89236817, 0.9303596 ,\n 0.96835103]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-html/unnamed-chunk-4-3.png){width=960}\n:::\n:::\n\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0 **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([ 3., 2., 7., 3., 3., 3., 6., 8., 3., 3., 6., 4., 1.,\n 2., 2., 3., 7., 9., 5., 2., 1., 2., 11., 2., 2.]), array([0.00368613, 0.04298716, 0.08228819, 0.12158922, 0.16089025,\n 0.20019128, 0.23949232, 0.27879335, 0.31809438, 0.35739541,\n 0.39669644, 0.43599747, 0.4752985 , 0.51459954, 0.55390057,\n 0.5932016 , 0.63250263, 0.67180366, 0.71110469, 0.75040573,\n 0.78970676, 0.82900779, 0.86830882, 0.90760985, 0.94691088,\n 0.98621191]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-html/unnamed-chunk-4-3.png){width=960}\n:::\n:::\n\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0 **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([4., 5., 3., 1., 5., 8., 5., 3., 4., 3., 5., 5., 2., 5., 5., 2., 7.,\n 3., 1., 2., 6., 4., 4., 3., 5.]), array([0.00336545, 0.04319666, 0.08302787, 0.12285908, 0.16269029,\n 0.2025215 , 0.24235271, 0.28218392, 0.32201513, 0.36184634,\n 0.40167755, 0.44150876, 0.48133996, 0.52117117, 0.56100238,\n 0.60083359, 0.6406648 , 0.68049601, 0.72032722, 0.76015843,\n 0.79998964, 0.83982085, 0.87965206, 0.91948327, 0.95931448,\n 0.99914569]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-pdf/unnamed-chunk-4-3.pdf){fig-pos='H'}\n:::\n:::\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0 **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([7., 4., 7., 6., 5., 4., 1., 3., 5., 3., 4., 2., 4., 1., 5., 2., 2.,\n 7., 0., 4., 4., 5., 7., 5., 3.]), array([0.03269085, 0.07118632, 0.10968179, 0.14817726, 0.18667273,\n 0.2251682 , 0.26366367, 0.30215914, 0.34065461, 0.37915008,\n 0.41764556, 0.45614103, 0.4946365 , 0.53313197, 0.57162744,\n 0.61012291, 0.64861838, 0.68711385, 0.72560932, 0.76410479,\n 0.80260026, 0.84109574, 0.87959121, 0.91808668, 0.95658215,\n 0.99507762]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-pdf/unnamed-chunk-4-3.pdf){fig-pos='H'}\n:::\n:::\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):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 literal 31258 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%0ArEB(&TRXR@x0_6h2g70`lC#Yw1 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 diff --git a/_freeze/units/unit9-sim/figure-html/unnamed-chunk-4-3.png b/_freeze/units/unit9-sim/figure-html/unnamed-chunk-4-3.png index 11ccac8e2b33bf76308b9c0f7d5919f4969a77ea..28258edee11b20eeff835ae53de18ced477cd808 100644 GIT binary patch literal 229410 zcmeEuby$>Z_wGA`BLdQ;q$mP{lptM#5=tm4Al=>FjD(1!Ae}0RG)RiXAf+N9NJxit zgD}7VbDlxn`}@xC-*c|>&)L`B>NURe#EN^}>s~KA?5?T;F(Dlx1VO|~iZ|6E2pFVm}BF4*W_s;`74$c<591G`+!6F2XijQ0%h%prRA1r!y(+q+^kkZW?4?NRW>b+`o zAI2YJ2VCbPPQ}KMu_35n$=dhGZ;`_lP01{7ov&?-G^ngxO|XCb)OSaLYiRoWMZzIf z4*2P(uRgs+%E+7{YhyKKvR|uzzg_QE(6t`jQS|+h&$_^a{=9OvevDU!gqn5D!`%Gc z9~SGC1DN6$Ga@8sSc1u9|LYgl4A)V7ng99-_e8c3A58gwd`b+bME&mzko8{p|BwEE z3;eMFMU2mSJ#F3tLh$c=nv3dasN8=>5uq|f`QPzJCaV~PI>q-t;!^O;|CvWA@N5Q) zZ*j)Ua>joYAKxT_P%SN|itBf^83GPBlcWQrhDS!6dT!uPeI(*-IoMf_AM{+x%XK{7 zpPz9n@nIAb7w7lcwXIv$TmPscJoXcF%-gVc@fg#HrO(au7b6jwgk0U+SQ0yo&|@C$ z{Ot@u*u7{hs@84U*I@o&xrEm*D(6lj96G>YoMz)SrGN_R

Am+ZiPu>-Fda{q;1Lu1!BI_)bDbz|qd2!m$^@AKNIu8W|Le3NkpHrWM(2p)50O zf>%^k86O|+iyZyx+iaIU{E*vN!CQkm0?{OU4Q_^p)>>kT=B+LhMv z>mGPeMh8LT@|GwGaQGsSj+fskQCNKz9 z<6bMT<6N@EY5z{^u&r&1Khc?-otul#d^m}}nJazt*$tb(t>d^{R6RYQXptQay8wS#MwWM~fe>V~=^SC7;a*IQFVT*RQvR z^ENDaNA?$J&WKO!llbox7))jOtTh1(Ff7!sH)8$M+y)*EHTZp4K7LrBVbq`hux2jB z#u0?U%&$H*56KMGT&K17^V8Geyr-eVpX}02!VR0m6KKq5HGlO3?ECo)`h{~KTm)%; z=MH~d_q@}5&-2E z-ST4TZEcbCPTi7dLvZj<^V@r0Eu@01`raVaXY5C7$l23fDXMIL1Pa$p5sOR(QozCDEfn zUfXk1_3M7TyW>6%XV0EB+~1njdhdK0n#?aK{`g#hDU38=uh~tqL42(SPgCFPa_^#` zs?@$IgWLCepUlfW_ohP2eD|Fp6mP)(9R}ZxCXw~J?Ts~$MtXW7ThtAF#^Ba)T9d9c zQLRRQN&C7@`Cq%c#+cnz5zI>YCb|*J_+GbbyMC}pClt8VZ((({^)Wuv)BCET2w;ge zu9CVy9sBo)v9Ym*_4RgqsSVgD$N=1>bpx<@YJP-w5_xXDyo&;nbKm!9*+4A$3ENN_<5M6rv z`gZp|3SVl{^xFCP9ywCCfx<_x>(*uy4fMU&z@gsyt=p8;5A2Vv`{&kaiZ&k3@}^f+ z3E?9JOxn&`7#hl8>XwT?bnTpf_oL9I^ZFo1_wxF>$M{x4^@|LTCIqde!8!=hE0Xh+ znR~&Tdv9uf_1?MD-MCh}d=Xn`6dnDCP0&$~HSA^{FJ`7qO&JYtKWlxp{iEA|z@tQL zXK&nReHAl)W7j-$uZ3N=y$ayg{AN3|W(GRk;PBP2v`6LUq98xt#of+H1E%Y}LK9v* zZ$DJp^r*t}-r_#)$d&7Q4VtPs>Lk#7?;Tz@!jQmaFF!xOE}sd^c&`gBkM6=RG@7f# zW7sM;KEtJhyV}!VSX0j}ei?lsn5;Lg6dzY#jA1y$ZrCYuc$t&a>V~bb>f0!C@GEe| zw9z}<)YPO+;58^-4R`%^i+1XIi5D?a3A134>8Ih<1rjT~PgPvStHfDquZeWp#sEVH z8P0d5*KD@YJ_===e|F#jlY@+Fam;3sN7S8?<|)AztrwPbpv&|c_-(X6i9_q;Gyr99-$}JF^6Lw6O5VrUo9e{nO%Es_`{-Naj> zAWeBbtX!L!DJm+e`5AlXcC|yz)ahB#a9ZBBk0C@bs1bX#UgouJzG@@6_34u5!D229 z3T1RZ7bUjDF)?!qI6LXLvnd2X5o>1&Wia-Yh`((#;fKEE;J^z_O0IiF&o9TL2gcr+ zh0nWqtc`}@Y6Gq!piod-TU$l952*c;2KdnUPO*nqzAbDLiATcm(A#08s;J^|5pCsR z-CqjKmMrYRG!A^|EoE_gmQZ;OfBAD5d&a{4o zi<@IEc&K{{j1SeNQ*pKcSAN!dF~fID=`1nv%kuK_U!H7nO}SD#S9INfm~l`M)=WL2 zuTWZYcH`@B1os>LO|)9R0zCK4?CbBR-rJw;W~8I*m9l7kMvb%D2A~4ul$4YW>l1^6 z^O&@H^!Nx`wC{}y*HM6@V-I@2^5V1ZJAY`IDMczeNT$ZmwMWuhO)c7~TQADM*mr4X zcf>)u4kSA`f#?2gqSM05(Ao?aT=m)N;8iHoYH=IX%VkA|hK6ny7#tCzvh(*|GatQO z$AAiIrE3XO0qeIY>*%DeyL`cr>`OKtzHc?Y=XF@ST-+>u*es2M?8mV$AwDs&B}`gr zrkscEJ+l7!%YSTpEvyLBbmim9>tG=;IKX5s$CT=uYN=(_Hf=4 z^hDoAM#9U=_(h`d+MSjfSfT^XG54G3qh-U_aNZ?Sb3e_xYvCD8VcNql|owv zM_^T2Nc}hPer|g~sCg;0sPD4Q#5E}ofCxKcg%q<72X6>9Ha9nCM34MS-)iz&^?TUd zSBA(Byx4Zu0CeepO%*29sj_XtoqpYSUOY+2j!xfuF(>w-XXDXsGaw0FOQdOlA-{V0 z=PpeCdsDqwY3zQtj}&?_H#6$Mk?ISE2eC*{X+I{`-EN2d=MHSi!=wYoyq1(|Qv2EK zE~oMF%e;52AsG-|fS{E4=?kT{vPeGk!GY?)A)TDq-T|S=B z^4^;-(BvtSK2`HB4z-JK-jXU9t&P6V!8UGuB+BS!WM*y$1$kzlVdUSeS9-G>Bq=Gm zu(r1AyO!=T{wP{5pCDT5fCE6$rt@}B3LBZM)VWlOa_ zuufvA{(L$9)G;XI;dUccUJV(mnTdbu(T|@J%n=QS3jgR(Uh1t8mbS z<7!%DH27x*M6&hbE=V7z?!gg<#v{kW&33#b*ZSI}{DM+Ia3PcudwMW{-S3lc0fw?N zvLV55F>KR-!}u&>Gmn4eRuX(yVDdV(?$zxBLR-6Ajtj?fUmOR37_wSz1V+xBykl?> zyKZxN>L0f0w2lC6g>l{9bodvSV?e=;KF3}LnYSZRk*}Dez6banjt19dZ>7I#Y-9#i zNeEPBQ3w@?Ai7P{t*`6Ygvh~S+XD_27P0dgKK7AOI1l!IZu5h136;l;JKE;adH}PW zoE(lR;kbPoIN4AD_K06fDk_x8`wWilF|;?GaBiLtg=_754%l6Xy$S4*!C6w$8Nen` zIGR)5B}TM8*C_|+_VHf3^fU;=wmPqE9J!nxwkf&Zpg|$^w*Zh$eii6$0WcgG&!uU+ zJWwREQrf(6jBaEGd3)gr01q5n2hPLM$6K^|!MIZD#O!>bOLU%L)O)$82AE`XI}^*0 zo90Yt-klK%*c<|Qk*LaHg2eD$<9c+!p^0*))EN5u1mLJAUD)pG2tPkR%&=D$1K62E zc4i2$h4WuHpyAdIo;aKn#&J1*5s{}&O-<@0Sy$BasE%h1juD`SMqXyAo$$v@0iG|4 ztM|sXwr5j?>^}Bu8mxMEHDK1lQym)4SC4xa%>SnoVb1RvaICrxGq&CaI!XR(*Iunm zh>3}90AM`hv-aM?m;x0}!~K!FdNdGcL_n2wl~#3B0re>UuqKw~IUV*`zdR=gfnyN3 zZZTmE0}LExn=s`MFek1D4xD<%>KY9|F<{Q${TygOD=I5r78DSb_^sM(;@Bmr#0FGc zyTqBTo;MT)T0tLXjbhy}BAyxuvs%qOJUq#&gxM!B2LVw{;T!xJ);ZS z-W>ggM1Aio2|Rk*+h|X)=LW7Vg*K|H>xsebWI88;a4!9givNCJiEL2MLl0y?x`%#* z0x(&N{BP*^Q|mw~P<)JH6nC776oy0QU1?$E-BRLnmo5TwNdLdf4FprMcX*mMHu#{) zKq4L)A0MBu3OB)$LhqcIp?~+p{pptkj*R?#uD}O6K;US6k8v+{q|(lMys0K~=wNC?r3Z^2=Q&T?k~VEF@H;DeY`d=BFh zX|BCWC)RjL>c_Fx3?4APa;4oVt%fx4-$(!aNpa`y|7!uybVdqN4`5?sEA>C}hETs2 z`<|GEm$~v}I?&g%H>dttN^p9#`5J6A_yziQil_^ld1ngs%(uT*^&G;hdjH?s z&PFBw`P+ZPjPBG)W%%#Uvv2&yp#MJP|NTc}f`RgjV?p%xH85IzPnIaD14|$sU5vlY z0=V(&aOHKM63}4i`fj$0{EU&~vl|xtnkGuA!01NRuo>xKXlj~mzW&!}+1LIn0rF?! zHT9d84X_8FCM;&Z#B0@g@(bCIF4P79HmX%-jKD$L;i6i=M^LLSO4IyJ0`IpcMg7EN zbWcG^odgm`ds#b^PT%0_@^W)tZpO1ndSTpg<6LdwW9= z^BxL6qC3@l1&5@=l{U*xmVW`@lrm)F$bes`psXH1)RR$Q<$Qk*gGvRFK@jo^>;DFoI16zTu^kx-CL|U}}Y9DK5?8mg&}ToW3`B#HCS)dPdFV2+T4C)C)?Q zt6F6HW&eaZ+X*X?0kvETvtr^q4%(pHL*hU29&;dzC?&<&8An`Aq9v=|l#C1xhTd0` zq^1|PZvp+dBTyg=o1YMCeQ@V)INm9_1aws(CW)+8^zrfY-|Iu;c;HFMeC!z;BZhDy zr1Sf%ofSOVG&(4CE9zZrjf5Kr}#lf3$t}_)M(yDd6 z0@SU?DfR8tn!1nOmIpvOOyLwhAWs;0uK=1xG1rwIuI9IN|8Fo%fdW?Yc(6L;5vWW2J0FaHM*ZayY7B*r-<_VS(EpC_~h`1v2(6u&OM0AA{ZiZij$}B{JvHB7g0;U<4OAeY};}m<2RSXyY-d zFKVwYuN_yCL5fr{h5p?*m;*??FbMcxB2!pGqVQ1VE(o;=C-{|m?r_jjz4Y$LUxFEG!Sqe`Xm2(=Js6}10J9@ z4A6yiRUbAtG-xDeaoX?6rDD8YfY=U$fI^fj*Pn9T=0)S*9n=lpLQ#*`*6g9U{?0e~ zR?rZLk=xjbG82WjXrQrOml_xxq+P1~yOf|XAljyjSW@XjK7Gvapmio12w?HY0WIVT zH~n@0p65XlSoP&g7Dxs(qx0K9?!SX&W?(qG!vwTCk^sZM&pmxoUB7CVBL1^wn`&1@L4*49|##k87YR7#~~TeX@O=Eg0vcZMc3-l`m>_KqmFnPUUTOmR0yrUR(CT{F2J*_>P((a z;$4SLL3{03zq6?xQ7wKV!F#d@$FqMNS;rm*1h!d+z}~(-6W_v;lJ0&3(B(d5v|XZa zYCN91LiLO!W3-fV+oEDBoc)~#P!P#v12=&$LEq5m>H~5s2P+Mx2Se}7?kw&CO{L6n z>SOO}rOlu*D5?m^cbYO2wKHf?Qg_^l#Wc>~IPgG;LG+Sd~+m*!@f=aB?eV@tFt#-D+Mip17)4EBJl68&oilQ73#H zTLy(>8YHe}#x@R-I}*6%ggPAYP6E&Bto{#v-P^}-6y>tFi3FW&;0>aMb0P~_O4l`k z$^n2lvRkLzJaS7ISduQW=;(Fv$n0lBokb>w=2?$I*>y*zZri2y{s4deH90^eWfg-N zoIkPPdaMSZT+U1ek;+?Gu)k5ujJgypL7}PZgwQC|dJGC)i(k@-*Mq-DgawMr3rpxf zT~s_nKyt^~Wb)Ic=&MKAsZi!Npfzf*ZZml=yzIqBi%dWL6dexssQYxPR9AQS)9@OL z=BtB{B0PR39L)BPE*xx~HUkr&$1|sNe7>e!Co(u%(%kGX@vodl{|T}yiqG55P@-62 zxI}gE85!XN11<;^DLiiJI}Z9U8wh0-%J{@@_ebstl(5QI{fd5XKOf$j6vZlX$qOCm zQTml6^dF20j>*1H782XMFFQG{Bs(2QFnJDW>@|QjL%8wJpoZ0iV>7WQn6W?*U>`=3 zq(C)RRA&7K*Vd3A;r~yTO7}F7%nF3?7J=j1rA}h*EMf`Jr2!G0cWfMpi;Gw_iOo}B zh@f6u?>HrURkxIckyO|F@V635}XEf{&sX9hHE zr481vxoK6|o`3h~SQ)rzK_n`OTilG)5W}6Na0~8PceiEl=5wO|=ni_x6p1XMb6skN zr=9s3h*_EpU4`UHM1PVM>b|Ei0Ko6G(S-lHyqpry+IF1Ah@&&O$_yCRw3IT)A-Ajm zQ@9CbetN{}$x=+Y#Df2ErL(U5wMHt+5oD=Z72lD?ybgDP9+rtBMp<;Ggy6uik|-5JbA>x+6#yOVY%gKfi|$zWq!AEvt~m$_o!Pim zJ}t$1f_k7)}7Dld1E{ZzHbOub%%Et!n7k zeWqc*eSYTO?~4$ooMWU$wYdLo;;tGltE#|7U^G3or#2?f;X0&jCfgsPON3&D<5E=r za&(hd%P@&oVPWLPl)sxgn$m{_kZK^JLKXHEr)hl;s;g1`H1a$9$Yk>s2Jt*i(>8gH zh5tMs^MJ@wuaOeR;j^WFwz|oV|0N#kl46NcKm!~x`g5hClM{&{_)g9v^>5Sl?Y=2I ziIwbkA3!uTEd6Fw_+Eu{Ovy6rD*|^2e6MuHK$pMmFDr4nqTKv5g{LaN1zs&=7hKH1 zaZx((5d8tGmz*+uzKT)qE@DVlDnd1RpfC z1}`c{nv!x@T z?2naWv|m1i1YpWnLuq<&i2Bv@GLneSEl~w1ATe!bt;717nd=yXAtvB+Ms37Ka0=Bw z{t>O!5N}RNI>#c^bc)Z)+uw1$Lu6@7dg=(feL?6KNjoU0F>IzCsxEL5g9`DO5)~*K z?4)?<0`;-n1GG+PF@EW47dhB9C62b5WOCE3-ch;!guaA-yNq9`#Q+VeY4HIyCwbq9q!+LD32%c&__>=a6kPc94qT9uALN zgo-iCbjkz)0hqnhD-2!jJ~B8zD1x3%2?!az-xbaDszV8*1(`}#&T&3u$vjAJ%yRIQ z*q9hU{%(G_ww~G}De}ZX>KzmMn$wMZ!*B&s!&GWi?N44A1Rp`0gGSB6#^}PuutmkE z1ftlaE-wn^+KVjdoH)TgEY8lXEa4U23d2btDZcCBLMB6O?#;lR)<0Y7{R|_HEK{CN z9QjdJHP({r^+^VQ&_Jk7H`KVH{Cq~TrjmpA%KN!swq@`kQ~VAlR7nz(Vl(3D8jbj{_#bKr_kSE<|x4QoxwaZxOI{aV>IeU4WF z!C~R%M(tTTn_~i0x-g#B>p}&BVMn&B=moG#d@d+q2)@m!^<_+tz)yF*EbDJlTNj^; zh&6Q<*)0^43mFK5WEEsKp}aLa+;Sp)WxpJ;C{s)s0{v=s-Zw9_1G6C4rlJW8@2HV8 zDdL{Q1qVus7fodZY8|GjL6_cy*f&fXMuc6QZW`;hd${%*Z1B@9RuZ`?$F>Ngxett1 zMwBkeR`L+sAodB*?j0gaV{v6D?hRXsQlTwi>u+w*K*37WG{Fx&Gpy;=S#;dJY14-o z7&dR8CXRF>SN?kV$mG4lww8m&PcbV&1Ji=D9X&lYTW!lW}!U^py8DM^o!-xy7R%^vf! z6&0GuZl^}v%d?}dH7zMdJ;!-E{H2o$JZV`9IDw#4SLHzOHSY=5louj(64D8x_c#{gZOG5S>vgV;MSuY+^U?&uw7{8baeLdiL(22)zSyr*1kpYRUp-U8sHV#lXjvc@p@_x|FzYmAKxg@M&z;=+mfI; zrev+N)VRpu1esw^_w!9TnK5NPD>Av}0`)ty+-UgF^yC>ID6Uju&$+rRbVYoS(6E8) zzI2Yi42R9_Bo}{#?9kyso{#?P=-cA)`Z`^ zcYF%)V*4f6+1cY{*5u>ob<6G(j^i83vWl0C)?i=vXv=7EDEgWxh95R6@rlSIN#(7t zeFnW22u?tXnhMXs&)zs77(g_Bf;y^52x zsG&p&Ij~v5R6cI3%=zEi)F&ya-+jp?^AbM9^NY|h;|}os$_)@Wz)reUH;}EjMuKC8 zjjR~~r}`6Bnr=%XGTl9%fDbK2Di?;_hQxI@;+7Vf=v*Q{EZRL%wsFys8L^#Rj6Xxi zFauAjdA>A(H|PG|UI1pxyaKb8K43!a>i@-cLF!&NrVj_rjtO#M#N`GdZT4 z5df8cdEn2^fUv`>}9t|U-V1L6Y3E}}SS&Qq5V#Q}fL#I+LYq<++bnApa zG=ksO6RR|nNLxpsuqG+K)|`L-9d>> z)*ZG;8!3O*ai>WpCuR-PBpy9n#L6K+eRvDm+vlr8;_9%k#I{tU=#RU-`y%=r(;fj6 zRNLhJG(Sk))_w{7yta0yyt5UNK?o8a`I%?U&!7HFZm00oq^Npxx0(zAc|@t(!W^@< z%t%PFnnX|x4g`$v=0bDeK<9QLHq+R6dJp4Pu6l^g#9i8FFFq-nLpy@d5KyXCK;Kg6 z`YzgGE>NO6k;=ngvWsb*o0#7O@DX%%;qu`1&U^ylq*vca%tI>FZWMRP&6wgrS}XlE zn%(YpW*&AMA|Xw zy!P5ITjV@aa=9jTuLY0S{ll8i;0+&+qv9WULsAuzNP1f)Rk2zj*gnB;U~SHN1CUin zIC$?RCsH&+$>kztreAa9<>44A;*T$lK+Oz4$vCh(E=V5bC?QJyBElmdy#7Jxu;|f! z-6gm3Vxqf2N;4JPcX~A@uLO3toQ{mP#-= zmzBcGdA~3wxnyIOTnIC(unhS)ro{Qf4_Yt?<1Rbl^Ksm4~et_X>a+2<60Zxc|PW7!xIJX}^f&P8MwY z65B8na&h>1-pD4oLj~dF>G2+R^2HahQjSQ#M)b~Fac8YIY8=_^kO2LHxjpKoQ=Qes zkGwa^h;h9vve+M4lA&)lGn=40rGiYj%Z;{p3Nzo zg#z`=ucDQ+lT}~_sYsZ|FgooH-{yvB)GHMi5z8z^5fb}-Oyw> zVWf5pB(+^hdik<@0-<5*x1ul zP_4Gd`JSIQoA83z-CtrP-$GSHcBF>kCG;S3Q;6>CwwfotzA}I&;X;p7ZR6WDZKn z5Z;hKc*nns225|CX0#9POxI8B6D9bfc|D!|3`Rry92ZtHVHYxy!O3}9)~^;OpM>f+ zi8na$Hu#{!i7OQ@H^r2(t{Ewoze=6K&}qTGGND+*PEe*Kzi&0@bz8flNtTA)ledkD%70ZTmU-C!Hs|XABz4~-uGG)lB%9NV7_x9EXeoWWe5$?szO@+Dn0V(S! z0CpkKiB_Tq4oK88D;ub+iP>s_`Og6489Lg+Gi#6U6^_jqFJsph`F7M ziLi+`xY0j3bP6=>w2mJiqD_eHUZxUO;+G!HB*$>{P#>X5gp1)rFQ7N@q@lAoqPuy! zu$0ts<`Q7JH|thly3DThdGckC$2qA{eeBezYb@qAjyKr?bjq!iZ93ks(PzVJ^1e|M ztX%&v=Jw%os?*pT=Wjf&ttziU;iRsezMiUs4=k#3xb)m@fs5#YbiI>BghF3Z62s%z zo?;oMnShK#F*9x=2uDMkG5W=WM&v{>o0+T;7P7BoXt%9?GNI;9@tGL3=;OMp$XqyJ zh))z~AVqp+-k&{2trmg{u{R>sA64fVWI|opA@HHz&TQqD>T1)TA4{rp$(+YZE*E@W zSDW^NcQmG@IFWWw2n|0tF({<2n6V&Og7@NhsWxXC3(3)YmSSjwn4ExkJFn=sE17yAzY!^( z*^U}ImGR?yH1p`4Sto{1tamT17&UnI-QOEYVUl?F2H&7=@pDSU?#-7^X{$&|V=7?Z zIye1PEMb!R9Bk9I@+onJ*!$qkF_3X1_~0(44DI)LMqA1H$DjEL;vt@A6=XAZ3CpWH zr7A<+Ny?B#4qPPoT7AZ+o4!6gK|IePA%w4@%Z2U zr0;BzWWlV#F&s_|_|kO_mAhrWO^+Au-pEJ&Jo6&hCSIa#%Wc^{y{NeTKw&9vL#uwQ zXislUQY#UC*`A93agNV!R)h*wskKYM;;xGhTU@2x`z7{fpNxqo*gCJvLaPj|fyt{i zi&%!BeSrsDZn4U)F1`Z0&}rn9FRV}CyEX-8@-3?hF*T|)e65=Fb;XN-5~A3+rEiGS zwq;0vYdPjMZ+DwkceQ-PFHOR=U^rxi?h>{I1|V&&*^slE6C25t?nAz$gEBS?pP zM#N(V3~Qw}B!J@Vu;ynZo-rYowCB1m09n4N@ zkiNAjMv&*qx7bwXivQL*cjr7TbHs@eOxG9DjQ zbHO0|uJk9%(r&JAIW^jyN-HNM+rM7dk{QY8(WFFKxmMM11>HPnE%aTnt)=6@RitJ=-GZcb$Rq0yq<=>fv=hqk-64o%*7QwAu> z)=%Ib$3^3V_%tv1~?UGQPUOB!naI|~QB*vttrq(CF~g8uLu zP4a~W`mPVLBkA1dm2FZBFDBl=(-DrlO*%>Q5GJ9FaJ(Ovd8P+Xgk`4wJii|0HX`&W z@@f;6L@piZguY5tz9c0r8aMJyvw1#jT!pN{_#_PWDvQl>?yBbAPh#7Z!h8K~-H!@U zIve&&{#I0UHkKsl`qIp>bnTs;f;-1>-CQAxOZ#xw^j|4u_`m;3`?))7smUk+l?tN zc|#qiHZIVjR3fiFd+y$i%!hzf=(CaHBfl^H=Hr33k_6&#{GL z8=m_%xAoP}=>pkQ=Y%5a6Gi(r<>@ffst4rXgJ{E}s=jb9`We{Xw1L?*y}Di9v`pVM z(+t=?TB5oWz23}W^0ann}^BsyRcW}i^W6~cpKiN7Y5E=|o^vv5x;Nt~lZCEyw< zR{Md~b8YLI_U>be6dja0;kA2~nzi!l4L3fT zJVS#q#liCA)4LAJ+_7&;ZxqTtCBb#HmxMifKZXkRM26eHrgCM`=6mqYiABf9mHrAn z1&S?x+Opy4w*SF7d;if7OKz!(P&ByX=d=>&0R?gz14(k^VKS)x9i7{P^u9BfHmUjGT2p3W9xi)6%R&dV| z6o=Gy0sF=fS3S^f>2bx6#8>wL^uf!#Pqhw{k8x~6Gq+$G(1W$CkHc@_Z`oAWXEl+I zHApJM_da+uW{;wAa_nd3ePZ z>siz($4jqAIFczo+&HEw4WLZD>6#iuPGlQWFT@@4DySQKpmg}DS>L`x6+PNZM$^N6 z-nG(P7rn?CrnG$l@2xjZJhyA*in)yGe(uS4`HF45Jx~wQR?aarmoV$B*RBUvujg`z zC#SvTeiL|iq~xJ9!-975gA~Z$`AAh$8K=C#nG<{QM5e;pt@k@k=xu-8kbcOcHlFb8 zu%Z)sCF;dRFnNOwNl!iYq@2u=(z ze!AAbGxOUMG*eaXJE@mB_ICWM__l7MDYD$AgSZD|W9E5>3YX*_nhUHtc>(#f3 z7Oo*mDT3d*2C=SIzPb&OMyh}@4d1f_wvS=wA91`a?~0oTLKL{!T~ks+alRsj-=5Qr zh@jo*3mvFk6Gz)&E+#5*EmN|wTX&Q;)qmb?F(YG7{X&Uan-6i)xJQ9fX;6qo(C^$$ zOnG)Q_E5)?8g+vbCAT);x#XBh3tryh8K>!q%!PKj$OQD(&xFzAl5C~`FzXtlZ`@r$ zJVPpB93uruaZh<5lc1t!62%F&bh!*-%!2`2mabu}3;iCAPeGlYt5st|&L?zAo(D?E z;%TKpJT3oSYwoPfiEBs?|80E+i~)KwZczFQtK-L*;xpO^KCX{Ntu{g8A5WE1CmjgV zGM*j;gOap~Lap_8uhRw+TJf<)3AaH=W8Jy>oq%2(ZgNM>aD+GSD?`G>wYPkFe#QcnHni#dmIn(p zQI!CA^d(@))mpQ6m%Ai6$Utwy{Oj6i<)RbAq=EgRIGBATuHC0V%@R(!Ub9^=g};?d zlvfDKK0e+$*+Qjx1ax)AJ$2=a&y-`Oo^||jrU7wgx z2^yciEVb<>409occOz@;9mYkCJ=x00lVx7?PawU4HapA&?k>%S;6q&pdZV(_V7{H! zV0i&q`Q^Aa_KA0Di|!gU2HLf|s+^IppsF^wHr3R1AM)D6^yvqXPf>@hLgFVPTi9v= zlz>?4lr*O&*oE9p|JVo%_nSQ8nCIW@aT7rRmcEjY*?RmRmD3#B#;TtCHyd;gx_D^$1Vl%b;tl-^Y#eXJ)c3EE$%)pE&i@Sy^^G-2FihJ0J7y z3cI#x&-JGG?Z_vZj`F*imp1vwNmmSA4L%|XMM?Kf>wFSjP@{^l;!v8P=g z{X;&G&`{W^oiml-yzncn7J8t&^j*X=`Qb`fF0P~dIXPo$^Cs`~(-V&xf7jalT&8|s zxhWB606v+-?{MS;&Jc$NEZ<7KPU!M+res~0o6nkH^-kUBg&*21Tt3LE#*~G^9O8-x zXM^*iqQi5AeoX}ztTlrQu9>zw*63;fjE=Dto32dt zzK5+ZeBj-s?hS=sr0*&t4!SzTt3YFL9qzw7?LaXy(&j`ne`^= zX%x+g#NFoU^-K~<3xQJE<1WULdr2XyKa1it^1Z+) zfnn>Du3qBU3f*M&efO$b>XLp|nc0cqhPU(#si@q5%~S4m-eaCd%NN#sUV8aFe@oMI zEQx&NYDVf6Z9@k%yT^n3#y*DWAeKXvzo^hEiTA@(wk?V_tj7e5yr!>x64OwE@Ta|*YXHi;gG2}K8)ihWC z9oc$3oyHY!H`GI6yK62;Lsg-^;ZaP+<1zx14{xuuu|FGbNWP&n28O^Eu|C}z;lp?$ z2it=WOcQ@jlix3sCwusz5uS8QDDs)+$8vH?)U8ZkIdw{uN8xCM!|^5pDCq8o7za(` z*|u~i=2+fm2v^x*pml-Qhc?fGvGezJ2_%j!=F{jojMSIe^>A_vYIq%U`{6N zVUn#+pq77fhKWtdK(_I_k_exBIT}G2gWD4U-}UzaCWS?RepT)`-= zA6~1DD4h{W0h5solMYS$HWjY#%W4Anrh#c(??S6I)$Xes)D?$TAgl07SP?-szz|B< zr#_N-+A z@e&)ZeLM2bg^G5pP92jJ*{D|^ zXenOI-wx-e7v8xIugQko(NOVsxOO!`<+p(xE!T~ZiNi6==>D(Ufe(5X;1>DtBq9%; zjRz3BtILR`XF9JEu`GqGA~zUO)eaOUyWS=k%9lin1`H4yAWB#`t6~GxH#jGp5q?Wy(Q0)NZ>VkPblzDjMxJyE zy3W(uYbB=i$ZR&`Y^6vh(l6T>mVS4~tscx3SedM7&$~98=L6bQBg)5##Jei5;>UdM z>RWF835ztMf=y%-#OTwxh9Z@Ar*dCT8>P~7T=CZuDUkEhrw~#Cg+#}G%Li0Zu1X}+ zz%LfM@*ekH_5i)0#)gXKy_ys6`h9boe>TeM%v6aFq^ou=M;_cfzc=F3&(>d6SJkhe z#l#6h5|vsVmW-3>bFmI&uc&di&D85xtm)Iad<6n%+E4 z*ad(hw^$)fQ+5*CPBL8<^I&G?jgqdn@S* z>jv90mP&R-o`)$=_C}%=Vm#kR~5HdC6p@veZD_ZSJgG5p(R= z#^kMbz_6Y!+KH~Zyf{^A7M^VU?Oq_2-4CT%hupglziYs32hkfVZ~PAjnKRJ7s`o)Y z|AJ`H*R?aVSZDrJEkZ#s>^;MByxR@le!`)+VikNSfRQLz4Wg$;J@$e6;I$0NZ=c?W z*=~F8%I1r7Y%+FBEg4)m-@2N8&Gg$b5aG1?Bp=j{jaU*IIz@5O^z6fdkVx2RtB?`* zE@ndhr*@}&*;AFfFlCBpiNzq*2hM@1z^$ZUXmmFu(&hS+5h#;{#Uh{!iPiS6Fc)b1 zS+aKBZiMwSbjwC4@>c=9`1>=v!*{*;ZQmn)SvDZM$M%A4(o`KfrtuV3XT3A*8ucXa zUClCcv4OxK&#!Q_0>9*xaoQ~rQ(FBmSJ?Q@u-tqN4O~X{RUo4X8<|i->|ehp7*#4k zVE%+(i5!UNHjk3y_);lGg}R;sA1b)p-2G9LZO`2Ot&6Sv*RoCtefqG?uva$g8A`dO z?XDgYdNgNP8AaW7-dQDHXmMJh_Sm*0Sn%m*KN;1kjcB#9b&@?69AJgw8r z>*c$Ja*lU)*?+&r1^USC0)T@^`Hef_$X zv0KrY+36wG|R%xoKtVWO+nAZDnF8Ofu`pHG>9mPypgsf zaQWQb$M7N2hafPG<&~g$cW&%Ju_V6yL5BX|>5*bE zf}+5GOocjM`}}5z!G+Pe3*{0*$t@|bGH80<%nN!nSsnR6sTB1}dOlv%*1-=eY^YJ^ z0skjIKfh?(X`HZkgpsGa1G{P>zUWH0`u^-e>9Ryj**n$?-Je;h%E3fe8S(*>ekBQK zBc_UH4^$oRKl=bk)*zdsW!fRSCe7w7MQDz4D=Cb*eIUi5o?Pdm`)KuWf@>a!2 zU~_BthGutxv~)H17Wx-wk|95sc03rs8>({ih~4BmRk^QynP|$oA8*JK#%P#nLg*;$ z(qtt8l!s^FrN`Vin_{=f5T&Ec>@OQRHWk`_is_W!CS7QFdHOyS?jn(@`hIi+GGvvn z{&@Qyk=07QkQ&RpPTTW3z`9tOl359hA)0yu1C<)^@_i1eBl^NaRHXcMKi|&JCi;%n zVS@@eUjh6ee_yOFX5+BF47_W zNM6~eGS@|$4N07^*@?XRsTa}Z{K$%6pl%}3&a;+}4_0^~=)%rkR9zP>?yV4YBlyre z+*L=)f27qgBtG_+8_6ssFno=0g*>S5$JQi=)4X6px$W`LmEf0pbuQ&jzMuigL}*Ev z%`LUAg#+s~&Qee4G}-TQCD3iri<#ONGU*KMCJVx9RT zXJmA8O}4D7?^G9A9on~jyE*7xpE6gO@0@fgymjC39YLkukdoi!n5f^ruZMi3bkZ} zwMZvl0r@Q?Doy-2zU5TuXf<0?tEvU8)2kIs{#Z9Z#YtJ_JX7Y0*SQaVvTiSlX0`tc z((8Y*_Lfmqu2K8%vlb;Fuq8!GlrBM(loCPdu0^MGcP>O!x}`(9yCs%NBP|VrfOJYp zpL_ZK-*d(|<9s}0><@b=V~@>K_ngD!>8=m(itA&3#mPLZ+$2vXgN}`&Cc1K))B9apKb8C?p5`fPdM?vX#&ll z;n+R)qBqbZ{Phvvk(zzp4{(75Syrjh0U^++>k}DS!RFWT7HcQqLf1(e+AGb>mNo+d zF^84Q3?78#IOt07A;oG83ljXCV-nZxK+rA5lE{?(ttC^!atsd<_tI-BZM)ZUFJ4se zV+3afElL%(J$cdpwhYgRGR>;LiQ;k_)`DL*EGwclYK4ty+vz}Pk^M8`vTc*cAr=1R z*gF7><7iHxNQx$+q@SzT*LK(Cd6oBVwqe^pFVt;e3RsSou9?C=X;Hm;K4*gNUJ+JB z(8Mu>{X}Y%JoAF#?&wl`4P%f_`mUe>`lQe?inaR>-?A>c>-tcwfheD#mJ)PuOEIv9 zEPPy@UrVZx2bd79tAm$U{U8|`W){1TXRAAoAwY~(dGXXv7uk#H>qT5!BTYVBe*%5% z>#nCJLouzmO}Li#pxEuQc2G(%^KWOCB%oCQ9i;)VW2F1sqBjc_2aoJ{#M>X(l(#Zj ze+2TCg#RINrYU)J4!jvTtF1#*FTNyE-x@Xe2Il2UdpxqPHf7BMm3MzWEV>XC>*m_S zti0gyid6byuodw>{7@bt{uv)Sf7eY_Y^lvf^mrp)?l!E09aO7zb@^BA$@X;L1!DjG zW-6RnLFxO>&rQJ@pPeG*^R(9#9PwcuX&P?F>#$PrS-YoeO=MJo>1f`bz}4#@DV2G- z9SRqC=tKQ2-03XC=;s#~vKj1*1X8I(4&WsV!w5og{z>^tPabwU3&a5uCyvg09p_Zu$% z-`n|ya*3ZMj#rrK)=(xsRQ|MXnH~=9y+A~N6;g8)-n~-MTSx5tSpLji)*gG0 zC^q`JBywv~jkwE0(DmD=0e#IOA7@_!9Z{&Rp4yXfkjYp)QPlZHD%bGC;E;GQIf<;K@suL z1a9w)?i`_~j6B4Sw}_dR*$jV7MU7zxHc4VVUBlY$kDCD-8rSKY_uzPx)Z)a$)cug6 z{Vz+`o2e~RHdOIJxzY!StErTcxH>B)m8Vzn# z)cL;Tievd~*A#i|?57HzrMK@BV;_HT?p0@)F6DgfdQtj+Itr;$RalFW=I5GPD-Fnfa# z4?{PxpVtvS`|k_*f#<*K{!V5=okd+Qt{ctQvl?=ildLiwGxO^CrKg6&ZXC+&SdI|B z<+qsBFSd{9eV3b`9^p~RauW_Z`U`N>5YFmdt<8C5oczCa7;PB z_-Kl^&gAyRfxR9a=*yw`IF<9Vm^$NAT(;5Un2vv?DmVBeKNl+%)9MC$Kg~IEsNZTR zVg6H-8p;R`bCPxwA@Bhl(XTQ49D`VX+Kyg~STzT8KYL%Gr1#ov))AG4oPAi5P${7F zR_j|5nZ?MIktn|r)~&IoQx3x~B%5T863MJ>eaeJ<`HU0=Q#S<%3R5|7#JHQBM81B6 zEmd`r!5hSi^uai}!TRCFSG1rp>SeqIUH>uhP{72lHfrA*zdQV$X$!{D`JYTJ@?(|l zEG7%FT4|CK18?yS0X?o{2}H=P!-~EH3w{W8>^?5bS)6X}k}HJJKElq34&UZ1L58%Zj%`BJHkBSt_jNCvtbfT~Bg_%;@i}4b9xAK?>>e zh7yzxVEyhzXx6yvqANi0$7a*p_472XFQwMa2P;{NVn^ z-9*flGfSV_{iFpSgf%UBfp?-KrvXX0fT4}Ovv!Nh@&snjAs=>fKb3iGVHDn6@5zQd zMP2rxkSPMCHP@fn11>Rr!Ta$X=I1Cw+nG$55!B2gwk=bqUs06Ii8A z?`bNROPiF4XB&8{=tOlqw^L{FDVUXhAndj%-gZ*4RUMw^yp zo`IPw#HN^;!39ilB&djBs}Y0SMlirQsyAeadpGGtT>#g<9#qj5m-Bft%XjSW=V%TW zD203aW?QNUcIl57_@0!4sdabIzot5r@wT;>Rncn~?#kroK+0saVS&FHQ|<@b<41MR z^kr^Y8JKa4?bfO3VJbi+|D>Te^i_si)&thIMmtyKha}bO{Ec8KB>D4LKU_$BaYp^S z@!{!R#%7l~Eq9Y0iWu2_aKZYWQe_H;GhFs!;*!9RQp}oaqeU_>s*3eI0z!3M!qWUBzK5SZfXTfl ziOcfKkLA*qG8}`{#jZUV2fNvhY;8|R)V9y)_yaQ3FaJjsm;rMl$ls0ey$%|%xt7B> z3vTXs$#;Q^kkHJqt(@=Fi<9IwpHsJ5s?(+iElTWa56_mWkgM?y>3m~^xBjA=U38!g z@ZH~^R2e7+Q%EYjT;Wp99nf8<*v8xa6zg|d%!3G1pcBxnS9bGYHKdM*$X7s- z*Ppp}_F|{Hq$f*sBVX5G)yhLSS`hzMQbgGGNXz3#8mUPMQle@PkjXpXsRcKFsX1Dc z4CNH6!6u~w>H7QMu;XpCFF&AFDgoM2pV#M4+mFbr&cq#3<|p?l|(g zPBmECBa~BGvG+&yP^6M7=oYD}VU2JyQ{b19pu#x1Y$oy|~8=Qoz zE#nmf7Y*0WSV|5DOL}eYZVA9y z26+ztq&Dy7h<#) z=T@_X=ot`Zv6k8EPkwtdRASYtdiH{YaNP&OudC~nu;@Hy)yKfMjC%1Z`Z>Xvi|sXS z4g)w2#v6O5yB3qwoh;%H=EPDa@fdU8{3yZUKJ7WEZu8J?s%QwsbgWuuDfgujjKgwW zW<&B8#XorWDh00X!8P;mq2P>Anu5qc7pQIzD?{+de*-QuH3j0yTw?o)h(x+ac2p<| z2X8#3(yed)pFNf+)>VF<5))}52Pf;14__*WLr*h&; zE7h*5Z(ob#nPrOA7 zf}Zu#xALGxNC0yd|JSFjm93<=S%px45>ib?v)7|HHLPGF78|RY8g1jR2ZuEtycG1H z2qkREr$`-os7klna;V6mQ;i8|N6dgIRcSf$z<1>#-IoPGFH32;t~T#SLv>9?vZVl0 zR?^2u_+;M0(04zGt^>`3i#xraU@QyqQ%R7atieUUD9;vuO~j^ATaUitG|O+;k$G1F z+>}WtGws+qTFJ2;12akqc#E5qKNygKM#b(rW|CNyt+wkLoLN5a*|b(SscG|*MlvM5 z3hDz#LSD?|Y(<-7*$U+~{$f;sm8Le>iis&Kv)WgE82Bfz>~;|4LYf?YbNI0$KoR}K z1B@gbGYS-vvyWnrbA23dul?M=%XK}^+b8AevS67t8U4jISvXYAPm>O-a$e>IBaDN* zRUdo?^TBJ$k+q`?MFGdlBmQd|hw~YI?dI)d@vHASFPJi`H{z>aH#~da#aTW_P3`6o zfANy4dsOy8z&9(q-K@wm@UgGUG5BKcCl|ZU_sPFvo+Xf6l``{c`?b@k472fcwfR(w z7can4q7h1fvfPf+T{zeDJxpCF{ae@F)#V5XnEw{s&sI~bz>kDSL>Rlek^IOSy$54=w$!gL!z-DYQUsvJRB6RLX(ShYOvd{b{r1g@wdRB{eHu1V#BjOE$ctYuLNANgq$ie zm+o7lg(n`tJFsTVz?s#qpL>Fq>?Gn9&_^lE$FK)jILjnb3tus6z$6QZBS)agTN4^P zP4B2nWQB2byJoT&Ia0rD8k$AB00eXva#SEK;{gtu*<6A@96I8|_xXmM=PX98a#in< zRpwoo(KL(X?MO*Qn0+&R1nglUFH0J4nJlw2-KIniT8vJWjkO}Dd8Y1Ca1tlL8=D^S z<($E}uI9)7uDC^I&o1lX-b2Q&)z7`{FfUUj!m0${87r73hftrx)W-xopqbGCmFwWL z5hJPZHAUD}_}ttC>wo)~6R^o09E0uh{)?1o%?$$yUaK5~inscVJ*G7pSi1NtLNY*6 zvi8)CrfNTDMQ%~O{eJO1xSotK<{Z#|BK~pIf1V9`n1I(p;CwxY2f#$A0pg<(z!;nW zBn}R>?FTW8yVAVz=NyJc>YljVw z_7Q1)f*Lq_a&&#j(v769#*I?wY-xv>%u4dPg5cVN1>csjCf)KF zQ#C`s_V;$EGbk{{9dFr`L9~;)@0EDeHZbOr@D_`fst8Aj2l___`If3jE3o4PDk$ge z-v9(Bx{S8G>3oZ5%E2yJ`yh&%#eSnRNqhk;(->2Jls;_?l}k06rF)cJKJAATbNj>W zeWotWb7Ad^xJIX^f|48$Oo1tyG%ATiH^Ib($mr~%&SLCU*m45+_F#V@0xIQqT>i6b zAlI>FthA;jX8dfd;o7r#e)57S2dZy!R?7&BD1|;!u~P~(JU!!FEA(z^Snsln$9wD* zS+r-j=k+3c8O`j(#%98QQ{K3Qmn(&;19baDeRoR82+%nI^~S4kG60}s0T8o^&im$K zA?hQ!#ttvQj->hi>4lIP8ML+wZ6Zf&_s2igA?s@`nPtuBG~?iRk)x?#Rc>?Sm>fJ+ zsV4%z1tN1wf3=?Y0(SD4pLf12*8cYsYQ#4n+^;#+6thMIpWV@IXuXn5_m629XP)&0&WTl0T7%KM~zzUG85N^5Rcd;`XTK!Qy*4x|iQb)y+u)bP*P zIZ;%zNX||tM;E3eNx56lznjoJpc9>yh!`p2(p+KUDGiO7k|V`iWZ?R1)7gG=!rIbk zH|%D}l>T+?=M}p|9S@p$vt zQ1s(~1sY7HyeCl%#HQY>8KkySAEv&bv&hhcl+762_mLmNt7&V;;fR7ie`M`ps3Z4N zAsHs5Ing2|jbL6v_=4zkEs^zvS&CH@wcGQ#+OF!R594pco!r|}deqJl`1poWBfG{o zw+nq%EI1J#f(TlRuXwoyBiSRI`rr6b-o)T7O7FsMLo|Y?Yf7pyjk|iK@8h07O1MZ zKPLB}@Lp-J&y&ZI%a&ySNxU%-+Vc;Yc|Z0OH~Q^2vq|bgoJ#snralSk@y}|C7TkQ$ zQ?6q%+MuD<3n-7yb~qyDwt5jTn$BWqZ$z1o%;kW68EZ%z0X=mlGD?Ot<4%vyc2+KV z!7eG5F}}W%*`oT1G}lX9Y($Hr7BT8$v5`%nA zc7vOiDr6|pO-8jhjXJt2$%A8sll~SG;(z>c>a;w#@hzusv_uWFPi_={dL*d3o(!oS z5o&x)(nwg|P5MAh1g?SSpP6AMG88VtCD|l`4?hiz@o1TlB7e7Ei-nZL^wA*8 zzx(gS!hPF#*vzxDlwGs>JF#>;d#%;xvol(e_Y$r7@blNE5MT6&RTZV7m>J6g02p$q;TF04BM+xi{=;-_QDW#zV3tNe!3vPiv3!V&%9=oA3Pipv3|g3G zuZ<#tgK2Rbr|G2U%IWr zQ)PD30x+;%q8^(EXli2om7$FdJ6H4i0|@nvNGu!>;R%RDj{XDD9wTF8L7#V<@tM;c z;S=ThVP}VH%d-pD?!lSw)Pu@jejb>dU{OB5@doQGZX!d1wchW7F_hmk;X0_r*a*t@ z(?vb+Vl@NiBYNO5boq7CoB!N872{aN1b75I^^$!c<~@(-vXuPzG~QWr_)vS+7kqR9 z?0BWUkfQ}*h${t$=zx+GFZj2oC73%p&wccU)?$Gw)A5Gf1r!XXk-#-gpyxKO(RjXD z0)x;jU0Sb|JK&>BbNbWg(NBQG%>n3Tz~g@aD2c0~1~>oywe?sNLIEUWnDAZ;2|5`8 z@Y?pl??vw5`Hc#K&}9CDgbLq0rp%%{JWNY)R%D)#OdMqKDC=Ekqt2~th%Y?I!l0wi zrK&|Mx4Md8I8oyDXGV$yCkCYXh>TF)9-RT_XbdVJY}Fy_t%*^p$0AP*Zkf|Bn^V%f zHUv8&5@+2#`D(IHUG(sb<{x(u@VI!8=bG?B2q0?HUs-cs1NhW8K<1ACk0 z>0qlsGKO_V=G*Bad2?CZNfQF<2@oGMao?JD{A#*)g&o5sIu%QmDT-}}-GMzc<4HyT<{GlG=gn$CwfC^}c@-Me?P zH<_CUHrfA+T#PMqQAWR+9NLu-I+lR@*)|~uApwCg2pBTRz`$7c*o@P|p4i2fHx6qVZb0q_<|ybRTmc zIOPEN!5MG^?sMl9{sMK9Rj=q)D0{gwaRoqjHf~qDPgZn@3sK?#Ipc>p#~3O0KHt3E9@ONBEXJFQ=$;Kc+?;JRh04b{o$k{gtcM*JN+= zM>iEJ|Ay_ZcSt*e5CObsTFnKjBV^Ce-44L5V}c|385+3S2#DmBei!bx z)74lF3;x1r{4AR7EpRerS_S^FCo(8$w8Wr6#W{8B?XX;-nS9 z^75fidG2qeznG3(zC=dfn%nM7W=ni1@h~UmR8uI#UFdz?XrZ+U80^f&(1dthML z>h3ZC8fNVu!q6Gv8L*tgnMDOuM;;broEglnwzk1jly|2}Ve%DN@Az00v5BU7=R}Dj zF46$$FrKX>;PmrCu=mx(1X$_erSw~Dxva9~>zB2}$S07D?tGhQ;)DkZLn+xDBSbAu zRgr>8uzLJTn00mivwdwDbj4uZYZ1Tl?N!^ghMV(XOkXF$*d?I!KJd4?k#OIA0DHE5 zFeiYK^q3__4(gYa8NubNP!F>YU%@BLSa|&3na@`Aq;>@=`B~H-axMGK*s*#x;}Qv# zHcLQ^K!}%gGghdnaF_cm+`_2-Q#b2e?buV)KPR~jFyJLeH!*iyDwRYHu08y>=bA{m zX*{Si{Lig?w@vB30oLL>kCtVcB;MDAXtXIhvIbD6>3#y)#?;IVlkRH$r6k4U)1#xi zH)RH`LO*PtvNvzV7I|3a5R1ZW_hy7cSp1|6=et?4PCoh%fsIsetV((0cUuP)#D=;x zY`#>=(5cg0zQVAg{$bsV-H`(7&$(}E96Ch&HSjGRuqv%@GD`PYivWX#&yxYkt_ek* zu_9Z2UNI+R3$z!6-uzxuip8o`(SE&gOv#Oponlu;h0TO~`t17eGKBnxtWBGk(4+=2 z2oMqk0lf9T!XOmLGOKa>pW=!6-T$k2T5C17(v)ZRh{k(W*Ino>^h(3AMpKjT!75t; z8!?Jp>y=c9bkVTM#gRvt~kvw))ZI$(NaL@EjYR<({1n;^_Z=H$?=UZUe@lwDG;@44@mw_&h3*=`%pC~?H z($&c$D$J9)Ki=CFFvQUTR4B=dr>PJ8f%UOHuU zmIRw9qjSJ_!Fo|!s=J4Cx>}_W`Gq0nMe_JG7%n^6CE@uMnbHg~m zQDNG9?FC{g4t;ljEI$HyT!m~E;MVAY{2T}gy6(Fm^W`4kR?>rLo*V$G^_X{~P!#xu ziKaNCvsoH|Ac6-}Ikkw0inPYxZ!neF)$Qt79-w!DG1B^1+smRxhxpXfGnRPP8%QTrhkWD^po z&L0Fg&=`j@I!~|Y*|>Fo%q1{TcJ1w)u)X)Yym~n}JAq14jcBoO1WPOXw(Zs+4`Zdh z({H{a5kM(sA)~xtHJ>ci!7!@k77W)v!XSDE{bSOi#m?o!KKsdD_jZag*9j{9`<=Z2$4^XxT;f-sQ|nwJoE12iE6P!ghCeM{ht3$=2DN$jKB2#0^SuKqMZ0Cwz-S z-}TO)vuAB5brr@SdqtM+7bUO7B0BXB9gboIh`qNDaG5s#m$Q3*Y};uIqj>?_cG${c zVI{6ldT5co4tsWd%1JBRApIgkuKJDtDDk}{#NKawLOiLLx~@FIgVs75C3k|bjv5_p zKLC{G|-Iy>P@LS4(tQbj#?N%SCyCF%_2igj_u@wsbQ>HEwYnBhqs8PLPMFJ0E zeIU;^PgxyP>%#=EFC{pROrHDf_9>Ha@6nld&QvGApCi5!tS29+^pQ_CJ6-}K%FrPT z#;lM}U$4z*`9k*uN+=}qVWa>Y{ZRv9DaOk#Ks=R=)Iy_z3nw$HBTw*`#!KjUR9MMr zcHDlf+Sri3I?j_HlmRkuJup+2seuLbT_8fAX8+>Mx_Idk@nyvKOPzmTzS_F=KymOW zt&MEO18XY$KbwKzEdunJ=fdC1u5C?hvlq_^c{kLHSkO#$i`oAH@R|e?Y+6Gd{KIP;{`cR`e+MqF$Z0CZ$ zXNb)H9a5T3V~}U|i;j4!=Ll9SALB~0x4!#iboXI?Smu@>twe^xz>(p^rVZ?i^k-$-dgBj)wJD0C zf#Ceang(p^^lIH;0RcSoplwe~JML$>ap@tVTD8t{$TM+0l2eANB@0~P3Qhk0Y#gc! z@S*fq$qdTpp)z-r^N8#hG;eQd2CIj=IVP8x*3 z$6;$bQ>`ezy8MrjQY&qZpfVk!lTM;{CsmxfZvopeZ+SLn1y9*g?Flg591w)sY<@eZ z^|)D(B>(O>Up@s#3?4kF64nr3^siU}1e@P?z_#ysmssp7txEg z)-bz0%vWDk6mF<12sC*k???sbvgRw3`Tvx`psXD21a=1Ubs*pT%ZukwQAjH zs^(k-fcPqhxcD1^KNO5qTyyBHl4=u8{ne zX=+88%6$_1vDp@lm(JJmQke|YO!(`iCNR6T(=@Hn7z`Gq@b})wRyWTQw85ye;%jqN z%NaGHYRAtH>dTv&1QDYc+Dr#4*ZNGzf-a{|>xEJT{!)B>*NuYRwyin~%bE~fb0r_H zkxu0!&Ma8nBUguD_c6Xtjb=~Z!UZx6Hph+F+GsOb_}-3tl7iD~eRGrTDxhzv@5R~j z?|`-L!E|9KbchK$%BEZNglEou*3PqA_-CM?%c>DbJ3=QUIs%F97s&Y$1~~P7&_$8X zHaHL+3;qMDUwS`h#8nfo(8M!p8g6h4dj3^Sp{{V!q>i%8R=q^|cyu%+&JWp2LE=0% zpCZHV&f~;U{FR}u_=^Spx-9TB5#%2nGvnp!iA54l%YjYqzdTp|e|!^*J*j|n{qkA<%2S(A7LuW2HECI} zt=YEl{zZS9pi8CehAM;txmT~z6Fcx?-32k3P9Vr_8K_d-#ej_qfm9tv1Y+(>699of zNJy#m6$9a|@sncU7NcRq7?A%-P3EuKF~x5nOe~B>*xd+}ENGm0BuH3Ptyl!Ccq$Mf zWa&zm#1ejQHOHc+6CZ%{@D>pd(gTFRz{lNxsG8X%I(tF(M{LRKE$v6eXU>YePKY;ef7|5(%%oEJE6r`@xdmA+nyY!8fX6#{_AG@Q^GZs z(!~bluE?$#9X6yny*x3f7+emz+1NYRORWzCH|x6d@U)ex2PPjH{YwmUm~S3GYy$to z7!XLkcqa=P`s~!9lO3T&kYzS0%ADB$3v|5S&}}dXlUxLGfE}Py+d%E{*i4k7h7=y> zBMqV>UPNENl?`U&e?t(o(Qx}CbmFNm$6uvFyrPF^11n=Ws$pd>-dsr=GkFDRh7Cyg z7X7v1Kl+kD)$;`@g3L3ypD5GR6{L0S^8>RE87T?dt`k4q#JK!AAyK+P>pb63H1rwb zx@G+1&nP`=6&12OWvl*0GpuMziu`cO3Rb2Dz4RfxH<@!M?xGosTHG5MokG0=4g&6e5x;0m$JcV$z^7ijOE*Bl!>1x{ z!BR zT8|dxCtVvUU>gDqYB*S?EzbU@AcF)zCg1aEDJ6{;dqAE7Dsjw#7x=2WZrp(Bj_u;4 z1Cu<7Dme2-C#7-}RpYo%6p;)9o!J;;|KU~}ImBZHlqtv7rMSq<&zDQyDW!PuUe0H0^O(uR|G|EjuSQ-#f*n);V^>#Iq4~(QL7EjoSwVSGj{!Y`v8Cx|}flDrqd@`~dRsV81R8kX_FL9(%;sjB7ed}Ks1=g!CD zTFW4w6hl#X=LtFij+2v9yU~$e^ym}Ozo1rhXprXR3^>^Mfn3F-hkjT=sLJY4X4J=z zFjYs(;7*|DSp;dMeuWRLRH@_-ooiShxZmUOQ0UQydzyhI3KrRz3Aew_ zBYW4ysTeDpM_O`F^mcmij>nRz^ab!Hl)Cm7ml7!QcHKvU&1|1~%o-Q@t!OqyF#Mm7 zhIXl9un2wvMA-3ML*0$XLmm|t6S;OD!*)ka91FMRfXR&Lkm;(B>@8|QokSSF_04RP zeg$?o#O!L3ii$)=ISFl@F3AP(spsz>Q)R)mzukFB9SEj%L?E-F@<7nk)D)eo0fYXZ z>g@q<*Vcai%OjY$na>mWl{T~mDAn$3VVm96b68@A*9 zAgI_`Pl-ODy_p3mvYG*GZ6=ns&vlb8E(-YBPwjr{w88~G@S;dVC6S$zi20_e+jxt% zy+7HK$%j=a$a=E#ShMv=dWPZ^3P{Wg6tmYlNR&E2_~YG82Q*AwytM|c^P}?;!SP>q zwEyZwQn}1PE*i*u`-5A7yxFU%^P>9OAxn)#UzK$V&Bka8(qzN@U)Qb;>uUNAi^X=+ zj?L(u!akG6$;Q-nH}|m%+NxDKid0qMIL1yG$X3{^pzNym6GEO@k(GU0g`Y~B9}cQa zo<0LCMZ2ck79O>Y@n1wFm!~`wUoTD`t3@i&cL%58#C;%M_H>KlFg1Bdz8j;EG$CAX zkO>n5JiD-gA8{I;>JU5Nxi z

kYI$5a%IEeWcVbMAOAu#ljv<={>Bbvg=4 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�N@DoRfLGjaa8A*Yp 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%0D#vz!NQ&@q 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 diff --git a/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-2-1.pdf b/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-2-1.pdf index 71ab389dd444d94cc34379377cb7ea132842fbbc..64d1f5bdd82e6f9fc7ab4713697c771a68e7a6d2 100644 GIT binary patch delta 3255 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 aLWA9X0|>z)w8QF1VJt!f3^v1=i~I+v(W^HA delta 3165 zcmZutcQ_RO9}h|Px}Rg2jGP%+85beSJ}X;BM8a7ap(E=g;;ha* zE-NdFi+|wp*yBi5ygZTdBfkawlBMvCK4frRY>%2 z(xx?ZcrNmAzNTRB%(wdZ>~C+$$C{lULp&h3h(c=y}3Dd zkZL~BK^@L8vKpJ(@NcB=19SQV#*}xPs8I8f3=8_&>t*-hp1Q!T?^6>yTRs~=O%2Gb zr!zj~{%i4=r8p;})rF-IjdGlBzL&qqZs%}1ofN!TPs?^urkJ=fI!pJ@F&O)^jSWJ2 zg+i;ukv!|_;4OC-OiY=V*#M5wS?4nIcOX4ybWLqz(=&k973W^ZizZV|chVuAv=m1- z%FZB84yxs@Kl~jv!swXVJou^MJLily>CRui+eg1{tkoOO&!v9N0BZ$=8D%j-W~5k6 z!7$+)Djz;kJj-KpC7(eXYptE(^|jY58tTTi$JiLaC)DQJu0#_!JMoUQeC;{mo7c6@ z^x0|ga*_CLxL$it=`OLQm9ef_gjMbzXUw&#?T0t-#5h z21*Zs&-QaP*GQ%uka*eH;6Z<4N5074Q5EE%K3Qe(2vJsDBLV;@80IgO7=09(5sp3np{;T0{9G)+!B6jl9D z=LkWplFw;s#LRNROJBMteMA-mezKB+Hkp}>CCN{PKDZ+YR-*7*QOv0cI@yoOiU{BC zlshI4j)J&{-tDnEA84-fFcE|57j{)Re)W8&(-{u~G~ad3x8t*#RH2IOyeBJ@@20X` z>2e5JZ1ke1Q3;|7JV|oJNXJpRr)4&@na?HS3a-?|iRe|AWac&>*-6S3JLLSCYW+)e z+QNKB_)&%M?OT2bh&8xsRXj6 z(PR4w;Z_>sx=HX$^Gxf$estCp2e`6y?7f*ZmL<}I^Mbf+FIs$yZ|S49?`;oiLi-|< zPPpocrLzO#KmF}F?9XDKdZ>$+pPu{3YTBC+$Op7QkOs2D-&0hM4ttJ!Ii3I6Y-`vVzAMi~Plts@(OQAW1I+y|1h+qHDf&kUQ}+_Lrh7Z1Y9Qd&ap z6-|9XFkfy103;+05+;)#6bQmbhFK4b#deD$e)p$cRBl z0o9jG5ARm#fe3Yr5>d2T z`o$6IlPju8N)pFS{Rj?udMfwbmm*I3jHn3n*jMUDotS9rervdQtVqz^K1+aYydh^{ z`sr%N!OYHOoJKZ6^wxg0Q_DBij0ZsN?2Kr*;DefjJg%Mfz0c@y z{q&uDk>K@t@wP?>slZ25Io`9|(pHRGB4u&Ndm16jIk zY7z5;m5ZCXp=OUp!Iox~T466!zfF*pjBJq|itN;6s%4NTy=>r`euIH&4_;S(ziD8X zLJ4$SULDj+wxqtJj!V~lP%aNv3Mqd+e=5$hDX3 zcC)x+d2#kdNZl;?@u1~ujY;{rO!|w`DUG1!IB)Adyu}<{cjQd+{8y+x`t(4pnQJu> z+O$!jU1;^eDBh!Y`eJ3tEZ(uKce=3`Jjp8MqggzwXS!xEKBsVY@7ghvqEeBc+o?d` z-Q2dzeh;LJO;cNcwj5g~_@_NdZ8GCkwG8y!&+QH_zI;YHX{co1n6_(Yc*9*WzBsZx zzt49>6c8YX(&F?Ph&4(Y{-GtLQr@&g#5|9apR##8xp`3Y<6ZUI&>)^-bEH>OBA0Ha zRl}`8ZfN`3y-ku2pg#&;|MXn4sQ*bafWOO@! zCnd~yKdjygD9-)b7t^4maU%<-n6qo>NX=QFT<&DJ3qPZM3!-hOu8HsNhoq*~wVZvd zZPYS)z-F7Yr$dP56k&lQ5yVnXc~+t^e;5-%onMd{1twhO5xWe7Ax*(oE5OVGMMV)D z3tA~0vJuu7)FYF7Sp|EUh-3wFh=Mq0e2R#YCg&Zn>ur|;TZh}n?64pRr~z6(cqA=d zkcDthNRT)z;CqZyA2LM14lj*BqR@YaAkff5 YhoIqb4B?i97CRWpAu0Knkru~)0Q+8(YybcN diff --git a/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-4-3.pdf b/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-4-3.pdf index b7f57bf22682c9f274962f785f1c24080743287f..642c0f929ab3650ac0e10675a38e34fe61f73a52 100644 GIT binary patch delta 6016 zcmZWqcQjmY*G+U1T?WykMIUWu7%e)ZMo5TW6D>p=QRb&aFNqNnj1oP17slv4qD2oA zM2pT~knnlSdcU>e{&nv;d!J|TbI!AFSwLYxWyDQH#$dHbw`auKxxge1iSw^u=DTzE zN?-F~ZxkMQ`#CtS994Wen!yI)6A|ZU zox2$P@8gD6#HlMs(4SOB#5w(Cu$NbZ;{LAHi;H98%izN$rWVY%>`R2p<#63z;r8X_ z*}(y#H+A?TLgTW7-U^-9B!!5@h;r@Qet9l1w>RhWzUFDQB|9}Xa)@0y>-U(AWP-LoUWkb=wt6!yVer; zN#`nltT+PRrE~-%FUGyH{-GK0RVidB$!>2xGmw;U<0c{3xBS%AWt-RhvqmJ!|L9IR zi;n&)vqDQKB0`Hwefb~C>!G;c<uh;zPQHfZ3~G{KemRt^dTSep2_g+EUEw$0 z)$8EuqebO4*f0VtPQwkYS)E1hUhFN7vy>j#VuB8`6jPjhrf5=4@cf*HNwSG~k-v0c zetZTVv7H5Q(0)FBq#1jW7YdX8<>APivc8Pp%)|_CaR%346F%JqIsqx5 zAfH2nWnqia0)_O2h4l0Y$|2Tsg_A2n=6h!C68U_F z#%nV5weZDo!7yA;Xy&tT)`gNRN})Fit*q=l;vuXJ0CC53nhKYF2TZ_KPpE z7yIK+MPlX8`yXR3_H53U+_d4eB}IP#w&u2te@;8Mv)r-s9oq;nxYa(ts+*L+Sm-7f zFs}N-$WX`Ua~+M>dIL7dGaY#d+y5z6%BDcDiOQ=^N-+0tP4T%-6{y-4u(K2SibuD2}sN_{cZSSe!wST_Tr|m#*%H+WDFfwbd0v`$cV$1^F z-EFFII&OIyV>_2WJx+{#(WY_U7v^Z8C#5Qvrs$~efOiB%3LjCSY(Az*8YIKX3B=mW zj>yCAbqEW)4p$g2SCFQ=T;dBmGjd1mC$?Wy>h{Wh%p-!~b#%PVJ6 zzTxLwaRHvz*axZIEG;7C4dLP9xeIUXBxO^ktEe@i8BFsSY-@IDVqJK`q|bw00x>LX zH99SY?j>uiW-K@ijZ&2~Af5PlqA@W}?XnE8q|NT)+bg5#D=%70< zAXdBU1fft{92fbsCub{ zx9y>-28S>P$3NJa^^gS@o+(#OARl8nxwaX4Y-Vq=TlZ))i6Igb%UuwThQs~pm-24a zE=Erm_p#XYd8-6{ixy$F^YIr5dO8!@#1@eQL~tz&{ z)%GZ@8zrY^Zs)9VM9F?@d||JK*&xJK;=(1TmrJP?SQoi+ZT(>qca{k!nsw^p95~4{ zL74Hqcr(wjY57@K=?{&!ZMDmm6;!7mk*6J_GDoyLjJvfAjvk3D8L>Tl_zsUiX|(( zDfEOH>%(tatIe!4a7~lAB#-Ft=^3iyIyBy$ zvjkrV;x?FB-X&i4Vl~?2t%I2Q0?h1U8j%-dr=d6Fq020?WV;OzW7vsR0s7NqbT8?; z5l!;u7){>G6`15QdExD?InphaWKwQ()Z<7ItI|Gy0DNZ*>ZK62D9I%5jEstOk8jqw zFP7r$Kv``nlp1;_5ZAS+l05$e&N1%jz#F@YN?B_X8M$`Jiv;n;zw5x}OcxeOYJvPF_ zc*hHr0fYzlY3aZv4ovAubmH>oHoyBnJO92fWOL5N#MaCi8eNY5hBQeVVBp^MEIJ$! zqZvrDtTTS>xTM&pcg*8QJEkkIt&1Sf+Fmus3ynVXUMZkMX@4k^nkeZW&;I$1br!UI zVmRpHO+co_%OfQ7aDO5LOsCY>^qFx`5bhp7v~FMcj5g$3M+uo(oStuzh)?b^ah+eT z-@CGfPU;Fe`KAqiL8vsHM(wwXj|=!j`$EkD1B(zD8m*uDAHlPCd_MKX`XnKEUD=E` zj2?ee$hd!!CQ|UpsEEl!df89Jzow(;r)s&*!03RVoUN^ZjC5THz`1H%u0Sm^&u>ib z7teDB|LjqJ&3ss0+T6-lBlTWMjb(igesemeZK#V%gt8XKr1#=trJ-TB?6#Mms*Pyn zLN?%q2e|@pk*VT^=WTXKulx>zy0k*>EL8G>Q%VAE1}qh^zwLKbFwsQX5fI ztJbrf$O?=+;FFN5S2+AT#r}PZLc-lUDiqLNyGA?E@73GW5MoQX5P4F^^ep|+U#n|c6^?StGyY4j4D+VItrVpzkM}vSN zxlNB7-_?(d!iMWI@OuGGawl!W4EbZg7eZ581hG>RG1Rc&MVnPKtJsqC@FNCo7Es}{N5N*@vZaz^`Re1Gx?+E;q_h~ z*(fh-fhb`Z_CTC<1wk8E^D>(%0?kBy`@0s$2kaTAc7&?wC_*Bk=4(YY>WnLbknmr% za7C6ksE6xNHUfz`8PY5~6uHj?(f=;SDWxILv*IFl$qm%7a6cm+VSPvL1^SI8@TS8s zmT4R2t8+Vz6q@zi+~5&($RQ{|tKPwq7UWV{uqA|WBN`zl?%4@lqQ=JcqZ2(WpK`~d zF4|4!RAK5LkR*?0E{s6p|Blg|I;_W~UV#PpX!h3aN!9Sol$yY|dV=~EJINNst z5P+52@IJU38(z<3IFa7IOvFU^n;JfWM(MZn4Z#l!yp(~xH{NgMZmd2*6(=gmDPmL_ z+3^X^DqTC1c|}?75xe&pq?7GnnG>y4f&9hs%xcN&wOv9Ol?FAd?V+yMh~ALhC_`9ulTi@&~}45z#~5Qb~FjPa}96D#6q42kTnYPBRX%Z zs!2&~i;g2)@PyOsICzTKY1p(utDkh3OLcKhg{L#4b0K7sM7+6!I*;Lz6O^F{!8lQa z$9oBYw{K*vzpJd2oTVjox@;?zDfX7GRx;oO60fcp?Zti*VmZ}NvC z%Ft~J28V(>bF>m$r1locX(rDK%}~flg8*0#kv5-@W1m{_b0w&=TuVhn9O4QYvc>Z> zy$=-zfvykM7nOV; zJv3l^LlUp&X!e$^y}b;P-VWd`xVe>mKT_qcq&AGDyfX&5GM9}^F)`Pue?57SO;1iz zPEQ_*pw84b;2{++$AiLLvzaE)RDF_CTgy{~?X=!BswXJn-$B!OORq!<;O(%CwY2H>RrQP+Ko$nAZ1_pe&s)QNm`ybj>)YT zH2GX#<*OxBg%~$W)1Bttei=HHwEir;-sDhpMz(-))TGkbeh#WJyFwJeO`b%2@B+)- z3(A~y3fP#9Jyr+U=PEsWPR%g~fBC7oE%mq-T#cSxys>u7R2^RkfivRA+V|sy`%JtY zmuNI5_g#_cZHx{5S^$(`d}yNY%w&~soB*$vCTR#iVu{!x-Tpy+f!CeLC)EjSK2NQh z&YE&i+({P#>>qp;|h51#y*YQ$3$O+U6C^u)7BIH-Q?*M93CHcoKQlgtWoHz_4E#h4Bg2(K7mmk+q4-8 z@aC7#n%{&6excx;r3;$EQGeaR3!*kY_2t0ONWB6v*&Diw?`$iMg2ojgjkyT=g?ADV z){pCYuM}FS-cLQO@e=4hz-(}2%ozg9%en~Ny*N=iR)b?e>iIe&X?*4e2kUIKR`bMr z1aumQ!Udj1ol9FF$xNXeyYDYFG<;V};$EgTCSSZ=_HerTiVakGzkL_$F--b$q-xbI zKPdWwKkI(o#<8GH`oR-$20}M>OGa(YM|pK?WNKU}HZtn-kUa5dO@EN^tiX=KQqT4l z&&K%7$=xM|^Quw^s^uMTQ#MQ*zBeO2=2WwJtoliQ`C@L1bnJAC=qO*xLQ~n;$!Ta7 ziFEWO?@MOdvK{H?500OBRq|Qk^srDhVZWCed%3sRTv0gGoXDZmieNcLKk!pbRoLBO zyS#8c*}a(Byp_1niru;#YWj@NwOc-!hs^DxU-Zm8!co1^>L19>nVZbZerL zecllH)=h2^IS12M8r&oUlOH-e;RkGxo-CV~r&H|@5O3i3EDamAn7YHuC6$^zHsO|^ zkMajAzVpP1imvxz5tdJ0EL)T2zw}0SX)N7&ogVIAmy5ipTxpCC%Z+nhh(F9p|6jr@ zeX(-0G2SWb>XI}L4^?wMoobmFfym`^?ezzrrDfn|3Wo~*QnEL+WUJ?6MGrG z*>cy>*_bLi+oJ|Zrg8Bp(xTT*?sW2aY=X@lppJN4`l)<;x1((N`P=$b(bkv9D^UL? z)p^1koPyOax`Iu2fh^49%m>-ovkU^@-(0O12d@HM#r-P>K=!7t&dFs^=3{pxepU!P z80wl=5jY+6y{GqmYm3*u95D9dd6Kdq)u=t&aL&u1jf0$*bR>&?R@;@NpW~e(uWTUD zow^-p41)!W;+Bg0vT36Ros~hODO32k$Y`hKPf+Gr+ID^{7+NFT$5*>j$#R;z&oWcN zKgyEgvtg<^!LC-n&#=~zD$4#FOLpjd!aZ=)f4-;2BasL5(E|yr@RiAB_r2G!&+w}u zwVeIZ$;NWqQB%=X&3#!W#+A+r8iPR7k}RgpTh6?G+Iu+QMrReY!e?`g6>q%NkWd)x z7_i}qteO8Q+Vs^~F}}{{2)bc!q}kA-;`QMJwvHc%pCYO(P6>oaEs&1&J3a%%4n_WW z6|m;M9%gZ;d3-ex*StqMcDUg~S(m^1lu`iW1;(}4YftXpyJNC8!n>7++(4ATUAZEs zXQ6&799t#pv*wfvY(b7!SJ<-Q*!g)Ah8^3?a%K&!Uf;1eoT&>l#%l48gU{76rj?7g zEt+$N8@RU_WrII&_xZcnpKC>|u_VQt9ItI_CNQ65{!-Yi8j?lLh*D0z4_*05&#Qp? zV*te#X8qb2KRptP?-uRbL=gPa|9;1Ud3t&7Yn%8gN;3POa^0@g7{zn>WPCY4J=rhyz^dtvfB*!9=sE}n)mjK}d zMk5^emaf$0ODJi6(EWLo_wTv`K>Us+n!`(^nM($^4@ zKq=|JSrQOQ$hDXx6R8SkPgWqr6h(9Ns$&r zkQNX@V2F$NyKCLwmGAxQS^M4l#6IVF@_dSYa3Ms1xz-4zDsE=h>V}p{%^=^d*{kgo zD0V%1`}S=n(tFaL_pxN```epKZxRh5GmS>azVPZuiu4y2Ifl7Ey|e4mj#oFVPJexz zntir?@RO^l-nTlY@u2sk1klkmE8%b;eR4c?J6UpT^Sw;q&~Xy`>1pbTe0G@p?&;~~ z#$M+X;Mmlb1+>sxP4gE|NPNj1y=eLC+UN1m*(w_f2b!m~R~u-i%uD)r#rJK+T{@hh z(!%d!$L0+@y_cZzN3XgT_t44*QyV@zm~}RXB)82=qMxtxbsMdT4!VgOQV=0fmVH%}-Npxtva2R{ye?U} z2ml@5kl!mK{A+{T?Nbad_j}8ZxP3YPx{*hf6v5p3vwLG$0d5d^BQjkMs3)@ zqsJ_Ya-q-J+Q7>gIufo_tovzVTun$?b@`5CQ$qiQS`&UB5~Ns{ zUbPn!P?QJVvbkiSbETKZR#^$rS-$f{V+mNlByG|6E-dVK-ugEl0L`D3SkE=9BQ0To-@!!~GA$ji&irhhTKwHx-!5(?;YoAdw$OvZ5RCyS zh+4xo(n#C+=^uJtttmg+i?rA2fA196WW8Y$+WL&jh{>L&dt!kptwqN=gwr|j+rD|j zK7^Z}=f`35$Lly|mZU{~YqF+2f4e5uB^&iYVQ+3FXjl%;ft0o33UwD}j9|RUaPFOm+@B~VG( zT}O%&KW8EtnOBTZGTcQcgGNfM=Si6Lx0al=gW6e_w z$>Zb=%=ZSSPhT@Gv)+-q(s;#QFP#bTP?HvC16vA!?8O>Uvqo z1;&wE%0|>&>YqssdvVn2#JYt$cKfQD_w}vBDqkk#*RXiSna^Df!^P9VJ>K#ThD(RH zhuiKZ!soLv$~SJ{GW2NSKs--!L0&Ufli}7FiH0lpOxY{{W4jcJ+p$^vFTj#JgKVA< zz0_`k=0KR0wVokuzFmC5h|L}b53yrFB+07_ic0cJkahv z)MMF0ismNu9aJF%CvFxw3elaRf=N1)oBldw%tWv7SNH8+fH`=V@$evQvdwPY^#_Ii z0g>Nr42`dG^xCXFEFXvN)6HkxdB9A)(rzeT?2jy5jJK5s@xiuu5@&E*`V(Xh5Yh?O zb&H3!hEL3kmmHLU-mv?IxAZZZeX%TK8hc)r6H-?oUs-ER)gc;GR-HjXB4WG+WvD8> zbY~vtA=X$o*>#S729-QVO~oz5XbuQ0P@o+mMjfkmiRY_>u(7SJzT$P-YSt!}1b4YU zO`PviBDh|GlrPo$9mQkT7s62u`vv_ORtiG&jRp1neL<&yf~TGCf<%zJ5v@T&vtuNN z`G|2S-u-*-GL6=i0k~0ohe78;B28s+hnw8{n=2ID>LNOo3$acKm{PS1*FMugoQ?gL z1kzqauP-2YxvS=kC|J+V%C|%`Lz%Pn6D>`u%_4W_jFe+C54Zbtu7tO`tUBH(UHjdo z!zmo-0qO&Y;(|_;pQzU3br^r*F>w%gF4L8)67?L+4IyEt>-KrE*3BBvXYIx|ADkM}!-P?OqV_5j69?y&(_8Th%h4KsH5C+)mk1sxdM+P; z#Y2d*`bSu$gc!PSu8q&mG@3PzN%gsg;mxh((wP9-8d8Cj`%whGXn*ql2QeG|dp#9b zqDo3LIgMd4Zh2p59l*4oqG>PsmC`^8Uu%6PjBP$UI;=0#yG!?xVmpOw8*0&u+apza zNSIu^-|4zKQhMR8$x<-+Cx=W9&;IqcBeicx^^q=K>3h;c(Fa-P6kIV=-19ucA8S4; zV>^lgv9j=OqIw<{c`&m@w59G#utkVDcueSZk%3d$yb6w0LbGV@66*OV&bTk_=h z=u^f4%jw*MqLDX@dfL3%3?lB?aw=JuowLbi(mDMU^-ROw$ZQWZ6ck^GPK?FJQ;Uw@ z;W8nLyiWSe&_|&2W|oWxsEArvb($H#CG;Oi!$8^W41z1>L<7(_9i0B`Qrs}`(c?*S zCO^+mMuUfwLQPB^cSMEO{Yh)RO%f(tUxYv`XB3Mg|YH$G@RDHT8>558N)&4^pvnSZvP@ODa>uv|I*0=gXC( zhe`uCSp+}#XE4w1RGzF}QPWoadlgXnLSDX%hjn&%M$qRKY z$;422kri7M#AJ;Z;B>f`WA(Zjb8Ph!+#=G8&q9ev5J1zwuU-!{QpqGvFH1 zF@`NM8l1lsw*Sriu4sxqO1Xf~#sQiAH|@ypV%T{ZH`pg|;}Pq?;Eh2S^kRfS zy`i-l1AV|NqwXt@jGa0iSJ^&T`8HNR3i8BBRZi&}PAamM4uU|7MV@wP}HkkL2(};?8wPn=m5jrb+EsCZ2Xt~n@O1ms!sB;|3zfMA%uKgZtV`|al9f)}6Y zgFNZH2JZ=Q837{s)o0FciP+TC9Vw%do534j=mf_WHxZ?%aVB#k|5U%`B~hG`I!RfP z@Rhi3gtcJ#Z+GqPHX;$+H@;h^iKDZ6qM3rl&0yr%Wrh-WCv$&}O@tjQ%{tL{2;(?U zz=dN`vtWhj{;GM5Wf_sE&Pv!M%~%T;HjGg_llbBq05xu2&-zYoLWxwg;V|TN?#vw? z`Xp4OWK_o@TEqAP%V=Y_^QJSMDM4;H1B_rPrA@@Ibo1>Y}YJLI`Jlxth4 zbUT9>2Hp|YKv$cg4aXs;7-p?o&F*#qE*cMm7~5f_U`8gPS9qC8Q907m2op65`Acj1n1)Q1=wTjp7&j69JMjz)0~Ws!{tS+LTL%qgv>xy zf!v7I;z?!TATg)6NH)SxIz&Ckq?mIi@MA|qm_4m^Lh3Zy2BDLoS0A#$s zo@?{;cTBP(cEgYDhE406)%@9Zo`TiN_+hp88F-8tEv1Q>h-Dg|zG?SwIKD9cT+;-f2jFCw+@K6l$_@e-zN zS(Ni=oI}k?|5*rY+IR&ictzQITvklp@rtB{&j_cTzpMJF>E6~*XM(|9VynqBq;~D& z1=~HA;Z6hgY0^gb`%hy*`Bs34u}!G@a0ehOp$aj55PLGL z+>q{?AQmgWqu)-aHR<)`{oe5C@4NA!avrzs&tn3&*meq{(&hGS7`*r`b*fDh2_GMb zd(%REWg+kP`g0Pd#3)FWCWn29EO1E9U@w97UDDU2Um-hqHqv_QyL|-h#)T&@^FBxq zmk5sYQ;^bIs!j5#b76rc|3Oj~u*Px?d3g-d0 zWIY!&aNRVYWZ>ejU28A23tb-SFu1=dX@Q*|$o%A{Oi|*RS+!kxXCpPzZIb^Yzi8b1 zHqY)!uYw;0EoR9BN7ElNZokOdqD`u{U1KfgwAdB`#U6jK@1zH2w5ySC3)-~jT#}9+1|bDb5uRZ?s8zWs{36lznXD$}tmDfNppUR*2+0Usr8PZ#E+wLiUFc&9b3F1YUf zxuf(-TXLdh#|hBg&SAN!BP+>~xvYb67?@fV&b5vTi}@q@3=VwIGeleSQ2}Fq#Y)v2Z$aRjgbxJzVwKzUjkEz)ixu^lju6)3y zzBGO5(^$#@;w0}Ue>W)*;T@V z(}On)v#%E4uX$OFQMlQlEZ1$>WJ?1_b(siS^xF}5ZT$2unH4+u3L(WR%RW)G<@x29 zHc?8Mi>)bopJmw*doaALf3(Ip%ytg_t>R-m&x#q&$cja@yNH2 zOFpl$+myQZ>@<~Hhv+| zw}&B(v$yZJG!aqN6zwr523wm36!2vob%m$4xE&f?o%woPc~A>?5$f8}!=# z?3u9gM)|FO>lT>8-hAJ!kw_5#`DptqKv5oZP(l4RZRz0JmvFCZU;pH70&_(35WF-U zj&mX%&+>MurrV>!*1u)ETPZcK8+f@m$2_21u!kD%%(B{jEb+soLg?`^h8JAp!nMO} zwXejyVGwh8_Ml|mKQrwZ$w#vk>nm&2ew+Btt5@Mu zRQQ=?nx1EtLAZh@0K7GQ$@4r)yM+Baro-tTZ2Rw0B?)nZ3K(=0T((14qBg#Vini@7 zXa3gf={~DVlSCQM-SKamj#G$ZTD{ay40QP>gu{c%S|)`$`wn{94`H}wYfCSN!-ea? zIWLsirlY^nX4CH-0j|AvCuI8G8Oyr;hRzB)?KPq7IoY;9!XCNY_Y#vjI9bS2XDwoQ zAgqg=IlH;L6d(0fg!f~x5ueh&?;k|-F4@LyED3>W`J`DVVzAGP*xzHEY%zwac~5r* zQ4#O2WgUi7(t2;^^mIHevec>F850zfzhl(3;}M$ifvQTbGqZH;`Y zkiG^q_{j3l%x=yv+apoh+$HF5ujYDRBPQYT^7Ep%jaU~6>al!!5v zUMQi3iJn@D8_Ml=+nEv}g+NsBF%|HU!=Wg+3>22|39Svl&VK*-xbJaO{`&xf!(piN z7y^0@L%`AJF`55|hlc&dJ4=K_{2NP1$M6uNU Date: Wed, 25 Oct 2023 12:45:05 -0700 Subject: [PATCH 05/17] add dummy fig to unit 9 --- .../units/unit9-sim/execute-results/html.json | 4 ++-- .../units/unit9-sim/execute-results/tex.json | 4 ++-- .../figure-html/unnamed-chunk-11-1.png | Bin 0 -> 30386 bytes .../figure-html/unnamed-chunk-2-1.png | Bin 33792 -> 32918 bytes .../figure-html/unnamed-chunk-4-3.png | Bin 229410 -> 232640 bytes .../figure-pdf/unnamed-chunk-11-1.pdf | Bin 0 -> 6143 bytes .../figure-pdf/unnamed-chunk-2-1.pdf | Bin 9392 -> 8919 bytes .../figure-pdf/unnamed-chunk-4-3.pdf | Bin 15783 -> 15767 bytes units/unit9-sim.qmd | 8 ++++++++ 9 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 _freeze/units/unit9-sim/figure-html/unnamed-chunk-11-1.png create mode 100644 _freeze/units/unit9-sim/figure-pdf/unnamed-chunk-11-1.pdf diff --git a/_freeze/units/unit9-sim/execute-results/html.json b/_freeze/units/unit9-sim/execute-results/html.json index 0549ca1..078c4c1 100644 --- a/_freeze/units/unit9-sim/execute-results/html.json +++ b/_freeze/units/unit9-sim/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "73dd2ece761033d701277fa08bc75ad5", + "hash": "1ff2dcc025f23656ec2fac45d1321149", "result": { - "markdown": "---\ntitle: \"Simulation\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-17\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\n---\n\n::: {.cell}\n\n:::\n\n\n\n[PDF](./unit9-sim.pdf){.btn .btn-primary}\n\n\nReferences:\n\n- Gentle: Computational Statistics\n- Monahan: Numerical Methods of Statistics\n\nMany (most?) statistical papers include a simulation (i.e., Monte Carlo)\nstudy. Many papers on machine learning methods also include a simulation\nstudy. The basic idea is that closed-form mathematical analysis of the properties of\na statistical or machine learning method/model is often hard to do. Even\nif possible, it usually involves approximations or simplifications. A\ncanonical situation in statistics is that we have an asymptotic result\nand we want to know what happens in finite samples, but often we do not\neven have the asymptotic result. Instead, we can estimate mathematical\nexpressions using random numbers. So we design a simulation study to\nevaluate the method/model or compare multiple methods. The result is\nthat the researcher carries out an experiment (on the computer, sometimes called *in silico*), generally varying\ndifferent factors to see what has an effect on the outcome of interest.\n\nThe basic strategy generally involves simulating data and then using the\nmethod(s) on the simulated data, summarizing the results to\nassess/compare the method(s).\n\nMost simulation studies aim to approximate an integral, generally an\nexpected value (mean, bias, variance, MSE, probability, etc.). In low\ndimensions, methods such as Gaussian quadrature are best for estimating\nan integral but these methods don't scale well, so in higher dimensions (e.g., the usual situation with $n$ observations) we\noften use Monte Carlo techniques.\n\nTo be more concrete:\n\n- If we have a *method for estimating a model parameter* (including\n estimating uncertainty), such as a regression coefficient, what properties do\n we want the method to have and what criteria could we use?\n\n- If we have a *prediction method* (including prediction uncertainty),\n what properties do we want the method to have and what criteria\n could we use?\n\n- If we have a *method for doing a hypothesis test*, what criteria\n would we use to assess the hypothesis test? What properties do we\n want the test to have?\n\n- If we have a *method for finding a confidence interval or a prediction interval*, what\n criteria would we use to assess the interval?\n\n\n# 1. Monte Carlo considerations\n\n## Motivating example\n\nLet's consider linear regression, with observations\n$Y=(y_{1},y_{2},\\ldots,y_{n})$ and an $n\\times p$ matrix of predictors/covariates/features/variables\n$X$, where\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. If we assume that we have\n$EY=X\\beta$ and $\\mbox{Var}(Y)=\\sigma^{2}I$, then we can determine\nanalytically that we have $$\\begin{aligned}\nE\\hat{\\beta} & = & \\beta\\\\\n\\mbox{Var}(\\hat{\\beta})=E((\\hat{\\beta}-E\\hat{\\beta})^{2}) & = & \\sigma^{2}(X^{\\top}X)^{-1}\\\\\n\\mbox{MSPE}(Y^{*})=E(Y^{*}-\\hat{Y})^{2}) & = & \\sigma^{2}(1+X^{*\\top}(X^{\\top}X)^{-1}X^{*}).\\end{aligned}$$\nwhere $Y^{*}$is some new observation we'd like to predict given $X^{*}$.\n\nBut suppose that we're interested in the properties of standard regression\nestimation when in reality the mean is not linear in $X$ or the\nproperties of the errors are more complicated than having independent\nhomoscedastic errors. (This is always the case, but the issue is how far\nfrom the truth the standard assumptions are.) Or suppose we have a modified procedure to produce\n$\\hat{\\beta}$, such as a procedure that is robust to outliers. In those\ncases, we cannot compute the expectations above analytically.\n\nInstead we decide to use a Monte Carlo estimate. To keep the notation\nmore simple, let's just consider one element of the vector $\\beta$\n(i.e., one of the regression coefficients) and continue to call that\n$\\beta$. If we randomly generate $m$ different datasets from some\ndistribution $f$, and $\\hat{\\beta}_{i}$ is the estimated coefficient\nbased on the $i$th dataset: $Y_{i}=(y_{i1},y_{i2},\\ldots,y_{in})$, then\nwe can estimate $E\\hat{\\beta}$ under that distribution $f$ as\n$$\\hat{E}(\\hat{\\beta})=\\bar{\\hat{\\beta}}=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}$$\nOr to estimate the variance, we have\n$$\\widehat{\\mbox{Var}}(\\hat{\\beta})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-\\bar{\\hat{\\beta}})^{2}.$$\nIn evaluating the performance of regression under non-standard\nconditions or the performance of our robust regression procedure, what\ndecisions do we have to make to be able to carry out our Monte Carlo\nprocedure?\n\nNext let's think about Monte Carlo methods in general.\n\n## Monte Carlo (MC) basics\n\n### Monte Carlo overview\n\nThe basic idea is that we often want to estimate\n$\\phi\\equiv E_{f}(h(Y))$ for $Y\\sim f$. Note that if $h$ is an indicator\nfunction, this includes estimation of probabilities, e.g., for a scalar\n$Y$, we have\n$p=P(Y\\leq y)=F(y)=\\int_{-\\infty}^{y}f(t)dt=\\int I(t\\leq y)f(t)dt=E_{f}(I(Y\\leq y))$.\nWe would estimate variances or MSEs by having $h$ involve squared terms.\n\nWe get an MC estimate of $\\phi$ based on an iid sample of a large number\nof values of $Y$ from $f$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i}),$$ which is justified by\nthe Law of Large Numbers:\n$$\\lim_{m\\to\\infty}\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=E_{f}h(Y).$$\n\nNote that in most simulation studies, $Y$ is an entire dataset (predictors/covariates), and the \"iid\nsample\" means generating $m$ different datasets from $f$, i.e.,\n$Y_{i}\\in\\{Y_{1},\\ldots,Y_{m}\\}$ not $m$ different scalar values. If the\ndataset has $n$ observations, then $Y_{i}=(Y_{i1},\\ldots,Y_{in})$.\n\n#### Back to the regression example\n\nLet's relate that back to our regression example. In that particular\ncase, if we're interested in whether the regression estimator is biased,\nwe want to know: $$\\phi=E\\hat{\\beta},$$ where $h(Y) = \\hat{\\beta}(Y)$. We can use the Monte Carlo\nestimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}=\\widehat{E(\\hat{\\beta})}.$$\n\nIf we are interested in the variance of the regression estimator, we have\n\n$$\\phi=\\mbox{Var}(\\hat{\\beta})=E_{f}((\\hat{\\beta}-E\\hat{\\beta})^{2})$$\nand we can use the Monte Carlo estimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-E\\hat{\\beta})^{2}=\\widehat{\\mbox{Var}(\\hat{\\beta)}}$$\nwhere $$h(Y)=(\\hat{\\beta}-E\\hat{\\beta})^{2}.$$\n\nFinally note that we also need to use the Monte Carlo estimate of\n$E\\hat{\\beta}$ in the Monte Carlo estimation of the variance.\n\nWe might also be interested in the coverage of a confidence interval. In\nthat case we have $$h(Y)=1_{\\beta\\in CI(Y)}$$ and we can estimate the\ncoverage as\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}1_{\\beta\\in CI(y_{i})}.$$\nOf course we want that $\\hat{\\phi}\\approx1-\\alpha$ for a $100(1-\\alpha)$\nconfidence interval. In the standard case of a 95% interval we want\n$\\hat{\\phi}\\approx0.95$.\n\n### Simulation uncertainty (i.e., Monte Carlo uncertainty)\n\nSince $\\hat{\\phi}$ is simply an average of $m$ identically-distributed\nvalues, $h(Y_{1}),\\ldots,h(Y_{m})$, the simulation variance of\n$\\hat{\\phi}$ is $\\mbox{Var}(\\hat{\\phi})=\\sigma^{2}/m$, with\n$\\sigma^{2}=\\mbox{Var}(h(Y))$. An estimator of\n$\\sigma^{2}=E_{f}((h(Y)-\\phi)^{2})$ is $$\\begin{aligned}\n\\hat{\\sigma}^{2} & = & \\frac{1}{m-1}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}\\end{aligned}$$\nSo our MC simulation error is based on\n$$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\frac{\\hat{\\sigma}^{2}}{m}=\\frac{1}{m(m-1)}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}.$$\nNote that this is particularly confusing if we have\n$\\hat{\\phi}=\\widehat{\\mbox{Var}(\\hat{\\beta})}$ because then we have\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$!\n\nThe simulation variance is $O(\\frac{1}{m})$ because we have $m^{2}$ in\nthe denominator and a sum over $m$ terms in the numerator.\n\nNote that in the simulation setting, the randomness in the system is\nvery well-defined (as it is in survey sampling, but unlike in most other\napplications of statistics), because it comes from the RNG that we\nperform as part of our attempt to estimate $\\phi$. Happily, we are in\ncontrol of $m$, so in principle we can reduce the simulation error to as\nlittle as we desire. Unhappily, as usual, the simulation standard error goes down\nwith the square root of $m$.\n\n> **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([ 3., 2., 7., 3., 3., 3., 6., 8., 3., 3., 6., 4., 1.,\n 2., 2., 3., 7., 9., 5., 2., 1., 2., 11., 2., 2.]), array([0.00368613, 0.04298716, 0.08228819, 0.12158922, 0.16089025,\n 0.20019128, 0.23949232, 0.27879335, 0.31809438, 0.35739541,\n 0.39669644, 0.43599747, 0.4752985 , 0.51459954, 0.55390057,\n 0.5932016 , 0.63250263, 0.67180366, 0.71110469, 0.75040573,\n 0.78970676, 0.82900779, 0.86830882, 0.90760985, 0.94691088,\n 0.98621191]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-html/unnamed-chunk-4-3.png){width=960}\n:::\n:::\n\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0 **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([6., 5., 5., 6., 5., 3., 1., 5., 8., 4., 3., 0., 2., 2., 3., 5., 5.,\n 7., 4., 4., 3., 3., 2., 6., 3.]), array([0.01516659, 0.05451316, 0.09385973, 0.13320631, 0.17255288,\n 0.21189945, 0.25124602, 0.29059259, 0.32993916, 0.36928573,\n 0.40863231, 0.44797888, 0.48732545, 0.52667202, 0.56601859,\n 0.60536516, 0.64471174, 0.68405831, 0.72340488, 0.76275145,\n 0.80209802, 0.84144459, 0.88079116, 0.92013774, 0.95948431,\n 0.99883088]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-html/unnamed-chunk-4-3.png){width=960}\n:::\n:::\n\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0)\n```\n:::\n\n```{.python .cell-code}\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-html/unnamed-chunk-11-1.png){width=960}\n:::\n:::\n", "supporting": [ "unit9-sim_files/figure-html" ], diff --git a/_freeze/units/unit9-sim/execute-results/tex.json b/_freeze/units/unit9-sim/execute-results/tex.json index 0a4627f..f1da62e 100644 --- a/_freeze/units/unit9-sim/execute-results/tex.json +++ b/_freeze/units/unit9-sim/execute-results/tex.json @@ -1,7 +1,7 @@ { - "hash": "73dd2ece761033d701277fa08bc75ad5", + "hash": "1ff2dcc025f23656ec2fac45d1321149", "result": { - "markdown": "---\ntitle: \"Simulation\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-17\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\n---\n\n::: {.cell}\n\n:::\n\n\n[PDF](./unit9-sim.pdf){.btn .btn-primary}\n\n\nReferences:\n\n- Gentle: Computational Statistics\n- Monahan: Numerical Methods of Statistics\n\nMany (most?) statistical papers include a simulation (i.e., Monte Carlo)\nstudy. Many papers on machine learning methods also include a simulation\nstudy. The basic idea is that closed-form mathematical analysis of the properties of\na statistical or machine learning method/model is often hard to do. Even\nif possible, it usually involves approximations or simplifications. A\ncanonical situation in statistics is that we have an asymptotic result\nand we want to know what happens in finite samples, but often we do not\neven have the asymptotic result. Instead, we can estimate mathematical\nexpressions using random numbers. So we design a simulation study to\nevaluate the method/model or compare multiple methods. The result is\nthat the researcher carries out an experiment (on the computer, sometimes called *in silico*), generally varying\ndifferent factors to see what has an effect on the outcome of interest.\n\nThe basic strategy generally involves simulating data and then using the\nmethod(s) on the simulated data, summarizing the results to\nassess/compare the method(s).\n\nMost simulation studies aim to approximate an integral, generally an\nexpected value (mean, bias, variance, MSE, probability, etc.). In low\ndimensions, methods such as Gaussian quadrature are best for estimating\nan integral but these methods don't scale well, so in higher dimensions (e.g., the usual situation with $n$ observations) we\noften use Monte Carlo techniques.\n\nTo be more concrete:\n\n- If we have a *method for estimating a model parameter* (including\n estimating uncertainty), such as a regression coefficient, what properties do\n we want the method to have and what criteria could we use?\n\n- If we have a *prediction method* (including prediction uncertainty),\n what properties do we want the method to have and what criteria\n could we use?\n\n- If we have a *method for doing a hypothesis test*, what criteria\n would we use to assess the hypothesis test? What properties do we\n want the test to have?\n\n- If we have a *method for finding a confidence interval or a prediction interval*, what\n criteria would we use to assess the interval?\n\n\n# 1. Monte Carlo considerations\n\n## Motivating example\n\nLet's consider linear regression, with observations\n$Y=(y_{1},y_{2},\\ldots,y_{n})$ and an $n\\times p$ matrix of predictors/covariates/features/variables\n$X$, where\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. If we assume that we have\n$EY=X\\beta$ and $\\mbox{Var}(Y)=\\sigma^{2}I$, then we can determine\nanalytically that we have $$\\begin{aligned}\nE\\hat{\\beta} & = & \\beta\\\\\n\\mbox{Var}(\\hat{\\beta})=E((\\hat{\\beta}-E\\hat{\\beta})^{2}) & = & \\sigma^{2}(X^{\\top}X)^{-1}\\\\\n\\mbox{MSPE}(Y^{*})=E(Y^{*}-\\hat{Y})^{2}) & = & \\sigma^{2}(1+X^{*\\top}(X^{\\top}X)^{-1}X^{*}).\\end{aligned}$$\nwhere $Y^{*}$is some new observation we'd like to predict given $X^{*}$.\n\nBut suppose that we're interested in the properties of standard regression\nestimation when in reality the mean is not linear in $X$ or the\nproperties of the errors are more complicated than having independent\nhomoscedastic errors. (This is always the case, but the issue is how far\nfrom the truth the standard assumptions are.) Or suppose we have a modified procedure to produce\n$\\hat{\\beta}$, such as a procedure that is robust to outliers. In those\ncases, we cannot compute the expectations above analytically.\n\nInstead we decide to use a Monte Carlo estimate. To keep the notation\nmore simple, let's just consider one element of the vector $\\beta$\n(i.e., one of the regression coefficients) and continue to call that\n$\\beta$. If we randomly generate $m$ different datasets from some\ndistribution $f$, and $\\hat{\\beta}_{i}$ is the estimated coefficient\nbased on the $i$th dataset: $Y_{i}=(y_{i1},y_{i2},\\ldots,y_{in})$, then\nwe can estimate $E\\hat{\\beta}$ under that distribution $f$ as\n$$\\hat{E}(\\hat{\\beta})=\\bar{\\hat{\\beta}}=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}$$\nOr to estimate the variance, we have\n$$\\widehat{\\mbox{Var}}(\\hat{\\beta})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-\\bar{\\hat{\\beta}})^{2}.$$\nIn evaluating the performance of regression under non-standard\nconditions or the performance of our robust regression procedure, what\ndecisions do we have to make to be able to carry out our Monte Carlo\nprocedure?\n\nNext let's think about Monte Carlo methods in general.\n\n## Monte Carlo (MC) basics\n\n### Monte Carlo overview\n\nThe basic idea is that we often want to estimate\n$\\phi\\equiv E_{f}(h(Y))$ for $Y\\sim f$. Note that if $h$ is an indicator\nfunction, this includes estimation of probabilities, e.g., for a scalar\n$Y$, we have\n$p=P(Y\\leq y)=F(y)=\\int_{-\\infty}^{y}f(t)dt=\\int I(t\\leq y)f(t)dt=E_{f}(I(Y\\leq y))$.\nWe would estimate variances or MSEs by having $h$ involve squared terms.\n\nWe get an MC estimate of $\\phi$ based on an iid sample of a large number\nof values of $Y$ from $f$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i}),$$ which is justified by\nthe Law of Large Numbers:\n$$\\lim_{m\\to\\infty}\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=E_{f}h(Y).$$\n\nNote that in most simulation studies, $Y$ is an entire dataset (predictors/covariates), and the \"iid\nsample\" means generating $m$ different datasets from $f$, i.e.,\n$Y_{i}\\in\\{Y_{1},\\ldots,Y_{m}\\}$ not $m$ different scalar values. If the\ndataset has $n$ observations, then $Y_{i}=(Y_{i1},\\ldots,Y_{in})$.\n\n#### Back to the regression example\n\nLet's relate that back to our regression example. In that particular\ncase, if we're interested in whether the regression estimator is biased,\nwe want to know: $$\\phi=E\\hat{\\beta},$$ where $h(Y) = \\hat{\\beta}(Y)$. We can use the Monte Carlo\nestimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}=\\widehat{E(\\hat{\\beta})}.$$\n\nIf we are interested in the variance of the regression estimator, we have\n\n$$\\phi=\\mbox{Var}(\\hat{\\beta})=E_{f}((\\hat{\\beta}-E\\hat{\\beta})^{2})$$\nand we can use the Monte Carlo estimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-E\\hat{\\beta})^{2}=\\widehat{\\mbox{Var}(\\hat{\\beta)}}$$\nwhere $$h(Y)=(\\hat{\\beta}-E\\hat{\\beta})^{2}.$$\n\nFinally note that we also need to use the Monte Carlo estimate of\n$E\\hat{\\beta}$ in the Monte Carlo estimation of the variance.\n\nWe might also be interested in the coverage of a confidence interval. In\nthat case we have $$h(Y)=1_{\\beta\\in CI(Y)}$$ and we can estimate the\ncoverage as\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}1_{\\beta\\in CI(y_{i})}.$$\nOf course we want that $\\hat{\\phi}\\approx1-\\alpha$ for a $100(1-\\alpha)$\nconfidence interval. In the standard case of a 95% interval we want\n$\\hat{\\phi}\\approx0.95$.\n\n### Simulation uncertainty (i.e., Monte Carlo uncertainty)\n\nSince $\\hat{\\phi}$ is simply an average of $m$ identically-distributed\nvalues, $h(Y_{1}),\\ldots,h(Y_{m})$, the simulation variance of\n$\\hat{\\phi}$ is $\\mbox{Var}(\\hat{\\phi})=\\sigma^{2}/m$, with\n$\\sigma^{2}=\\mbox{Var}(h(Y))$. An estimator of\n$\\sigma^{2}=E_{f}((h(Y)-\\phi)^{2})$ is $$\\begin{aligned}\n\\hat{\\sigma}^{2} & = & \\frac{1}{m-1}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}\\end{aligned}$$\nSo our MC simulation error is based on\n$$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\frac{\\hat{\\sigma}^{2}}{m}=\\frac{1}{m(m-1)}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}.$$\nNote that this is particularly confusing if we have\n$\\hat{\\phi}=\\widehat{\\mbox{Var}(\\hat{\\beta})}$ because then we have\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$!\n\nThe simulation variance is $O(\\frac{1}{m})$ because we have $m^{2}$ in\nthe denominator and a sum over $m$ terms in the numerator.\n\nNote that in the simulation setting, the randomness in the system is\nvery well-defined (as it is in survey sampling, but unlike in most other\napplications of statistics), because it comes from the RNG that we\nperform as part of our attempt to estimate $\\phi$. Happily, we are in\ncontrol of $m$, so in principle we can reduce the simulation error to as\nlittle as we desire. Unhappily, as usual, the simulation standard error goes down\nwith the square root of $m$.\n\n> **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([7., 4., 7., 6., 5., 4., 1., 3., 5., 3., 4., 2., 4., 1., 5., 2., 2.,\n 7., 0., 4., 4., 5., 7., 5., 3.]), array([0.03269085, 0.07118632, 0.10968179, 0.14817726, 0.18667273,\n 0.2251682 , 0.26366367, 0.30215914, 0.34065461, 0.37915008,\n 0.41764556, 0.45614103, 0.4946365 , 0.53313197, 0.57162744,\n 0.61012291, 0.64861838, 0.68711385, 0.72560932, 0.76410479,\n 0.80260026, 0.84109574, 0.87959121, 0.91808668, 0.95658215,\n 0.99507762]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-pdf/unnamed-chunk-4-3.pdf){fig-pos='H'}\n:::\n:::\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0 **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([6., 7., 3., 2., 2., 8., 4., 4., 3., 6., 5., 0., 5., 7., 3., 3., 6.,\n 1., 1., 2., 5., 5., 5., 3., 4.]), array([4.21358655e-04, 4.03791474e-02, 8.03369361e-02, 1.20294725e-01,\n 1.60252514e-01, 2.00210302e-01, 2.40168091e-01, 2.80125880e-01,\n 3.20083669e-01, 3.60041457e-01, 3.99999246e-01, 4.39957035e-01,\n 4.79914824e-01, 5.19872612e-01, 5.59830401e-01, 5.99788190e-01,\n 6.39745979e-01, 6.79703767e-01, 7.19661556e-01, 7.59619345e-01,\n 7.99577134e-01, 8.39534922e-01, 8.79492711e-01, 9.19450500e-01,\n 9.59408289e-01, 9.99366077e-01]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-pdf/unnamed-chunk-4-3.pdf){fig-pos='H'}\n:::\n:::\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0)\n```\n:::\n\n```{.python .cell-code}\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-pdf/unnamed-chunk-11-1.pdf){fig-pos='H'}\n:::\n:::\n", "supporting": [ "unit9-sim_files" ], diff --git a/_freeze/units/unit9-sim/figure-html/unnamed-chunk-11-1.png b/_freeze/units/unit9-sim/figure-html/unnamed-chunk-11-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0fdcae23311954dc32f21b40f3da2722aac5ff2f GIT binary patch literal 30386 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 z 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 Lj=uc$%=Lc&vW}D8 literal 33792 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 diff --git a/_freeze/units/unit9-sim/figure-html/unnamed-chunk-4-3.png b/_freeze/units/unit9-sim/figure-html/unnamed-chunk-4-3.png index 28258edee11b20eeff835ae53de18ced477cd808..314cbeb4e8fb3aef0d5e5caabb19950e3496a9a0 100644 GIT binary patch literal 232640 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%0Dn_B~6=i|CVR` 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


!Gh6FhS?F+U-5a>-7D1l$NPv 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%0AJXLy=3S=1h7PO>I~l{H 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
#I@shyR9&(o?Hcq}-ynH29wW-=Ri1 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 z

kYI$5a%IEeWcVbMAOAu#ljv<={>Bbvg=4 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 literal 0 HcmV?d00001 diff --git a/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-2-1.pdf b/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-2-1.pdf index 64d1f5bdd82e6f9fc7ab4713697c771a68e7a6d2..994bd982c077a246c0fb418dfaf1627b4d0b813b 100644 GIT binary patch delta 3215 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 Fe*j1{RfPZm diff --git a/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-4-3.pdf b/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-4-3.pdf index 642c0f929ab3650ac0e10675a38e34fe61f73a52..2a2d14bb47114f104a56072a68fa1b0974a3367b 100644 GIT binary patch delta 6065 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 F{{bAq$MygK delta 6119 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 TNJCj^Qc*E7E-n>aRkHsA)WJPv diff --git a/units/unit9-sim.qmd b/units/unit9-sim.qmd index f8072c5..715c693 100644 --- a/units/unit9-sim.qmd +++ b/units/unit9-sim.qmd @@ -917,3 +917,11 @@ the features of $f$. Monahan recommends the ratio of uniforms, particularly a version for discrete distributions (p. 323 of the 2nd edition). + +Debugging: + +```{python} +u = np.random.normal(size=20) +plt.hist(u) +plt.show() +``` From 65f45e44ba9da0133c0d237ebb8d38af2122bdb4 Mon Sep 17 00:00:00 2001 From: Christopher Paciorek Date: Wed, 25 Oct 2023 12:57:44 -0700 Subject: [PATCH 06/17] still debugging unit 9 figs --- .../units/unit9-sim/execute-results/html.json | 4 ++-- .../units/unit9-sim/execute-results/tex.json | 4 ++-- .../figure-html/unnamed-chunk-2-1.png | Bin 32918 -> 32569 bytes .../figure-html/unnamed-chunk-4-3.png | Bin 232640 -> 239812 bytes .../figure-pdf/unnamed-chunk-2-1.pdf | Bin 8919 -> 9033 bytes .../figure-pdf/unnamed-chunk-4-3.pdf | Bin 15767 -> 15790 bytes units/unit9-sim.qmd | 8 -------- 7 files changed, 4 insertions(+), 12 deletions(-) diff --git a/_freeze/units/unit9-sim/execute-results/html.json b/_freeze/units/unit9-sim/execute-results/html.json index 078c4c1..0ab142a 100644 --- a/_freeze/units/unit9-sim/execute-results/html.json +++ b/_freeze/units/unit9-sim/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "1ff2dcc025f23656ec2fac45d1321149", + "hash": "73dd2ece761033d701277fa08bc75ad5", "result": { - "markdown": "---\ntitle: \"Simulation\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-17\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\n---\n\n::: {.cell}\n\n:::\n\n\n\n[PDF](./unit9-sim.pdf){.btn .btn-primary}\n\n\nReferences:\n\n- Gentle: Computational Statistics\n- Monahan: Numerical Methods of Statistics\n\nMany (most?) statistical papers include a simulation (i.e., Monte Carlo)\nstudy. Many papers on machine learning methods also include a simulation\nstudy. The basic idea is that closed-form mathematical analysis of the properties of\na statistical or machine learning method/model is often hard to do. Even\nif possible, it usually involves approximations or simplifications. A\ncanonical situation in statistics is that we have an asymptotic result\nand we want to know what happens in finite samples, but often we do not\neven have the asymptotic result. Instead, we can estimate mathematical\nexpressions using random numbers. So we design a simulation study to\nevaluate the method/model or compare multiple methods. The result is\nthat the researcher carries out an experiment (on the computer, sometimes called *in silico*), generally varying\ndifferent factors to see what has an effect on the outcome of interest.\n\nThe basic strategy generally involves simulating data and then using the\nmethod(s) on the simulated data, summarizing the results to\nassess/compare the method(s).\n\nMost simulation studies aim to approximate an integral, generally an\nexpected value (mean, bias, variance, MSE, probability, etc.). In low\ndimensions, methods such as Gaussian quadrature are best for estimating\nan integral but these methods don't scale well, so in higher dimensions (e.g., the usual situation with $n$ observations) we\noften use Monte Carlo techniques.\n\nTo be more concrete:\n\n- If we have a *method for estimating a model parameter* (including\n estimating uncertainty), such as a regression coefficient, what properties do\n we want the method to have and what criteria could we use?\n\n- If we have a *prediction method* (including prediction uncertainty),\n what properties do we want the method to have and what criteria\n could we use?\n\n- If we have a *method for doing a hypothesis test*, what criteria\n would we use to assess the hypothesis test? What properties do we\n want the test to have?\n\n- If we have a *method for finding a confidence interval or a prediction interval*, what\n criteria would we use to assess the interval?\n\n\n# 1. Monte Carlo considerations\n\n## Motivating example\n\nLet's consider linear regression, with observations\n$Y=(y_{1},y_{2},\\ldots,y_{n})$ and an $n\\times p$ matrix of predictors/covariates/features/variables\n$X$, where\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. If we assume that we have\n$EY=X\\beta$ and $\\mbox{Var}(Y)=\\sigma^{2}I$, then we can determine\nanalytically that we have $$\\begin{aligned}\nE\\hat{\\beta} & = & \\beta\\\\\n\\mbox{Var}(\\hat{\\beta})=E((\\hat{\\beta}-E\\hat{\\beta})^{2}) & = & \\sigma^{2}(X^{\\top}X)^{-1}\\\\\n\\mbox{MSPE}(Y^{*})=E(Y^{*}-\\hat{Y})^{2}) & = & \\sigma^{2}(1+X^{*\\top}(X^{\\top}X)^{-1}X^{*}).\\end{aligned}$$\nwhere $Y^{*}$is some new observation we'd like to predict given $X^{*}$.\n\nBut suppose that we're interested in the properties of standard regression\nestimation when in reality the mean is not linear in $X$ or the\nproperties of the errors are more complicated than having independent\nhomoscedastic errors. (This is always the case, but the issue is how far\nfrom the truth the standard assumptions are.) Or suppose we have a modified procedure to produce\n$\\hat{\\beta}$, such as a procedure that is robust to outliers. In those\ncases, we cannot compute the expectations above analytically.\n\nInstead we decide to use a Monte Carlo estimate. To keep the notation\nmore simple, let's just consider one element of the vector $\\beta$\n(i.e., one of the regression coefficients) and continue to call that\n$\\beta$. If we randomly generate $m$ different datasets from some\ndistribution $f$, and $\\hat{\\beta}_{i}$ is the estimated coefficient\nbased on the $i$th dataset: $Y_{i}=(y_{i1},y_{i2},\\ldots,y_{in})$, then\nwe can estimate $E\\hat{\\beta}$ under that distribution $f$ as\n$$\\hat{E}(\\hat{\\beta})=\\bar{\\hat{\\beta}}=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}$$\nOr to estimate the variance, we have\n$$\\widehat{\\mbox{Var}}(\\hat{\\beta})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-\\bar{\\hat{\\beta}})^{2}.$$\nIn evaluating the performance of regression under non-standard\nconditions or the performance of our robust regression procedure, what\ndecisions do we have to make to be able to carry out our Monte Carlo\nprocedure?\n\nNext let's think about Monte Carlo methods in general.\n\n## Monte Carlo (MC) basics\n\n### Monte Carlo overview\n\nThe basic idea is that we often want to estimate\n$\\phi\\equiv E_{f}(h(Y))$ for $Y\\sim f$. Note that if $h$ is an indicator\nfunction, this includes estimation of probabilities, e.g., for a scalar\n$Y$, we have\n$p=P(Y\\leq y)=F(y)=\\int_{-\\infty}^{y}f(t)dt=\\int I(t\\leq y)f(t)dt=E_{f}(I(Y\\leq y))$.\nWe would estimate variances or MSEs by having $h$ involve squared terms.\n\nWe get an MC estimate of $\\phi$ based on an iid sample of a large number\nof values of $Y$ from $f$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i}),$$ which is justified by\nthe Law of Large Numbers:\n$$\\lim_{m\\to\\infty}\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=E_{f}h(Y).$$\n\nNote that in most simulation studies, $Y$ is an entire dataset (predictors/covariates), and the \"iid\nsample\" means generating $m$ different datasets from $f$, i.e.,\n$Y_{i}\\in\\{Y_{1},\\ldots,Y_{m}\\}$ not $m$ different scalar values. If the\ndataset has $n$ observations, then $Y_{i}=(Y_{i1},\\ldots,Y_{in})$.\n\n#### Back to the regression example\n\nLet's relate that back to our regression example. In that particular\ncase, if we're interested in whether the regression estimator is biased,\nwe want to know: $$\\phi=E\\hat{\\beta},$$ where $h(Y) = \\hat{\\beta}(Y)$. We can use the Monte Carlo\nestimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}=\\widehat{E(\\hat{\\beta})}.$$\n\nIf we are interested in the variance of the regression estimator, we have\n\n$$\\phi=\\mbox{Var}(\\hat{\\beta})=E_{f}((\\hat{\\beta}-E\\hat{\\beta})^{2})$$\nand we can use the Monte Carlo estimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-E\\hat{\\beta})^{2}=\\widehat{\\mbox{Var}(\\hat{\\beta)}}$$\nwhere $$h(Y)=(\\hat{\\beta}-E\\hat{\\beta})^{2}.$$\n\nFinally note that we also need to use the Monte Carlo estimate of\n$E\\hat{\\beta}$ in the Monte Carlo estimation of the variance.\n\nWe might also be interested in the coverage of a confidence interval. In\nthat case we have $$h(Y)=1_{\\beta\\in CI(Y)}$$ and we can estimate the\ncoverage as\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}1_{\\beta\\in CI(y_{i})}.$$\nOf course we want that $\\hat{\\phi}\\approx1-\\alpha$ for a $100(1-\\alpha)$\nconfidence interval. In the standard case of a 95% interval we want\n$\\hat{\\phi}\\approx0.95$.\n\n### Simulation uncertainty (i.e., Monte Carlo uncertainty)\n\nSince $\\hat{\\phi}$ is simply an average of $m$ identically-distributed\nvalues, $h(Y_{1}),\\ldots,h(Y_{m})$, the simulation variance of\n$\\hat{\\phi}$ is $\\mbox{Var}(\\hat{\\phi})=\\sigma^{2}/m$, with\n$\\sigma^{2}=\\mbox{Var}(h(Y))$. An estimator of\n$\\sigma^{2}=E_{f}((h(Y)-\\phi)^{2})$ is $$\\begin{aligned}\n\\hat{\\sigma}^{2} & = & \\frac{1}{m-1}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}\\end{aligned}$$\nSo our MC simulation error is based on\n$$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\frac{\\hat{\\sigma}^{2}}{m}=\\frac{1}{m(m-1)}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}.$$\nNote that this is particularly confusing if we have\n$\\hat{\\phi}=\\widehat{\\mbox{Var}(\\hat{\\beta})}$ because then we have\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$!\n\nThe simulation variance is $O(\\frac{1}{m})$ because we have $m^{2}$ in\nthe denominator and a sum over $m$ terms in the numerator.\n\nNote that in the simulation setting, the randomness in the system is\nvery well-defined (as it is in survey sampling, but unlike in most other\napplications of statistics), because it comes from the RNG that we\nperform as part of our attempt to estimate $\\phi$. Happily, we are in\ncontrol of $m$, so in principle we can reduce the simulation error to as\nlittle as we desire. Unhappily, as usual, the simulation standard error goes down\nwith the square root of $m$.\n\n> **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([6., 5., 5., 6., 5., 3., 1., 5., 8., 4., 3., 0., 2., 2., 3., 5., 5.,\n 7., 4., 4., 3., 3., 2., 6., 3.]), array([0.01516659, 0.05451316, 0.09385973, 0.13320631, 0.17255288,\n 0.21189945, 0.25124602, 0.29059259, 0.32993916, 0.36928573,\n 0.40863231, 0.44797888, 0.48732545, 0.52667202, 0.56601859,\n 0.60536516, 0.64471174, 0.68405831, 0.72340488, 0.76275145,\n 0.80209802, 0.84144459, 0.88079116, 0.92013774, 0.95948431,\n 0.99883088]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-html/unnamed-chunk-4-3.png){width=960}\n:::\n:::\n\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0)\n```\n:::\n\n```{.python .cell-code}\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-html/unnamed-chunk-11-1.png){width=960}\n:::\n:::\n", + "markdown": "---\ntitle: \"Simulation\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-17\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\n---\n\n::: {.cell}\n\n:::\n\n\n\n[PDF](./unit9-sim.pdf){.btn .btn-primary}\n\n\nReferences:\n\n- Gentle: Computational Statistics\n- Monahan: Numerical Methods of Statistics\n\nMany (most?) statistical papers include a simulation (i.e., Monte Carlo)\nstudy. Many papers on machine learning methods also include a simulation\nstudy. The basic idea is that closed-form mathematical analysis of the properties of\na statistical or machine learning method/model is often hard to do. Even\nif possible, it usually involves approximations or simplifications. A\ncanonical situation in statistics is that we have an asymptotic result\nand we want to know what happens in finite samples, but often we do not\neven have the asymptotic result. Instead, we can estimate mathematical\nexpressions using random numbers. So we design a simulation study to\nevaluate the method/model or compare multiple methods. The result is\nthat the researcher carries out an experiment (on the computer, sometimes called *in silico*), generally varying\ndifferent factors to see what has an effect on the outcome of interest.\n\nThe basic strategy generally involves simulating data and then using the\nmethod(s) on the simulated data, summarizing the results to\nassess/compare the method(s).\n\nMost simulation studies aim to approximate an integral, generally an\nexpected value (mean, bias, variance, MSE, probability, etc.). In low\ndimensions, methods such as Gaussian quadrature are best for estimating\nan integral but these methods don't scale well, so in higher dimensions (e.g., the usual situation with $n$ observations) we\noften use Monte Carlo techniques.\n\nTo be more concrete:\n\n- If we have a *method for estimating a model parameter* (including\n estimating uncertainty), such as a regression coefficient, what properties do\n we want the method to have and what criteria could we use?\n\n- If we have a *prediction method* (including prediction uncertainty),\n what properties do we want the method to have and what criteria\n could we use?\n\n- If we have a *method for doing a hypothesis test*, what criteria\n would we use to assess the hypothesis test? What properties do we\n want the test to have?\n\n- If we have a *method for finding a confidence interval or a prediction interval*, what\n criteria would we use to assess the interval?\n\n\n# 1. Monte Carlo considerations\n\n## Motivating example\n\nLet's consider linear regression, with observations\n$Y=(y_{1},y_{2},\\ldots,y_{n})$ and an $n\\times p$ matrix of predictors/covariates/features/variables\n$X$, where\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. If we assume that we have\n$EY=X\\beta$ and $\\mbox{Var}(Y)=\\sigma^{2}I$, then we can determine\nanalytically that we have $$\\begin{aligned}\nE\\hat{\\beta} & = & \\beta\\\\\n\\mbox{Var}(\\hat{\\beta})=E((\\hat{\\beta}-E\\hat{\\beta})^{2}) & = & \\sigma^{2}(X^{\\top}X)^{-1}\\\\\n\\mbox{MSPE}(Y^{*})=E(Y^{*}-\\hat{Y})^{2}) & = & \\sigma^{2}(1+X^{*\\top}(X^{\\top}X)^{-1}X^{*}).\\end{aligned}$$\nwhere $Y^{*}$is some new observation we'd like to predict given $X^{*}$.\n\nBut suppose that we're interested in the properties of standard regression\nestimation when in reality the mean is not linear in $X$ or the\nproperties of the errors are more complicated than having independent\nhomoscedastic errors. (This is always the case, but the issue is how far\nfrom the truth the standard assumptions are.) Or suppose we have a modified procedure to produce\n$\\hat{\\beta}$, such as a procedure that is robust to outliers. In those\ncases, we cannot compute the expectations above analytically.\n\nInstead we decide to use a Monte Carlo estimate. To keep the notation\nmore simple, let's just consider one element of the vector $\\beta$\n(i.e., one of the regression coefficients) and continue to call that\n$\\beta$. If we randomly generate $m$ different datasets from some\ndistribution $f$, and $\\hat{\\beta}_{i}$ is the estimated coefficient\nbased on the $i$th dataset: $Y_{i}=(y_{i1},y_{i2},\\ldots,y_{in})$, then\nwe can estimate $E\\hat{\\beta}$ under that distribution $f$ as\n$$\\hat{E}(\\hat{\\beta})=\\bar{\\hat{\\beta}}=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}$$\nOr to estimate the variance, we have\n$$\\widehat{\\mbox{Var}}(\\hat{\\beta})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-\\bar{\\hat{\\beta}})^{2}.$$\nIn evaluating the performance of regression under non-standard\nconditions or the performance of our robust regression procedure, what\ndecisions do we have to make to be able to carry out our Monte Carlo\nprocedure?\n\nNext let's think about Monte Carlo methods in general.\n\n## Monte Carlo (MC) basics\n\n### Monte Carlo overview\n\nThe basic idea is that we often want to estimate\n$\\phi\\equiv E_{f}(h(Y))$ for $Y\\sim f$. Note that if $h$ is an indicator\nfunction, this includes estimation of probabilities, e.g., for a scalar\n$Y$, we have\n$p=P(Y\\leq y)=F(y)=\\int_{-\\infty}^{y}f(t)dt=\\int I(t\\leq y)f(t)dt=E_{f}(I(Y\\leq y))$.\nWe would estimate variances or MSEs by having $h$ involve squared terms.\n\nWe get an MC estimate of $\\phi$ based on an iid sample of a large number\nof values of $Y$ from $f$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i}),$$ which is justified by\nthe Law of Large Numbers:\n$$\\lim_{m\\to\\infty}\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=E_{f}h(Y).$$\n\nNote that in most simulation studies, $Y$ is an entire dataset (predictors/covariates), and the \"iid\nsample\" means generating $m$ different datasets from $f$, i.e.,\n$Y_{i}\\in\\{Y_{1},\\ldots,Y_{m}\\}$ not $m$ different scalar values. If the\ndataset has $n$ observations, then $Y_{i}=(Y_{i1},\\ldots,Y_{in})$.\n\n#### Back to the regression example\n\nLet's relate that back to our regression example. In that particular\ncase, if we're interested in whether the regression estimator is biased,\nwe want to know: $$\\phi=E\\hat{\\beta},$$ where $h(Y) = \\hat{\\beta}(Y)$. We can use the Monte Carlo\nestimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}=\\widehat{E(\\hat{\\beta})}.$$\n\nIf we are interested in the variance of the regression estimator, we have\n\n$$\\phi=\\mbox{Var}(\\hat{\\beta})=E_{f}((\\hat{\\beta}-E\\hat{\\beta})^{2})$$\nand we can use the Monte Carlo estimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-E\\hat{\\beta})^{2}=\\widehat{\\mbox{Var}(\\hat{\\beta)}}$$\nwhere $$h(Y)=(\\hat{\\beta}-E\\hat{\\beta})^{2}.$$\n\nFinally note that we also need to use the Monte Carlo estimate of\n$E\\hat{\\beta}$ in the Monte Carlo estimation of the variance.\n\nWe might also be interested in the coverage of a confidence interval. In\nthat case we have $$h(Y)=1_{\\beta\\in CI(Y)}$$ and we can estimate the\ncoverage as\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}1_{\\beta\\in CI(y_{i})}.$$\nOf course we want that $\\hat{\\phi}\\approx1-\\alpha$ for a $100(1-\\alpha)$\nconfidence interval. In the standard case of a 95% interval we want\n$\\hat{\\phi}\\approx0.95$.\n\n### Simulation uncertainty (i.e., Monte Carlo uncertainty)\n\nSince $\\hat{\\phi}$ is simply an average of $m$ identically-distributed\nvalues, $h(Y_{1}),\\ldots,h(Y_{m})$, the simulation variance of\n$\\hat{\\phi}$ is $\\mbox{Var}(\\hat{\\phi})=\\sigma^{2}/m$, with\n$\\sigma^{2}=\\mbox{Var}(h(Y))$. An estimator of\n$\\sigma^{2}=E_{f}((h(Y)-\\phi)^{2})$ is $$\\begin{aligned}\n\\hat{\\sigma}^{2} & = & \\frac{1}{m-1}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}\\end{aligned}$$\nSo our MC simulation error is based on\n$$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\frac{\\hat{\\sigma}^{2}}{m}=\\frac{1}{m(m-1)}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}.$$\nNote that this is particularly confusing if we have\n$\\hat{\\phi}=\\widehat{\\mbox{Var}(\\hat{\\beta})}$ because then we have\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$!\n\nThe simulation variance is $O(\\frac{1}{m})$ because we have $m^{2}$ in\nthe denominator and a sum over $m$ terms in the numerator.\n\nNote that in the simulation setting, the randomness in the system is\nvery well-defined (as it is in survey sampling, but unlike in most other\napplications of statistics), because it comes from the RNG that we\nperform as part of our attempt to estimate $\\phi$. Happily, we are in\ncontrol of $m$, so in principle we can reduce the simulation error to as\nlittle as we desire. Unhappily, as usual, the simulation standard error goes down\nwith the square root of $m$.\n\n> **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([8., 7., 1., 5., 7., 3., 2., 1., 5., 7., 3., 2., 2., 3., 2., 0., 2.,\n 6., 4., 7., 6., 5., 4., 3., 5.]), array([0.00396122, 0.04306257, 0.08216392, 0.12126527, 0.16036663,\n 0.19946798, 0.23856933, 0.27767068, 0.31677204, 0.35587339,\n 0.39497474, 0.43407609, 0.47317745, 0.5122788 , 0.55138015,\n 0.5904815 , 0.62958286, 0.66868421, 0.70778556, 0.74688691,\n 0.78598827, 0.82508962, 0.86419097, 0.90329232, 0.94239368,\n 0.98149503]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-html/unnamed-chunk-4-3.png){width=960}\n:::\n:::\n\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0 **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([6., 7., 3., 2., 2., 8., 4., 4., 3., 6., 5., 0., 5., 7., 3., 3., 6.,\n 1., 1., 2., 5., 5., 5., 3., 4.]), array([4.21358655e-04, 4.03791474e-02, 8.03369361e-02, 1.20294725e-01,\n 1.60252514e-01, 2.00210302e-01, 2.40168091e-01, 2.80125880e-01,\n 3.20083669e-01, 3.60041457e-01, 3.99999246e-01, 4.39957035e-01,\n 4.79914824e-01, 5.19872612e-01, 5.59830401e-01, 5.99788190e-01,\n 6.39745979e-01, 6.79703767e-01, 7.19661556e-01, 7.59619345e-01,\n 7.99577134e-01, 8.39534922e-01, 8.79492711e-01, 9.19450500e-01,\n 9.59408289e-01, 9.99366077e-01]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-pdf/unnamed-chunk-4-3.pdf){fig-pos='H'}\n:::\n:::\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0)\n```\n:::\n\n```{.python .cell-code}\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-pdf/unnamed-chunk-11-1.pdf){fig-pos='H'}\n:::\n:::\n", + "markdown": "---\ntitle: \"Simulation\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-17\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\n---\n\n::: {.cell}\n\n:::\n\n\n[PDF](./unit9-sim.pdf){.btn .btn-primary}\n\n\nReferences:\n\n- Gentle: Computational Statistics\n- Monahan: Numerical Methods of Statistics\n\nMany (most?) statistical papers include a simulation (i.e., Monte Carlo)\nstudy. Many papers on machine learning methods also include a simulation\nstudy. The basic idea is that closed-form mathematical analysis of the properties of\na statistical or machine learning method/model is often hard to do. Even\nif possible, it usually involves approximations or simplifications. A\ncanonical situation in statistics is that we have an asymptotic result\nand we want to know what happens in finite samples, but often we do not\neven have the asymptotic result. Instead, we can estimate mathematical\nexpressions using random numbers. So we design a simulation study to\nevaluate the method/model or compare multiple methods. The result is\nthat the researcher carries out an experiment (on the computer, sometimes called *in silico*), generally varying\ndifferent factors to see what has an effect on the outcome of interest.\n\nThe basic strategy generally involves simulating data and then using the\nmethod(s) on the simulated data, summarizing the results to\nassess/compare the method(s).\n\nMost simulation studies aim to approximate an integral, generally an\nexpected value (mean, bias, variance, MSE, probability, etc.). In low\ndimensions, methods such as Gaussian quadrature are best for estimating\nan integral but these methods don't scale well, so in higher dimensions (e.g., the usual situation with $n$ observations) we\noften use Monte Carlo techniques.\n\nTo be more concrete:\n\n- If we have a *method for estimating a model parameter* (including\n estimating uncertainty), such as a regression coefficient, what properties do\n we want the method to have and what criteria could we use?\n\n- If we have a *prediction method* (including prediction uncertainty),\n what properties do we want the method to have and what criteria\n could we use?\n\n- If we have a *method for doing a hypothesis test*, what criteria\n would we use to assess the hypothesis test? What properties do we\n want the test to have?\n\n- If we have a *method for finding a confidence interval or a prediction interval*, what\n criteria would we use to assess the interval?\n\n\n# 1. Monte Carlo considerations\n\n## Motivating example\n\nLet's consider linear regression, with observations\n$Y=(y_{1},y_{2},\\ldots,y_{n})$ and an $n\\times p$ matrix of predictors/covariates/features/variables\n$X$, where\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. If we assume that we have\n$EY=X\\beta$ and $\\mbox{Var}(Y)=\\sigma^{2}I$, then we can determine\nanalytically that we have $$\\begin{aligned}\nE\\hat{\\beta} & = & \\beta\\\\\n\\mbox{Var}(\\hat{\\beta})=E((\\hat{\\beta}-E\\hat{\\beta})^{2}) & = & \\sigma^{2}(X^{\\top}X)^{-1}\\\\\n\\mbox{MSPE}(Y^{*})=E(Y^{*}-\\hat{Y})^{2}) & = & \\sigma^{2}(1+X^{*\\top}(X^{\\top}X)^{-1}X^{*}).\\end{aligned}$$\nwhere $Y^{*}$is some new observation we'd like to predict given $X^{*}$.\n\nBut suppose that we're interested in the properties of standard regression\nestimation when in reality the mean is not linear in $X$ or the\nproperties of the errors are more complicated than having independent\nhomoscedastic errors. (This is always the case, but the issue is how far\nfrom the truth the standard assumptions are.) Or suppose we have a modified procedure to produce\n$\\hat{\\beta}$, such as a procedure that is robust to outliers. In those\ncases, we cannot compute the expectations above analytically.\n\nInstead we decide to use a Monte Carlo estimate. To keep the notation\nmore simple, let's just consider one element of the vector $\\beta$\n(i.e., one of the regression coefficients) and continue to call that\n$\\beta$. If we randomly generate $m$ different datasets from some\ndistribution $f$, and $\\hat{\\beta}_{i}$ is the estimated coefficient\nbased on the $i$th dataset: $Y_{i}=(y_{i1},y_{i2},\\ldots,y_{in})$, then\nwe can estimate $E\\hat{\\beta}$ under that distribution $f$ as\n$$\\hat{E}(\\hat{\\beta})=\\bar{\\hat{\\beta}}=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}$$\nOr to estimate the variance, we have\n$$\\widehat{\\mbox{Var}}(\\hat{\\beta})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-\\bar{\\hat{\\beta}})^{2}.$$\nIn evaluating the performance of regression under non-standard\nconditions or the performance of our robust regression procedure, what\ndecisions do we have to make to be able to carry out our Monte Carlo\nprocedure?\n\nNext let's think about Monte Carlo methods in general.\n\n## Monte Carlo (MC) basics\n\n### Monte Carlo overview\n\nThe basic idea is that we often want to estimate\n$\\phi\\equiv E_{f}(h(Y))$ for $Y\\sim f$. Note that if $h$ is an indicator\nfunction, this includes estimation of probabilities, e.g., for a scalar\n$Y$, we have\n$p=P(Y\\leq y)=F(y)=\\int_{-\\infty}^{y}f(t)dt=\\int I(t\\leq y)f(t)dt=E_{f}(I(Y\\leq y))$.\nWe would estimate variances or MSEs by having $h$ involve squared terms.\n\nWe get an MC estimate of $\\phi$ based on an iid sample of a large number\nof values of $Y$ from $f$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i}),$$ which is justified by\nthe Law of Large Numbers:\n$$\\lim_{m\\to\\infty}\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=E_{f}h(Y).$$\n\nNote that in most simulation studies, $Y$ is an entire dataset (predictors/covariates), and the \"iid\nsample\" means generating $m$ different datasets from $f$, i.e.,\n$Y_{i}\\in\\{Y_{1},\\ldots,Y_{m}\\}$ not $m$ different scalar values. If the\ndataset has $n$ observations, then $Y_{i}=(Y_{i1},\\ldots,Y_{in})$.\n\n#### Back to the regression example\n\nLet's relate that back to our regression example. In that particular\ncase, if we're interested in whether the regression estimator is biased,\nwe want to know: $$\\phi=E\\hat{\\beta},$$ where $h(Y) = \\hat{\\beta}(Y)$. We can use the Monte Carlo\nestimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}=\\widehat{E(\\hat{\\beta})}.$$\n\nIf we are interested in the variance of the regression estimator, we have\n\n$$\\phi=\\mbox{Var}(\\hat{\\beta})=E_{f}((\\hat{\\beta}-E\\hat{\\beta})^{2})$$\nand we can use the Monte Carlo estimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-E\\hat{\\beta})^{2}=\\widehat{\\mbox{Var}(\\hat{\\beta)}}$$\nwhere $$h(Y)=(\\hat{\\beta}-E\\hat{\\beta})^{2}.$$\n\nFinally note that we also need to use the Monte Carlo estimate of\n$E\\hat{\\beta}$ in the Monte Carlo estimation of the variance.\n\nWe might also be interested in the coverage of a confidence interval. In\nthat case we have $$h(Y)=1_{\\beta\\in CI(Y)}$$ and we can estimate the\ncoverage as\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}1_{\\beta\\in CI(y_{i})}.$$\nOf course we want that $\\hat{\\phi}\\approx1-\\alpha$ for a $100(1-\\alpha)$\nconfidence interval. In the standard case of a 95% interval we want\n$\\hat{\\phi}\\approx0.95$.\n\n### Simulation uncertainty (i.e., Monte Carlo uncertainty)\n\nSince $\\hat{\\phi}$ is simply an average of $m$ identically-distributed\nvalues, $h(Y_{1}),\\ldots,h(Y_{m})$, the simulation variance of\n$\\hat{\\phi}$ is $\\mbox{Var}(\\hat{\\phi})=\\sigma^{2}/m$, with\n$\\sigma^{2}=\\mbox{Var}(h(Y))$. An estimator of\n$\\sigma^{2}=E_{f}((h(Y)-\\phi)^{2})$ is $$\\begin{aligned}\n\\hat{\\sigma}^{2} & = & \\frac{1}{m-1}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}\\end{aligned}$$\nSo our MC simulation error is based on\n$$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\frac{\\hat{\\sigma}^{2}}{m}=\\frac{1}{m(m-1)}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}.$$\nNote that this is particularly confusing if we have\n$\\hat{\\phi}=\\widehat{\\mbox{Var}(\\hat{\\beta})}$ because then we have\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$!\n\nThe simulation variance is $O(\\frac{1}{m})$ because we have $m^{2}$ in\nthe denominator and a sum over $m$ terms in the numerator.\n\nNote that in the simulation setting, the randomness in the system is\nvery well-defined (as it is in survey sampling, but unlike in most other\napplications of statistics), because it comes from the RNG that we\nperform as part of our attempt to estimate $\\phi$. Happily, we are in\ncontrol of $m$, so in principle we can reduce the simulation error to as\nlittle as we desire. Unhappily, as usual, the simulation standard error goes down\nwith the square root of $m$.\n\n> **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([8., 3., 3., 6., 4., 3., 2., 5., 4., 5., 4., 0., 6., 6., 4., 6., 7.,\n 4., 6., 1., 2., 2., 1., 5., 3.]), array([4.21866002e-04, 4.02005301e-02, 7.99791941e-02, 1.19757858e-01,\n 1.59536522e-01, 1.99315186e-01, 2.39093850e-01, 2.78872514e-01,\n 3.18651178e-01, 3.58429842e-01, 3.98208507e-01, 4.37987171e-01,\n 4.77765835e-01, 5.17544499e-01, 5.57323163e-01, 5.97101827e-01,\n 6.36880491e-01, 6.76659155e-01, 7.16437819e-01, 7.56216483e-01,\n 7.95995147e-01, 8.35773811e-01, 8.75552475e-01, 9.15331139e-01,\n 9.55109803e-01, 9.94888467e-01]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-pdf/unnamed-chunk-4-3.pdf){fig-pos='H'}\n:::\n:::\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0Slw{x$1Gl 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 Lj=uc$%=Lc&vW}D8 diff --git a/_freeze/units/unit9-sim/figure-html/unnamed-chunk-4-3.png b/_freeze/units/unit9-sim/figure-html/unnamed-chunk-4-3.png index 314cbeb4e8fb3aef0d5e5caabb19950e3496a9a0..8866624b6b1c883a7d1ac20dd45285b071088dcc 100644 GIT binary patch literal 239812 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 literal 232640 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%0Dn_B~6=i|CVR` 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


!Gh6FhS?F+U-5a>-7D1l$NPv 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%0AJXLy=3S=1h7PO>I~l{H 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
#I@shyR9&(o?Hcq}-ynH29wW-=Ri1 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 SOY3sM5O6LT8Qtp`uKxm^%-n7O delta 3228 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 diff --git a/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-4-3.pdf b/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-4-3.pdf index 2a2d14bb47114f104a56072a68fa1b0974a3367b..9d979e94952e1f0ac6d32627c607998696759a41 100644 GIT binary patch delta 6124 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 i delta 6067 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 m0_0EKJB5Y8canjKLjQZk-kvtePh_O Date: Wed, 25 Oct 2023 13:13:54 -0700 Subject: [PATCH 07/17] more monkeying --- .../units/unit9-sim/execute-results/html.json | 2 +- .../units/unit9-sim/execute-results/tex.json | 4 ++-- .../figure-html/unnamed-chunk-2-1.png | Bin 32569 -> 32379 bytes .../figure-html/unnamed-chunk-4-3.png | Bin 239812 -> 230924 bytes .../figure-pdf/unnamed-chunk-2-1.pdf | Bin 9033 -> 9007 bytes .../figure-pdf/unnamed-chunk-4-3.pdf | Bin 15790 -> 15754 bytes .../figure-html/unnamed-chunk-11-1.png | Bin 0 -> 30386 bytes .../figure-html/unnamed-chunk-2-1.png | Bin 0 -> 32569 bytes .../figure-html/unnamed-chunk-4-3.png | Bin 0 -> 239812 bytes .../figure-pdf/unnamed-chunk-11-1.pdf | Bin 0 -> 6143 bytes .../figure-pdf/unnamed-chunk-2-1.pdf | Bin 0 -> 9033 bytes .../figure-pdf/unnamed-chunk-4-3.pdf | Bin 0 -> 15790 bytes 12 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 units/unit9-sim_files/figure-html/unnamed-chunk-11-1.png create mode 100644 units/unit9-sim_files/figure-html/unnamed-chunk-2-1.png create mode 100644 units/unit9-sim_files/figure-html/unnamed-chunk-4-3.png create mode 100644 units/unit9-sim_files/figure-pdf/unnamed-chunk-11-1.pdf create mode 100644 units/unit9-sim_files/figure-pdf/unnamed-chunk-2-1.pdf create mode 100644 units/unit9-sim_files/figure-pdf/unnamed-chunk-4-3.pdf diff --git a/_freeze/units/unit9-sim/execute-results/html.json b/_freeze/units/unit9-sim/execute-results/html.json index 0ab142a..ee315a3 100644 --- a/_freeze/units/unit9-sim/execute-results/html.json +++ b/_freeze/units/unit9-sim/execute-results/html.json @@ -1,7 +1,7 @@ { "hash": "73dd2ece761033d701277fa08bc75ad5", "result": { - "markdown": "---\ntitle: \"Simulation\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-17\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\n---\n\n::: {.cell}\n\n:::\n\n\n\n[PDF](./unit9-sim.pdf){.btn .btn-primary}\n\n\nReferences:\n\n- Gentle: Computational Statistics\n- Monahan: Numerical Methods of Statistics\n\nMany (most?) statistical papers include a simulation (i.e., Monte Carlo)\nstudy. Many papers on machine learning methods also include a simulation\nstudy. The basic idea is that closed-form mathematical analysis of the properties of\na statistical or machine learning method/model is often hard to do. Even\nif possible, it usually involves approximations or simplifications. A\ncanonical situation in statistics is that we have an asymptotic result\nand we want to know what happens in finite samples, but often we do not\neven have the asymptotic result. Instead, we can estimate mathematical\nexpressions using random numbers. So we design a simulation study to\nevaluate the method/model or compare multiple methods. The result is\nthat the researcher carries out an experiment (on the computer, sometimes called *in silico*), generally varying\ndifferent factors to see what has an effect on the outcome of interest.\n\nThe basic strategy generally involves simulating data and then using the\nmethod(s) on the simulated data, summarizing the results to\nassess/compare the method(s).\n\nMost simulation studies aim to approximate an integral, generally an\nexpected value (mean, bias, variance, MSE, probability, etc.). In low\ndimensions, methods such as Gaussian quadrature are best for estimating\nan integral but these methods don't scale well, so in higher dimensions (e.g., the usual situation with $n$ observations) we\noften use Monte Carlo techniques.\n\nTo be more concrete:\n\n- If we have a *method for estimating a model parameter* (including\n estimating uncertainty), such as a regression coefficient, what properties do\n we want the method to have and what criteria could we use?\n\n- If we have a *prediction method* (including prediction uncertainty),\n what properties do we want the method to have and what criteria\n could we use?\n\n- If we have a *method for doing a hypothesis test*, what criteria\n would we use to assess the hypothesis test? What properties do we\n want the test to have?\n\n- If we have a *method for finding a confidence interval or a prediction interval*, what\n criteria would we use to assess the interval?\n\n\n# 1. Monte Carlo considerations\n\n## Motivating example\n\nLet's consider linear regression, with observations\n$Y=(y_{1},y_{2},\\ldots,y_{n})$ and an $n\\times p$ matrix of predictors/covariates/features/variables\n$X$, where\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. If we assume that we have\n$EY=X\\beta$ and $\\mbox{Var}(Y)=\\sigma^{2}I$, then we can determine\nanalytically that we have $$\\begin{aligned}\nE\\hat{\\beta} & = & \\beta\\\\\n\\mbox{Var}(\\hat{\\beta})=E((\\hat{\\beta}-E\\hat{\\beta})^{2}) & = & \\sigma^{2}(X^{\\top}X)^{-1}\\\\\n\\mbox{MSPE}(Y^{*})=E(Y^{*}-\\hat{Y})^{2}) & = & \\sigma^{2}(1+X^{*\\top}(X^{\\top}X)^{-1}X^{*}).\\end{aligned}$$\nwhere $Y^{*}$is some new observation we'd like to predict given $X^{*}$.\n\nBut suppose that we're interested in the properties of standard regression\nestimation when in reality the mean is not linear in $X$ or the\nproperties of the errors are more complicated than having independent\nhomoscedastic errors. (This is always the case, but the issue is how far\nfrom the truth the standard assumptions are.) Or suppose we have a modified procedure to produce\n$\\hat{\\beta}$, such as a procedure that is robust to outliers. In those\ncases, we cannot compute the expectations above analytically.\n\nInstead we decide to use a Monte Carlo estimate. To keep the notation\nmore simple, let's just consider one element of the vector $\\beta$\n(i.e., one of the regression coefficients) and continue to call that\n$\\beta$. If we randomly generate $m$ different datasets from some\ndistribution $f$, and $\\hat{\\beta}_{i}$ is the estimated coefficient\nbased on the $i$th dataset: $Y_{i}=(y_{i1},y_{i2},\\ldots,y_{in})$, then\nwe can estimate $E\\hat{\\beta}$ under that distribution $f$ as\n$$\\hat{E}(\\hat{\\beta})=\\bar{\\hat{\\beta}}=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}$$\nOr to estimate the variance, we have\n$$\\widehat{\\mbox{Var}}(\\hat{\\beta})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-\\bar{\\hat{\\beta}})^{2}.$$\nIn evaluating the performance of regression under non-standard\nconditions or the performance of our robust regression procedure, what\ndecisions do we have to make to be able to carry out our Monte Carlo\nprocedure?\n\nNext let's think about Monte Carlo methods in general.\n\n## Monte Carlo (MC) basics\n\n### Monte Carlo overview\n\nThe basic idea is that we often want to estimate\n$\\phi\\equiv E_{f}(h(Y))$ for $Y\\sim f$. Note that if $h$ is an indicator\nfunction, this includes estimation of probabilities, e.g., for a scalar\n$Y$, we have\n$p=P(Y\\leq y)=F(y)=\\int_{-\\infty}^{y}f(t)dt=\\int I(t\\leq y)f(t)dt=E_{f}(I(Y\\leq y))$.\nWe would estimate variances or MSEs by having $h$ involve squared terms.\n\nWe get an MC estimate of $\\phi$ based on an iid sample of a large number\nof values of $Y$ from $f$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i}),$$ which is justified by\nthe Law of Large Numbers:\n$$\\lim_{m\\to\\infty}\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=E_{f}h(Y).$$\n\nNote that in most simulation studies, $Y$ is an entire dataset (predictors/covariates), and the \"iid\nsample\" means generating $m$ different datasets from $f$, i.e.,\n$Y_{i}\\in\\{Y_{1},\\ldots,Y_{m}\\}$ not $m$ different scalar values. If the\ndataset has $n$ observations, then $Y_{i}=(Y_{i1},\\ldots,Y_{in})$.\n\n#### Back to the regression example\n\nLet's relate that back to our regression example. In that particular\ncase, if we're interested in whether the regression estimator is biased,\nwe want to know: $$\\phi=E\\hat{\\beta},$$ where $h(Y) = \\hat{\\beta}(Y)$. We can use the Monte Carlo\nestimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}=\\widehat{E(\\hat{\\beta})}.$$\n\nIf we are interested in the variance of the regression estimator, we have\n\n$$\\phi=\\mbox{Var}(\\hat{\\beta})=E_{f}((\\hat{\\beta}-E\\hat{\\beta})^{2})$$\nand we can use the Monte Carlo estimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-E\\hat{\\beta})^{2}=\\widehat{\\mbox{Var}(\\hat{\\beta)}}$$\nwhere $$h(Y)=(\\hat{\\beta}-E\\hat{\\beta})^{2}.$$\n\nFinally note that we also need to use the Monte Carlo estimate of\n$E\\hat{\\beta}$ in the Monte Carlo estimation of the variance.\n\nWe might also be interested in the coverage of a confidence interval. In\nthat case we have $$h(Y)=1_{\\beta\\in CI(Y)}$$ and we can estimate the\ncoverage as\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}1_{\\beta\\in CI(y_{i})}.$$\nOf course we want that $\\hat{\\phi}\\approx1-\\alpha$ for a $100(1-\\alpha)$\nconfidence interval. In the standard case of a 95% interval we want\n$\\hat{\\phi}\\approx0.95$.\n\n### Simulation uncertainty (i.e., Monte Carlo uncertainty)\n\nSince $\\hat{\\phi}$ is simply an average of $m$ identically-distributed\nvalues, $h(Y_{1}),\\ldots,h(Y_{m})$, the simulation variance of\n$\\hat{\\phi}$ is $\\mbox{Var}(\\hat{\\phi})=\\sigma^{2}/m$, with\n$\\sigma^{2}=\\mbox{Var}(h(Y))$. An estimator of\n$\\sigma^{2}=E_{f}((h(Y)-\\phi)^{2})$ is $$\\begin{aligned}\n\\hat{\\sigma}^{2} & = & \\frac{1}{m-1}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}\\end{aligned}$$\nSo our MC simulation error is based on\n$$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\frac{\\hat{\\sigma}^{2}}{m}=\\frac{1}{m(m-1)}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}.$$\nNote that this is particularly confusing if we have\n$\\hat{\\phi}=\\widehat{\\mbox{Var}(\\hat{\\beta})}$ because then we have\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$!\n\nThe simulation variance is $O(\\frac{1}{m})$ because we have $m^{2}$ in\nthe denominator and a sum over $m$ terms in the numerator.\n\nNote that in the simulation setting, the randomness in the system is\nvery well-defined (as it is in survey sampling, but unlike in most other\napplications of statistics), because it comes from the RNG that we\nperform as part of our attempt to estimate $\\phi$. Happily, we are in\ncontrol of $m$, so in principle we can reduce the simulation error to as\nlittle as we desire. Unhappily, as usual, the simulation standard error goes down\nwith the square root of $m$.\n\n> **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([8., 7., 1., 5., 7., 3., 2., 1., 5., 7., 3., 2., 2., 3., 2., 0., 2.,\n 6., 4., 7., 6., 5., 4., 3., 5.]), array([0.00396122, 0.04306257, 0.08216392, 0.12126527, 0.16036663,\n 0.19946798, 0.23856933, 0.27767068, 0.31677204, 0.35587339,\n 0.39497474, 0.43407609, 0.47317745, 0.5122788 , 0.55138015,\n 0.5904815 , 0.62958286, 0.66868421, 0.70778556, 0.74688691,\n 0.78598827, 0.82508962, 0.86419097, 0.90329232, 0.94239368,\n 0.98149503]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-html/unnamed-chunk-4-3.png){width=960}\n:::\n:::\n\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0 **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([5., 9., 1., 4., 2., 6., 4., 4., 5., 3., 3., 2., 2., 4., 5., 8., 1.,\n 3., 2., 6., 4., 3., 5., 5., 4.]), array([0.00489673, 0.04443965, 0.08398257, 0.12352549, 0.16306841,\n 0.20261133, 0.24215425, 0.28169717, 0.32124009, 0.36078301,\n 0.40032593, 0.43986885, 0.47941177, 0.51895469, 0.55849761,\n 0.59804053, 0.63758345, 0.67712637, 0.71666929, 0.75621221,\n 0.79575513, 0.83529805, 0.87484097, 0.91438389, 0.95392681,\n 0.99346973]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-html/unnamed-chunk-4-3.png){width=960}\n:::\n:::\n\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0 **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([8., 3., 3., 6., 4., 3., 2., 5., 4., 5., 4., 0., 6., 6., 4., 6., 7.,\n 4., 6., 1., 2., 2., 1., 5., 3.]), array([4.21866002e-04, 4.02005301e-02, 7.99791941e-02, 1.19757858e-01,\n 1.59536522e-01, 1.99315186e-01, 2.39093850e-01, 2.78872514e-01,\n 3.18651178e-01, 3.58429842e-01, 3.98208507e-01, 4.37987171e-01,\n 4.77765835e-01, 5.17544499e-01, 5.57323163e-01, 5.97101827e-01,\n 6.36880491e-01, 6.76659155e-01, 7.16437819e-01, 7.56216483e-01,\n 7.95995147e-01, 8.35773811e-01, 8.75552475e-01, 9.15331139e-01,\n 9.55109803e-01, 9.94888467e-01]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-pdf/unnamed-chunk-4-3.pdf){fig-pos='H'}\n:::\n:::\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0 **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([6., 3., 7., 2., 4., 4., 7., 3., 3., 3., 4., 2., 2., 7., 5., 3., 2.,\n 2., 7., 6., 5., 3., 2., 4., 4.]), array([0.00987381, 0.04901322, 0.08815264, 0.12729206, 0.16643148,\n 0.2055709 , 0.24471031, 0.28384973, 0.32298915, 0.36212857,\n 0.40126798, 0.4404074 , 0.47954682, 0.51868624, 0.55782566,\n 0.59696507, 0.63610449, 0.67524391, 0.71438333, 0.75352274,\n 0.79266216, 0.83180158, 0.870941 , 0.91008042, 0.94921983,\n 0.98835925]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-pdf/unnamed-chunk-4-3.pdf){fig-pos='H'}\n:::\n:::\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0``PP3d6%_ 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

LPF z6DamNl;F6}iRdqoCuh#8I7tP9CV@ZHy9mzbs;c=xbR=*&xTAYx7X2@AF(fS!&~ev% zeO5K-?G1E}tcMzshB*e-@A}6*16hj@UFzp}(wwIjZrYctDew z>UNv4>~ZnNevTT8>DDwXV@y*Wjqo+FPyl_CqbOjeG?A@mYV+LZBolcRQ>lXi4OTNI@X?oJU?g~ zkyrnxL9nz21}mptjXV@7TO@f-a3;e&p{ULlWJKuTGjP8W554V0We*qR z$Yk$#A}LpsezzkM-~ZrxzxT7`^7#ewSGS^r_43 zA5*r*CxOJ(&zC-t!Uj&=by*x!TT{>KZM1r)Ggg?ED2ccG^#{Ll;OkNR^$&e0%wA@#LGV&6 zNY#L1aQKdHrr9bU&qwLCd}*XDtVji?H?_EDcm1XXXIkPT5d^WF#JUD$waeJ5C7rvs z?4d$moIxWEo8c)K_6E z`u7X_H=eqY*7bS&Q-4 zUl=bJ802rU+Ts`6m<< zK}r0G1G9ljHwB969@&S-lE?eg+nlfbF1^e8bFYZ9@kVp;^DO2MO`*A z$4cWZK!vTV#k)P`a&39{_Z#>Q*kK6vJpO~+_Hforl6D6I$^1jGz6{n4-Zv|W3_$?8G zUU9Zu>Z_c7Pcz7bGM}dLF3#@^J89yB2^B-HFpt`)TKTUdPB-a#`?nt{1_WcnD_&&> z(t-c`!2H(7@mm2w36Es4qLk+dYXFOF8I-x7<8rbGuREFX%+FKu*z?65Aen`kt1rI6 ztFe9u@w>xI>)o>*HDPeU2ojl*+M5ZT-)sxmpLW*5^YKQ@Zp-mdi}aV*MRqRSOHeYV zzae?ui3_*EJvDC1b)nl{nU@vp0UaH2Uw;F1`H8~m?uU5#bcu=-)3zu)`dKEVtDySZ zb0K!|aAA)3Rq`Sk?|6&N6ke0psmmoS-7MC6nF*2K(Shne%iV`BM?_%ij^#@8X!~x& zSMx|Ag7=TS>h_SIkxeO{D z4IbAN*pC77;P;e2J4xP*_PbJ^?x7B6s*Tp}Pa42`&0*ctsI85pKI+~XT(i15``Nz! zhG9x3*aun_$$gYRtAZC)+`Gs>_$pt@s|fgB$NyFSy-*be-!jGFw!I;KI@j}hLw|1V z1w6^-CwoA~Bg9GV2ofahB+z*7vZxrV5XTe+yi}K7Z92O=m;>l{RScRQ?nHYv{Rq5E zvrMTQBD&@Ul4}b9spXb%NPSPu4DybQ`>LDoXH<;rVp}tm#Rf0%lSXYmX?KGQQVi<~ zlT5b}n~CzJOZ8?6Ol`efcfs-KLDZ)tX|I(KZxm^?xz-)=^Pzf7tiTz=#YA z(n=~)Qi{?I($XD6NGKiBJ%A{oq=b|R2sm^%jHF15bc1wv2|Rnw?|q;3{CCz_N7vzI z-~0Z?b$zbyu)9E>B|~|~eSGFAJJ1b2jr+&MaK7a-SGPuP9kmWpX^VBhCk14%1yD__Wn74rSD=;^h}kIyWI&}bQrnJW*vR<{uL%`Z z07($(2O?EfEBX>EK3We<%jd};@P5v6DWCr1C`W;%f{`n}X=3oC{*V4?9@rbKRDM6Q zCdcj=a$L+Zqysr8v+nIqs7cf8FqB1m72MzYnpg52 zvfZl#?V0TDL4P8TI;@s@z>w@@+K7fB=8oU*B-$}Yc{ba!qP7^epqsnKn*0vtX>6TL z@LjFOuYNl}DF(FtU^T_{n=T`HD!f(#W=i4v2Rf-gqBS=*yh!8AA=rk4oWo+<@%eEPS%mWkA0E(uCq;5DJ7vDK1*PF?LD zeeRW}ZdN%J8(4yQX>WEcHKuUjFYoWIr&5`*`-RXOTudpfv+q>q%Aw z$|}uJeFa6yQDotWFBk*<*P}c%kVsLM5(#@xhe->u`TgXx(gI^tpkN)N8aQ9phY$*K zj6<3s+TUIpOtC6v6%+nO8CWJW{wpUy%#rLsr)pCSf4~e%KhN<^K^qPwP{&apvdYH~EHx z8=knUs78`u!u5i?x0T<3*L$?M5C7JNmS7pTcUgLGY71BgdS8a<$7v24@Z%%q=muY! zb4%-g{}Dkb1)en7m*+%tfB$=N#PmM1q0TbY!TdZ+jmeUV8Q-*>0WV_AV$knP6; z&uqLBa|P)iu)0b-r^GQFfnOaG2?9mKjXjjU4Zq`0{Mbvys=4sQ>>lb#ya0tGkOi#~N&YiuyiHweghgx=}<{^a+Sn;zF|^I-(s*?H+W4_B!QS zkOQ{$@D2thHWBsZ35M6m63LnJI~55C~ zFhcMrE>E3nB^1+8?B{v?r-hx5!!NOl+MO2 zYJhI@4qAG836}&j1vAKmyklh-ZKK1iYrQmxWD$8ZjR;T8`tPUwO^1I&@^K+}`8qx5 znNyCRTW*=h7N~!JYgE40E9_N@T0X8+z{LHsW+Z93V-ehw-z@j=&r>KA1Yx?pkC-N6s88*Ms^R4X?AcZdrJI8^cQy9;}Ff zSJ)Y?zlkM$`@UFi6I`bKM`9!FlS`GM>to0!I$1`1?a>9?LMw6%A-xB%Y7q`3I`}91 zpRc}?k9?&beFEuQ7FwVfXf(21Ul!eYxQSN_ORB!}kc2biLRk9Kk{8|O-}$4%YX<`b zqDGPEUq1WX(z%drW$VT)>QN+JmXYk1IgW%%G@Lb;>h?M!&v5{r6Y}ohp|%Z=2%F6f zsp!WGd7i`lZXUsLa<1!4@j^VeZF<~LlXHwv6W7`*uMzOmCmXi`!9r@Ss6ioVFa8Og zIU=Q*RXaz4WDEz4`tK?EKwJn`MR0M20y9vt-4u!XnEsP@awDUWb!PY#-@sZ6N@wa| zq}#jIr3Njq_GpRGm+(oKgDcZF7DR8E8%@4Ot@2Q%NAFhF7J)NX$V{wY9)4#~Kd3!nc zWCseqwcBd&T~1Yp%;w8AO)P)z{m5YBmjLR*q*+@~Z7v89MqTXjrWTq%Z6wMABf`IQ z<3S@z&>q+jXE4%Hw`=r$hR%sbp}>t}b!94MQ4=6&NaQE*YSSjL@<+OZ4T}Sm)8U4} zymo39v3J#X|3%i64~+9@Ifq~^l5_t0qsedh*PCcFd{)#nqx=s9ft7ffV0RVg7YAQp zZUhD1s)23K)=@Fbdmi^ph1SupLU5<=dUvLL%DD8j9!%n7?H2h(Glkm~<%i%pMRH_l zuQYad!S$tvmtc_(3Snc@i_8plJKt#kc(eVx3c1pn8D&cGZyHTu(uQ6b+<_VyN9AiwB>b~z-JQHI1sHc%f zhcOxla%)b$WJ<7jtCe$r+Gi}>T2&tVo>I=xi{cP4Hw?+w#KpwpqK=obZa$M{bKYsJmuhvG=y%oEumYk-B;ZOn(shQHHrnKZ|5L(ZplBmq$L*ZZIfMUh(_Y2mHX7IjGxYi`A6{_(5h0_pHQXfd0uoqRc z5qn$betH`prdURm)tU5gvH~V>h3qtc{*=H<9g5VhTCipD9F(S7R4<^zBrKHu-+H4O zMM!tY6Bf-Lmv9J%N_~0Ex1Sx=C_+Dku`0L@zulU}N%}5NOVG1xN^5fS*v%R4R5Sac zI=W{GOZrc-Bi~|P8yrDRyFkM_>_aK*V$a=OR@oFJ}?wft< z8l#NGO5v7Upo4=vyBZww^BtZEUDBCH>qGCq@oD$ylwB)8--IKeOkh2NhD@5( z3Et=?l~1eJvFFbQGX{LzCYFuwpWgbFf?2Rl^Sq6c9Pd@_Iqm5B?JeUUN0)TX3BS+N zElW3hKv`w$3py;P`p|3$1xH5vS!H!TfUIh@l5WOK5*x23$Og(Kfnv7MoSiPCe8I!5 z#|3K_*^W_;W)9B2lO#(t7b%4u%0SqeAC6L%dOgpF6b*NE=ZQz@ZP`75ramLEa)6VL z!VF&TrMXEcYl&}gW*FUO$cCy)eD{G|G(Q82Hpvp$STF8wQ7P4btI8qj_p6Ehc3&O; z9fxSm=(^8L=*+J#->{2>S~;F3#dX$}&+NWkbkL>*wG>%!GxCfl|2H$jR8OLs*V;hB zCFLMpQGw&F+v$`BZAyN)!La|t!PJ!F`k!X$?SB1#28!$>D_}q*kb>vKh?pyBKYPmV zLMLqVJB-`Qcr`|rCYm7C6_ozFt;z5T73hZ=AIATVKOb?*tyte5EUdt=B^cyvziQt6iR})_JeT}Df z|F+-sMvkg}HiqkNNG1L zbID&gl6L54=gK-Mh2F=Lu11aM*4~Fs&9o^jpqT{{*^%Xc+wEHqYpK&SJ4bK-mVEJQ z$Zh4Cn=@sU^t2&E=6LMyrwkG0U{{We&!Cl6HX5VDd?m*uzjX%R1cj0^a#qyIeKLdi zzwIPm8W7N&{eA?z$RD+G^YreY&z}V-fu$(xMr#@D3yT+Q417LI&BW7e)h2Mp>VQe>S=aGij(GjL-u=Ik5e_k$3Kvxc}=M5co(dW zl(Y5~`ZG`;t^C-2BSNq`kG^h5$`W+;Qfg}M1(r`+5#U1midS+Du$zJ2Y%(S>lWkgQ zuizD3H~o}KP%1P)3bGx;Ii(cKR@QMKa{lFF^!NAK zQ&G_-2f(rzv7`S+FW%6%dM23?RB#R%&H2~dj5gy2O+|${^L^ZW+E^UCm z`T4wWc?>9avZ;-cO_31D-u%YjCyTvU3<0UUA6S~yU4Nquqf2?z;vLJRzHZld>adgO;;$%WP4^@>u&<=qz<4M&g>eYScE_WKCBV*8^U6+}8j#rDG| zHdJoeS&@Z{tA~sh>RsTMPCwE0S~q8t#2xqg&cBwUN>t{os#W{$t~8}{oM*Pr`3dWV zWa}f%d8Ht4JDn{Tl`Y+ zSUwmB;|)c?_u=*B8ef3*%w0I_E?LROBEZj z#i$1Nb0$1hvG@r17jPH;qe|{M51C-)(tzR%S;9v&VX5 zhZFh}buh?gtIvn`_Z+KkpPf`rK1HB!R1P~SKxr(1N){(GvhFi0!RL+J^A~t$&l5hB z##@ncWOOsFL?juigKzIak{f3{5)6a7IEtuTy_)41w^@F(6?|&!w-8O)QB1|_js@>% zvI{SmdHOy^^hnayP6R2jg;;xVAtoIXtiUfA%bFFZbON?ck zY3%l*(8bm?K-gR<(NwUa$zEQ+pf7RIWLs$A0Hw`?EXVJx(d_i6kI4g|O$mtH$v=no@b`1suT$MtJ-zKU5b^l0n`nf^2Wz@7ZZN&m zO*<&kY<eWlZLWHKd$C_vvEv}4tG2bkePA&XG=8NQxv@ay&-u-* zq0E*!zp)hb=nU$RPH^xJeAy#}3plfSmKY=GFp^wvf)>LDzMqv7S1LnkWsZ-5o87rHY^DK-hQ*T=6^8*Wpg|JJT=IA;$q<4qly^u$0qb zr1s?Z`RchQU+>Kp*CWX&!W!^O`pOjF=|EGRC6sTuKOtC^;_LDe;}UIj)@9qt55gm9 z1p>}>xbEDjnJ_!bD)#KM(bdO`2GA01CIUQmQw2E9iC!uBRtnnWQ_5E~xBe%C=k06n+p}mW;g|5l) z!{|RSA?zbYm|hE-vOo(oA@zc?^*|SN|Kw+oEi<*LdOHi@8>I7Ho%S13?eAbUaqKZ- z*F(9hA@&cOn&ZRa=lLED$xT;RS$+YkzhKFR<=^1qMT+B~DFS1lz8jC^3ndv9AiAxW zI$Yq{sq#xgd;EptGGiI%T;|cet)CqVWD;*5$p-0?)E7XOZQmE9-u#XFqUnc(Zd%Rd z7<98jIXLAjk|2bh_M?SIC?hd|d>_I>2(gdTex~6wdYG-yq&Xc6=k2by=6#i~&!!0zbPrxFXgaEU4t(E@j$*|4VB#WpmuFtPK zwlYN&eQZe`D{2nx^3pu~!D1Nm0;f_S43?6lzq5pIrW=v1<%3{EP2x1&U?@uzS@3B| zSByb~1X<8;%+!9Hw5{=MkUrPTj<6LI(|P=AI~@B9Xxm`^xOgO@3L1{v@ZEx<*tvhq z)Gn@VrKpkGTU9tOLE)y<2j# zH7qd4NKKpU-VsEH(G^+HpcL_+yJ)ArB+-9AKqaHuyYqpRxZaR5tI29O@a0V6)NDGb zYCV8*;E(Ku_zIr@8O&Tk5S{P8&jtLeUatt!m_^n)d>&S}#I;s=$1?>2OA8OU1VFpS zLZj?Y(8#G-cf-;prFVhWzt@G`jTI%Fh$VbB0kAuOTYS$=R|ItUJNC0pY1>T~4(E&F zSLW!^jlnAr9p=k?pQIC(92KWu`0R}4mpwep0$2>>A@4V?UofsgX*9^=DbN<;92t|rJe(QY zKA9qi(2@2dr2R&Fp^KsOp73&KJ;3`IndIu23t5UZI#Xixv#SX#{P(K4)Gj~hle=|? zS4e|a$$U{k#n^NTu|o|k8E*SXRm69=D`Hf^D0I?d76)t+J={LH)A~J(BU~8*;L)Dt zS_Qy9I^QVH4fxj?kllQi(j0a;F>DhrcKU;;&o13izutXI>FDsi*x`e75FQ~1;Bdag z5=Zak%4+{G&UN_EcAb;%H`ivj;Owb!o-4!J(VZ5<;@$95*j4UzGyiX67w=Gct&`6j zB%=Lstf)&(9g30sA??q{pm=(l^df?Ww6deX;d-`(8CAQV8DGNpTw%d0{qCmeiiZx6 zl`sC*q;?-9W?%lce?>!@_>s9Gv}GyW$=_}Z4N1_>00t|5ap7ufRdx)c4}Cp&!XNAE z>UfG*Ut3tb1tBL_5dfDC{)=+}N?r81g5uFgIC^y(uI6P$W?~749!&?db(>|~uOgw0 zax?^1O}V}3(0KOu7Pg8r^iHESmoT-jJ6{!G0xT2*ij*Ah!<8jnEiM=h;dK9K9F1|} zH3q9^ztA}b6@TR!{Fqq8hQd}T$b&FZls-&AdQgMnCKvUCqAdGXQrD5{or5jvegW?t z%*ywLUj56arz_PCV0~>36_v|^Yy&a*RRQ95q%w;vHQiw3;JQ+3>2&lX)KDn*0rz89 zB2xl5qRx42n0vylgj5stYt1)9sSS*sgY%I!W?f9=bfNFjZ+fybmEs4iS8OWopH_|; z6h79%r^1y!-2jE!4;_IB+$WEP9#I5wYGh()@sWsMySRBug+H`sff-2c@{?=A;7j{= zvDrE&zVWq7W|C^QufIVO>~HBh&?qf6TJH82Zb4HYE-{Gn8I?+<&mZWQ-e=1|R#uY% z%VE;@~(04QPlG|q7F~5PMTF)TZguZOaQ6!ZJRAftHBcQrFo28eF6IS zz4s-^7l~wMW(E*NkYLix__Y z2sC|g2wg4;6iXZ!9)sTuyrk9kv1z2zqnq%O&~0JoJZA`4;WTdW%z1MTptc|t2jota^9bJSdvB~Gcv_1)@%gcm z0p)FVG_EC^A)RlRlviixZHL;=WI;?t&w&GNe5WvURuW7tDc-&G=EHU}#;=ikKlvr3 z$Kj$D2SeZ;`?f#x6bK=eVZhZTj3n+0UM^zuU0@)a{}dk7_$~ivzI1CrvDCkKpQo-4&=+XQN!&uVAQ z;~ymPKxwM*KuAxahp^F~mB#?9Za*uAc|%}zu}B={*gauh1svXnq4=vEFAH?RcBKSY zOJxPG@}uJ}BcoO=Ak%zC^#2GU50y>rbxi&1Ed1NbQ>r<3gz>IwY%&MxET~?C?dEzp z2N_1B=2h#}XL$~JXKPKCa#-vS^2wKW8DJ>->{cH9=$eTnpuS@H_V|TJvzx#(ID)9a ziZf&U?);ktMG7a!&Z`|MVwKYS$c>^K)!*>v$oTr>Voyqd!GH|Y;{{Dw?E4GyKprw+ z^JXN^lD4-UgqD-c!I=ll#oI^c?`huL?EU=geQ2md-5N7`6s#UW{EI)}AA?IzcxI2V z;%ON!JxoF0VX&Ji||GqJ7}07jIAU6EPdn9;CKOHUje&$c82D zIF@~YkIUxltD1`}5GI1^%edh6Luf%Iu(WMDku##0GTsP@=dpcNqL2`3H;YpwL{m!g zXhraorWhP`)IRHvGI*{uLV*CX`kVNs?tbp^FQoQgHY7A1vC+HKyy1Ry+A;pEv=eCg ziPh-|64v+%Q@MN1%fYgTpQa4=$rnYc^zj-J%5g!Be4h&M?vkUEgdZz)GvFQl4ZytCXZuTs zj)414EPi`n(8{yLpYapi_148IuCfF%E+TXF707XXU|DljnVwbfB5cftxOA6zco!`fZ8cTQ(wM` zW=Zf2uw}@U`g&idDR&@1i}y;TlAD^^sLlkbn^U!#XR{!;V|CP4 z&SKQP2G_~;$SL+_h?^xp8K&Xqr}{fxU}qB97lT|IYCE#H_2hY#YFYf$3gXAB2UN3o zwR()j!pypH1a+nT?Hh?K<;y2Jz9GMF_ZQy9V^I;e|JoZgFSw);lcv>00&NE13{7K6 zQF#s~yfq2K{mOD{D^!^pJpr6DYfymPO^lE_YAiyGP&8b>{#IZ@BO_Ds#bc#`#0QeX zgaW-D6`H*`MrHA zka^=a3%@Ctqa{3oYivT1kH|yLD8q~T%s^(v@~m<$8~J~jUcwZxHdKKHU?Z&nkX|9m z93V$4ybhKJieKfCeVj+xjqgel!5!FLFuHMBRvupC?^udIOTdF*NhNX&q?xRyOB#LUwO zIo&SE1iZsN5=*X4YK9UitSA{b0y#Aefd&cadrY=V0F+!vnIWp3(yRuIts=3Kme!hfRmDx;Wm#hJMv;RZXs*E=J{I(-~$CbNG8J zbYNW!lN;}xh2~uJb$pOnz^H|UrUJ<>uK;)Nylo2@_sOPaiK-QTwI|b6DLJv(#y?A* z1rnI)v+af7)|okv>s&c+@B(<^2&bj$H-Rm!*0g!#zp_VHb?KBApCgO8KK7eE_~U9P z=kyj)+qvK(@OXd0HQviPKV?M;DbkIX%;$S_r4Q7dx%f&E<6 z`E-XDt$y?d><-HFQ1-wRN8aW5JX=UBMURVyh^DKZg4xxLWyB;s@$~p2})Z;t0r53y+sta#M`UmY` z*|XJ+H6{=;5Vq%Y>((vS9cmhyw}_;_Kjxm;%7`()(&jMJ(Bprv zFVRi*R3YvISkUb0>f?UIbu!GDU{M~SE*(9l**j13zto5k*01&8{HqM5`J25o;nA~& zPFbvBEpgtcNm(s=NP4>Rbef3O2f{*jJ;ui)dA+loYu#OhfBx6dM23aFROw7lJ1_xA zS*FC2s^J9rkiMrB7IAw9M(VE7@1pOg!jdRA##!Huerzp@q%IoL*GB+;ciLmEcr|9x zex;zHOgImp>{gJ?fo++<5Ik0RkA_%FJ{BIFw>$Khaw zFa^3^+14!XUWTWJ1Xkt!=|C96d;Eu*PPE=j{$grp>XM;w;xY+KxK@sGRGRY)GU7{i zjsG{B)eU|-Cw8sJthT2+qgpPzE;BMm<$quk`?Bifcgkv+?`R*(gu%wrYH`M1?=7@H zyPm0Y%Rep!!88vu*G8mYl3;W}kR^6R0=V$a|K6;bgAmI9x&vu!F4d?>K;zy9D9ZIp zB+h0*)WGvboq7fW|IY>z-Jg{IYrz=|b$cz>GqlJsQbcoeQY>_29)k~pvMiC{bYDqCL=q*AQeRg%a&IGAudEmf&eG~>AFzAocWJ!?FSnMWkqNY&IlKmF{rWP-gQ}I=F6_P zb;(yC$a5366>CBmOn5vJ!=-ka2!@T4vUO;XGXip3P?`$oG_T7?&6Z@H+3zbjYtrb6 zj(NK>_l>Gck>5)Lk42(@*`)oXdf4zCsQ{e=Q}zayg=L%PFYe!1pXU^7AYmw$s}-o7 z683uVQP%x6=;q80&L&9N3BMo>0GvZ2iNB%;cW5q{H47~Z@w{)t`}W-cV}EaS(cdmc5n%1{&r#@PiB zcW0F@FsOa@-&+F}jYFj<1W3`9$XeQ6WSn#Ml3uElY;}QXY^)M>zoZ|u z2`{9j0q7jH&kg1`bUvHhU_5oXVM4!tlmZ`+4E$MvtP~<2ucYM#67p%fQ41s9YJPy= zn>6p)=97oGXnzVmco-uK-5fB+k(R4eeM(D@Wxh6EhS#s*%=)3QNLVTGelzw2xBhMxRaaDWK|J!sOUm##w{+Z3`Vx~w5a*Ud-j6r|Mu`-HY{K_d zK$ieSfSqGIb*4IrJ5`1h18i`obA-e64ezB6$tAyLU+;+B>fU;05&=5@!n{!hFGYi{ zrWKCORr{>y2hF^_HZfa$#or-9?r1P{!s~l%liW~OB_nnEv|LyiPpMX#~wH;_s3>)erDL~hj zQd10+@mf-dqS`BqfYj&<{WI5s!LJkf$!)5ri@alnoQqs~(FzCV(hESm^0wMS?U%B_ zoAV&%Dgvt^)4}yD2B$$7x->cSUWUZlT3Ph%tiy<`yA)XS?HLcbs{=0_~z>w%) zMl$Y4GE9(tVHn)iM};r#okPojGLNz=0Zn3o_fX4UgM~(^AiKfSR~g{1*Dv^OSD>TX zhG4nn%iW)^7uRCB!4U^!qrjL{3-i3<2$*v$n;Fo_ntY2Vbm}$z_S*kDD~i{=KVnk$ z)9m%*^cjwS_6J3$2vgG6DCVH&s8*N4O@mF~{m>jv*Cnu;?7D4S@uzJ$85NN8rZkD# zR@5{Ko9Ohcy$72JmiMD$AuJ5P4rFkG<`{)TnBmcUG5yu}8f2@k^nf&koonNBYzi!h ziQDVh0{MZ0e|%7;7UmIa0xPkwBo>3(@B}LZ!4WFNy|en-B%v#6t&|?u9QNJJR0# z4QI#}IRjftxE2?=AHHt?3zOSa9V2{%$o8e*UQ7{u*{hhYv0r^pY`jXTrqT}59&VJ5;ftc!pCRT_ z!4*&UTpMvCWkXhs9$*4m>V_?OMN3*2+9THfm-ak+bzJ>lc)-Ib5h?5lwqNvQ09yhZ zfG}T>NbB5A{%3f}V_dJ^os%2^$ELV|xDrHhK%d~s!2El96=`X4FnsYfyVseIjc~)pEBesaJdY_1R>B$5C+o_a>q4hyquD@`hUhuZ5J~nTau!2O${`cl{$Z20mkJRk?hFMPyo62Jn(#?&kX& zKBEht9tI8XxJr5$b7TyU##n!izfG_TG^?8e6^J>7>x)XXm=|%w_uGd~0AHrZGdI$Z zO!hq77P%t!ne3$xBv<`TQ9T8cChGvCe*donCoSpv%bG{Qq|F6ZK-~F!SG8RUNqhqhPc)b{R{=i0I^>6HG-Jrpfo71T76E-io?)vHi zkoG~cXD0ToQ`rs$8@*L6_@sJ=r)ing6#C&nY@C!M4-R z2Fl4^;07J8n>iISi+bjlzU`qTb&82HH`Ow-QC3t4Jf$Z)kFvz z9NpuzI5Gh3LkybQVIXH%vOMxWeRHk#KCnkU2bX7CkbR&3NKcj383V3~jFu^JoRoozx*Jjel>S3PJC9e;j4qhLT8 zexCAOHdHzA!_6*^T~eGn6i=}#Kwg|*^No`Y-I%aITE*smOasKq^UI(156dZ;6+8DI zalNrjowik5lQ(w`{uM#Y#xw|{+8F6uqMkjyaS7sRv!C?|1SfDB${HCNRbZn%uv?nC zou-RbY(yGE^YPWij%t+1{!Js0bL@&u@!VhP{ti;{>gwyQn=e7M4Ol0F2tEEmkQ+z< zGU;CIY6dbpb7WWsmU9GIr?1>A&i9NStCCVHLGi7E#lL~xL4P9e#8s@lP5!ub-tkyY zqt4j@UJ}z`dS{qSX>XOA*#o;>H>aUR>en45AA=VUFDNfQM)I@OB`H&d*O%aKWf_%A zYXjA&^AUo9oxo~(G4{0REggo6U=?3EFkx={wO;CDJ#1SavM_R-ny)2_8e;8R*xSm$ zbpoJbH)k&Z-+oyYyCoq8qC5w{#BB|X-huDa3kQT}_ z?Y&WmJ*kTH5x=ZO(HNcRVS4%};UU&Ok0PVrIy-USY{?>clcdD#{AJc5uRzKWKYxx4 zwE4v{+|X2q{lLcp_D7KAb`~ysY2{%mUr9#*>tIJQ0e6I906+0&F*(AiXimi(IXBwF zebIX|?QheXv2(m^w0PL&eLZV1&U054O4A23&_V$5w5xF+l{IXPJ4BUa*SRr&N(&-P zH&w)+J({w$z!4uLsr!V2Qr*%d8i@IhE>Nz5AjlB=Dj|+iaj?-Q!Dc_PBVcUydBZ_p zgtzDY8)deWJOZ2Hpw5gj^$n#_!~-@G2Y?D^dNv!y872mK__N=iB=LnyQhx4~oR1ZDjynq%9Y_qJ zJ!B_2_};+1{c2(8KxF=6wwt-|8jDg=#GosFBnAsno?6pGdHE;LlJ$Xjx+e5Gp zMS?GRY1+F)-%VLtU~{jT7gB@Zp?+Cct8-2T1#Ox2Yn(wkS*S+~v?X{lASx8`+E(mR z@um_I(rOb4+Tg{hG$t?j4$iLom>=d3;Dw;%(ClXGSBiGWO;ZS0eAW(iW2Q7 zoiTTC{7h*48w*Ywzr34?O@5-MuLuoo!`&4l@V0L46IGa1<_3>*QA(mz`kPk9h=@($ zj2Z={MTp&^(qCf~KYrV+Dp(ir5?Ei<6(|P= zvZvHcsLQBQBjo3Lz@u2^1}qF}!*Dkv;a7`5tsN=+D@da?=~mQq(v{dbLz?GoyxsQb zBa{rw2hjsl;7KcjY-7F1v)#j>wR@gCLUHsiw@05*QV;%Q&{a~RuxaHaHOcNKcfG(W z!Wl`uvkxP~+#k(@8A?JQYexBq{bYz9p|~gb-M}b;P?@{`6*_;yy_%W<{e2p*21HsA z71QocpOlgk?oQ8;X+mjqIKSZeunbdW(2`?XcB*}p77&GDAO4)Om1#ioNqYD?9h}q2 zwlrVHz$JV#>#CGtS!JCT>Q<~2Wav?R7yW2GO4g4rfUIWZen?Q=TvY35TT!ir6*(_< zmB!<0`+7)9peb^K+bkL408X)r&X1kmsQzOhVlEHzPghG5?=~S@G`M9`vreCtA|v9P zw!YvWC7%W1+x*tMqCYe%=ds=X5o9-9&4)c&steq4^b3-WL_NS@e;2&>b&w*D+z6`zgKjHkLX-~EeA}_ z7>;!mJN&lZ3jQu-cw|KET8~Bx;ZI-vbT#VjOo&)q$-euY*+Ro@`k^F10-3bu5AkEM0t_`rTB7$E*@p@eGzBU zn)4Np84E^c@3!wDy4!G05^bICM)GS0?ya^L2BN5lcG%v_t`Nm)*;dln6E<=?U{@RG z5VZT;`3n~p1Zd4SkisAYw(f7Fg6xL?8e z%;zWi=X1AWo8B1L_I!eyD}T02Bl9zm<;^<1oK^iSZVQ5zyo)Dgxq>00oW)>R2KtPbV1 zCzwL*N0*KGmupK_mUr96MSwS$CyDd1s(ZN(366(EllqRXUyZ}h*)9K7A+l;=>%3O*h{ zclXMvJ7l0$tmj0a!ci+qOYdtbM zGe;_VQX=Z!AvEF0D59=QJ{d4sCL^@s4Gt>1SI!Xl#@qDYj&RIfXCp3~I={SWduqT_ z-(CF!@N?S{C1~%T=(#X<%6uQ~&OZqV)AkyN$?Zp6>*+>SoEcfHP z9Z)?-ENW16;fQ&xlVHHS#~7wp(s(N#Qk5SX7U52`p$Ef%D_1T4^d9y4ZB_5cpLQ8% zwbL7#5V7| z4Wc7rGK{CU@|(C)Kpgl`Lx~0S7}IfuUXxB9xMYI`7q3Y;zA5EGrWY>o?bv1-NDzQ2 zj;X=sw|9X#w4sK|Z~bxo+oYoeDtB>>)!w{+yqT=i4MG!_FpA(HhPAbjQFhR$kw@Q3 z2gld{9?(np#>FU0d}K#yufP6!67NP}b;dh3shz32!`taG3rbWth#N3?nqpk3OAmTQ z1F^?~{c?|^qL?0*FAxjRt&(7JtLZR3Qnhy9 z7#}c7ym7qyfJ9md9zX&%5lWDH>`~051k&^8og(V_7ykWkN}pui>GvTrH3zvUi%KJZ zy}v3n>?j^x36tZS`ro!8$AHR-qf4;9TN>IkF)48OVd#s(nE_@s`_3d~S`EXsN0V;w zp(0%xs-1n%VBQ}Euo0bc%Qu-E#(@`Bq&3jM4;eGGT+Ezyt;GcT#r-7+m2YsKVxAX* zdzp$#lM;F9?sHR!q2iCBR_^=&yCe@G06-D&X?mssA-F91>+(JiqEdZrWxEI2!SP)* zr}nK@6*L=Ha;$G$IXd5-B+DWK0twnOAkTwBhflYYTUhY5L{p7)`M<;NAURWb(57#D zQFTh+IKc@i&Z4H9mXI^{#%tWmZ~pe)m`?uiE)?Rfwq=>g?A5YqGD7rWu4?pw7~t ztkGc>dF#1M>W)5d`56LCU)G>P5#$xHmxYq@#C#V?@lh`QlAjVrV`)p-x){%7xQI|* z*#4;Pa)fGu86;%^%>}SCQ$GR%pOOgfpqf=s7#gMC@RP@d84C_#F+v5ga*djPQ~q z=e2_jj zTxk!kO)zXK*7X0kE96}p@F_IZAB*n*PQs3UdnP6I`Kg&hGK|o$<{hb+Pcog!&GpVq zms_e|K#uE~b=_)R=ZEyHi!@M4iPyD-DhdoLR&t4(c*ukL9Tv$diaOid3!2LwWNI_g zY*qb3)wENRk0jgFwWkz%Cs`3NLrV0s6@2_(L+$e*3CIX$A7Z1_r$zhPykbCr3vkWc z_X^<^Unk+ZWhXML(5Xm#Q=@AWhKo`B9jIL@4K&lmS6ISn#1!+DdA&EiG-l<>av1pK47%l&?!859k8|tCFSp@DC3=(ZA< z5x}WnFbJ{?XmW8K&9L>mT3}$@B?m9U#ndn00W6lR)WFPKgh!Hv4E#b|T`2#dk|HLA zU_`arY1K(FLjn91RTew;6BkhrYtWx~5vDUZ0vIlC!YOa}1j(ot<|(FDogWMA!X3T` zDy`29sW(Qlz&wY3TF`X=;vMjW?~vEyJ@IMe?xq;1D}71?xO83Hecq`jUiO@G#0Y=d zsU2eLk)s=m-V7l_vORPd=Vo@mQv|c^=nd*wqU0X&#mc(J-=~bYsM>!ENn(v9_QHfe z`|Hi#;yV2(->Pd?uptC#T1EJs%QBG3Dq2b09=kC=h`-y4Dl z#$9nl4G8fq3EpB2WliX23j@msgJ5|jNYvdiFA(82&Vuc_g5q=V=Q3s%oad>3jhyU! z|Fk;%VnzOo$1mb;-|9FZOiC#S?1q2*?#?c`)U!tAQjrnSm@nX?ZXD3c%F2Fh&yFHr z$?p|=Q&yW;Y#1C=RMyrTNvytx196G~Ye$<-SovOf6ubJ0?bo~~Z(*KR4X=6&?5>L1N$Kuxq(i!g7!;6@ zmM)dW0fAu&NCicCrb**)-OINE+u2g%!j9fRpA%u4@_C}7O zR0TqLe9&m|u{)8<+|o}I9SGLtukACh)CJX4kjwbZN|dOQ1o!^#_8hcdq?jKIL~I@5 z#RuG~+)2*51(5~LZ4pZ%%JkXVJVnPcZ4;2Q6y7DIuoAypn z*JYa6hm7wqTwK4<>1v2+ni4c)c~}UmEGQg7sj6Qz;{JMU!bX}pAbZ`?(B-g0sVw=P znyD__obP>h!m2wMUshm&UJ*bS|2^ROIB8nW4ywkO*Ak#G%ih<#s$-fOgS*du{d3(w zpOr~eVRzl)-Numu=<3|jg2#ZhNNn5K%)m?V;>P{(#%5I4c>7fcswUW9)LB9>*X{}Q zd(lDimiW8i6<(Yrm0q^+GyBo-Y1;@@<5Qnuf%&b+G8(H#^(m+=HLy3MX@WPpxu-FeJNGcs6t~Z*hCZwSIEl#&HspW| zYuG*R%GO9l-RSI}|Co{&qUXm=^uMAk0n2!DR6`6{Nz886nf6*;YR~L1>ZUty5etG^ z7$LztfRJF54V#bU+S~ARqt~5+Ae1x^DW{bcZm!>T-6C$~H@;0Ii-vHviBuE$#IgrL$ z?^#INvo>5{V6?OgAa!DEB6lx(2f$PXZ=u$4su;YpjK@8))A`UlIt9r0K^OK`{_7j7D&*#@e_|Go zux`usPk5=M6$3K_$wmu0Rd(|f4s}-pEH61yhiBlTFM-4$LYr*@4fgxGOyPzczNPu% zh_GbU-P_^9H_yfHI4qSB8VrsI)Q9oIvZ&pO$QBSPL>R?E4 zeV0&Cc~L|sJJNM>ynMdq{SrnitB40CGa$U*q01+T3fRMj#uBD zZwi`TI;qy{NlBMHS^uor_X1#0R&)q2)VTYxvvw;(;bIm;I7->2)lB^G+FrXp%U83x zLE!YA^~6nx@nXx*51`j&MC`uAu`IgI5!S-4M>b0^10Q^3e&4EAasmpo#oYVZ*eK#Z z9U)6j;*lw;;?p3%?IXb?{4Igh#N~&r)VzE5>5YFq1)Jiy$;KPVLs$4nh77 z9_HwNe0@`nu_LD7hufSB)K2w7eMrN)W2e5~NVLjZNOM=H4s#y3H1O^Fg&tzTvu$nI zK)qLMB6||$5Nyf2Q&}B)5SCY6o1l0=-s-$E(Mj37s>A`_p9mW@&_S)TY=^Vqe^KPv zYIthXX!m-xY?l<>v-85~P(py0$@DT9f6cg(5?Gj>s`#Ahz<66ZW5!|xh`@F@mM^R| zJ4N2tn7Bd@WrAg+KP|E(j7GnPH+D%Lvins5J))NOZWdN?zkM`_7c(cb4Xr+2PeERe zZ!dJK|7vqAfmAQVkN&XPk_QV7zeL3C=&@T#>m6CL2Vr4N=K0tN5BDYF1;t~AjA(L8 zCM9iM#Uo72IAHCQuz`+qq5%G?;S1h(=LcABZ}w%`Ja`m zlZo1PSpuCnxwJYQjukB^hId9{-p)1fuV^2_ocd+YB_+5ec*h);4+a_d2QFTk^fV{Gf{2ctUB8LIyl ztUo0SUgw2@s%KM$Ltg^$(z|qSU2T>+*Vk6_c?Eq2@wd>g7m;yHO=pLFTB$44`KLNkhR!jXSZRh%rc^BVbLA z3GkjSGW#vofpJ*_lKnFr&rkJ-zX!2FoPz1#bu0#2+B>Dxt#BAiM9(to-|AanI9H## zBMkhxC`PlTli@cennc4y{(s;R%8ney@wSx^ZmdTMMGOf~7V}NSlSn~a7jdIF-%Z;vDy&{;3Bi3@bCDQZc@l}G2s$?kB(x5d)FO($-$dDe zAq_h&4POAMXj3kdlFXRcf?%B2AT+#ZAB?FP=1FcUhv-^ zVRU;XliiB5(W<0jRv%*Not*xs`WOQDh`KN>N_)&%kbUADZ4*T6oJH%1$|s&9MW+#I zjb48Jl$k*ee(1KR%N-A+L^B^1WS!6j^kp}j!G1HVKM8+|oV836AfM(7ah}iYV-hjS?%mFh_4I!Y}t-F8TQ!zN%FcyEo^5ReXsCsj( zQ&Gd8@wjCE+dUfPTWRvNb60Z29bP;u`(|Jk$OA1Ifv z3`5;{mq(6yioHmGOf|B0TeT@K zGfl^L@#O}#99CSxznfN9ICV4sI`pXs`zL`lk>z3P-!`Ul!Jqm0UAqg7X06UCD2uP0{>OF4VM~5PoL}XJ+9fhZYxKFT5ADsPw{dekKT{|7| zYjRGk>{t@r>5nua^XgrA5jW{tGw>3--28RbT_Ij5S$Df!g{5$^^_IM%s`DT8APVb; zS?P0xa~!!bRJ;tpXfh#lhHF2H7?u&b(r?^q9SnL%(O{$s{xTM%=h>PYI6Ht@yWQ!< zhMk2e`kth2s8H-fTD|oX4tVW=vxQ5VCP75CbXVhBoDD0`1nof$u3aBtqS5s+iaG1W z%%{Jy_`oKctKg6o83|h#?Z@=^;RS3vK;w#}K!H2=2+l(=38y^03{f9cG$ka&!X^AT`1Vb;Kzf!JP)kKf9rKlA<;xpWsQ5&6 zmnFgh1Ac<(H_wxAa`t=;u$$F5a}G5i%h#RtTb0`M!7!1%bn@%W*6%A#o}#xUQqSXk ziHjRVa5g<3E!2uOwkGrHxlj2W2gFF8rLgR7HendiCZzOhL9p~|MMFauq~7epJ5JFGL_TiO1YaS{Es!EL zJQo*((}9l~&Xd?e490roxQEY3**Xd2HW4c7Hu+rggM!{xl#u~p42~s8ftW(6dSO|l zoa&5~9_QkT=DO@iwHdnymja{1hKr^Yx&-%n3p>cvLf1XWriMXeHr_;NxdJoZgu5x^ z3$~>ZFpkLG6`!6jhfIKvXA?}MeKdMFR7&{i&=It`Vi#en?*!?TWY zbN>yT6Y8R)ineGsq+@>y0z$7nI7^OBF?qgn@X7j3Y=%5c2Q`?DTa{t=&z6-dW z-@P3lI$cO|^j{$c$);RF6J4O=W_B_ckTp9FsA*cqbf#s8l+&_@-fqnzV>N8yLQ>Y( zjX9U@*xMQ?{{U)>_-K47Kg!#v~!M$)N)S#?*K>Zf2y{^ zG*b@#{Y^69e06*^@xQBWLp^peUb@lTQQIR6oDI-33JR@s`-&9`U}SgIx5|(4%kTL7 zy{?7+8)F(c?7NBMMZw$QVYTq6i+UMlGXu&|~8JW^YH4PpS^?&N+S)TK3vepH=# zuw={dkL!{ZNe$d(#gOeP3~hbLP#yB9EY(3vW!ACp;nIUoMEd3G_gK>js+?CTReYQi z1gdsFOL_P@Jbv$g8mZ!>1p*Tw++wd zG?r@EQNZoT(I166j|7-PT`I6Vdda3lhl*=UK{@)HzZdPlKQ?DQZB~eei5Pj~DKWK{kE#?EY`q(au_NDkz%4y-NX@0ZWnN<}jPn9b<&CL= z=O3(n>pPw)-8)jVKtF>3BS$)#PA&SNX}nIio&K z*13LJYOJoqFyP1oltSvn>0XI`7THwr!SKxr&N6wGChHiZXZDF&;Xg^>fv>$kf`%<^ z0@(DQrEIzdsTT(roH{IIu)yK3g$$+@pe?pdUwH2A^cNoX^17ajUu9-q#{TZ1Ap$kD zk}Pm0Z`}{nD>e`hO7P{479BPOLxky!ppoHicC`}A!-;GP#NCtoW9WyA27rdcam>FM z`JLwT$-&avND!oDeu>Q)_|!7Vro^6R!UZ0^a$O`x=|L*yuAArP>SgrmK9q<#o4A#& zumJA{(|rc9xw$iGk8)4C?w(U|jR5rrY{)bQEDU%pHA`H( z<4*_jd3R*KxsJNC{=D|wZK&W{uGfJqJ5U#Wzv8MkI=4yuekB8=Kz^kFb?VMHCwzZ@ z>~Y1EN$Xu{HQYp<<`4ld65-%H5DErq%~?k_$);q9hgp#OxEd6bKJYNUUtdy88@g-9 z^I(}D-6}X1X&xgK@_oUR@4KmsJx#F+B=N|Idy5E9G4T#F+ zlGnbRF;W1w#XJCR1w8jNbTr zRD2G>dkx{fs?i{y%r5m9{Rz74JfA%CbW5m&9M$jK9lZLN9*3GSscd?aW0^D$WGkS-52Zsp$a2!jlWN*iZ7qoh;NZb^E@!?)!93wF2 z$BG0ETQHmkd0V|E)~}KlaMh7-WN|1^xxE2bzk@A65xZFdQb~_AUD?@R_KrI;_XEDB zTI}%Y*TVXiVp8;gKHTF5*pFfPb!!G*ZVPuAV#)SDf585b5CPLGU#||slt4liBS2!L zp*w`OYL6B~pdaO47>gcj;J^CYUM^K{l&=9ADI)8X-@S@W-uT*O0RUTt{t5gUCQ>GV z%Azz^C_OZ=SDhLh63FuIyFem)*0apBB4(%y-#jLn^t=QP{Rj>U#7KIY%=4z%%Et%q zoS&K4sLF&*)vs5@u@FQ|sOd#yUVc%>F`~pZM;|GVO`i4N6o4YI{`fT0$L4E0Y0KB! zJ*P^3s-CfxTM5(PK+nQFDGihSc7?%>X3dBNm9_SgI$fL7fDr6MPdpJ%fn#ZaLz8Uj zkOTS`M`R94+&pPHI9~D=0!Oq=xP2^>)A@!Mn&c(`WMxy1UIt*`0F~1l<6p_UFw0D7 z^@EztBU^qw_q$|7O2)j62+!o!&IfD<&MgnE|7iiw0A~!##p1a|WH2<#80N1`lK+Z~zEA#7_N4kyxcOF6iA`_}0eN#}7USMHZDS zIUo1!L5d%gm|~uwibNwLWD2oPe(4td^#S+_{JyfVm;*AUJt8!-{73155+TGJJ7=qm zIs8MZm8O?qoc8Dx^7@NKiur<6vov9RjwYYH-1ku3zA5=aQfEM}YI7fdNsn9GppDg4 zIQ6GL1qxicD!cL!L#wejqOsK_iN!QRA>9c)5=b>;`Y5ic9SP*K7fO&FsmC;={9uy^ zB1pF-X>{!oposgUvG2Q8>niHo(l@Bw{Z%Ey7~{6|;ar=^&LE)O*THZIIoOcK)sx zQd83*339|u9s&_*;z$wo-Pe@~!UWcnaJWUAJ;(1Y9`CdL-GX>V(WV zZ^xX0#f=`tu0++M(V+%E@vk~s9?fd}i<1J-gOuHEwVHPgEC()yxo;=LWuvjfD#Z)0 zJpiey(|j?7B~mEJO>UMJD^EXo(CeQed<*wua`-V@E`nkwKYvSyCvc=LBsK)b1#LZ% zL%9N&p)=Rfhr~z0s${j1HYq6lvRc6a9V2er#<2u=BNmc| z24r&%#CIxIdEp)f=Ssl0Kwzqc960jLiCkN;kIU?mhxR_Q|U zWuf<^h)$dZ%i7eMCIuJY4+d1bs7^0Vl)wC>U82c4wPOA+i_ekL!HU`#`}l>63V;fM z%M9@II@>XF(Y*9Hf(W+v{ws?nFLlCI<`LA3kgis=qW-B1Pj8Op0B^uRMD}++bCK2Z zEN?BsXP zQ%`e`?3pR`7>h)T{HCjh>pPId0}=Kw`*-#-G+1n~GDxraD{$CViT#76hYrIAlpDM& z4RpYx2W2s6qX8HS!!R@273QGv!;955p%Qh@lW}QhI|sjk;1nwibJb!4$XPEz2SQi! z5vpt@wJw-O2ZA3BKKDa5wxAKh;Ap(5{rCD?MhBu@mjTp9vneV2bU%vBnUt{5JK?K6qvLO#mi!KeW;miiGj6Ro9EEJ z2Vj3r^`yUTc_iA1U6Pu^Qs7=WAnl9^S&EZ+^>}~5f#$!HW&@e64t1$cCnAf)!xzwo zdt}4krqDS^*DRM{vLV%AU6j6mX1yu>qIKrmqRU)gI&4dZgZ>zhU%yX3zq*|cG+33Qb&U1}6}Kk;O7^XxVE zY7fb`vh?PgF=b%H$DJVVSsLysC~#|7^u@7^j~B*w>#*H4)VqF)8%O3PEq#}A{zG|^ z)&VuG7W5S+4oxZd2qPqVUK44ESzV4ejl_^cF}xu>$K z#vPt+II&A}n6;5r-y=8+Vr+Tog}e8erN3xT{jU5Y?rHWwHF;9>m(L))wF+<|?vb{D zhQ=54I??+Z5d`F4FtrF{nFB}5nhWoxP;QZO5Z`jl*ImZk^dN}rSE+!e;QOqqq)SThu+LSwO}FH&*Y(KZIQ<_; z+;G{3v-~~nHeo;bxqAILaCdtj(we^mE|}UIbMcSse<*RXB@~j^^L7S~mPt_sbW!nj zCg)cty(MMQ?{Ue>aKwBQX89h8!V0K2f?^q|punlsR?YKWqx5^48;^b&Y}qQZP8yq$ zR0ifRZiKSr!`|@bEV#4~81-AWt-9}hvq*Jmw?mFIncpCE-% z{5eRZ4k=p$!BaLbCHj1O_eSNrHlh8I{ZSO*oT9$?34` z0q*4d=Vr~5{Lj_KQbSb>iOMH|0>8c9V7<@UUyzZmOqzqod9N=bOG*hK1bF6O-}Fmr z3vXvKX6o5QXn7c)uGA_|lsYTBv1B#E{5uD^3i<$Ej7!CZ32D*bQhnU4Bqh$O8Lj#5<+>9r@X8BVSTNbcWgQ1?@LR+Ea9{;*;LA$Ln~6)p^jRX@hBZ2*1()KMEk;fIJLk$ zHgCuAfUOwoecv4$6irdIvI*$V>Ba()`D7{l4aOzLdm1yr>YQ(_!-4fL|CpC~04|+a z=giNx4?P(CQ%Ie(_ynQfAsthN#Pn$3d1djTb2nUU7rw~G5d=CD*nXrpO?%9m>ni5_ z4utG{hGhYGvVT*?z`qs@i%sMmN?RIEh#mIc* z-LUpDc6QAkacLI~@}OVc_qXPOYI?py&c4oN@x^NCL1ujf2a?M~YNxP8Llbc~dw{jG zD31e{3=)*Vs^mgJ2|potIQ7d;n}j5-^}N1_3lx`4f+aSE7Ifta49)}b1Ue-#$YNA4 zOYJM0{aA3oFV=><$o>~4n09;M2LQ-KFMyaPW;csD4n(UAsw^vnv|L( z^ftBi(jpr6=$PMeZXvp`Q~v3>}j_}@r3?WljIQz#UMz=3g@R`VxUB>5UpfO+a&4<(|&E8MRLKF zh&}>ESz@j7Zn@0t(hK2V+p$Jc3cLB=jAv~ORcAxr#mP;>vMwR^WK*u?z%{m0$w563 zs$riWc2gPqs7+Wqmq-XISCn??qJN+L;*F9Kl&Z*r`rqLJ_}<5keG)jvgL+J?i^ef% zW7btax{on%{P=1=h9e!AKm$C(=6LbcYa29lZ&h^<l~y)CB^@1aT5*4Qy0o(fIEpUVwUSFSU_vU{;&MQD(YZ zRVZT*%}p2O)4cQ$YUuO=%q~veO zQtHto6d^Ou!>Z3p5+#XVW)zw#mYEv=U_~Ny-|;`ql}q1tSwde6l^=}15g%y<*jnKZ z1(1oJLGF*npSKPBF@l5;FCs`*u2*)3(n&qJmWzm1Fc!LR3v&{(Y8~$cLLt+eU(~CP zUXwR)MR6O_P-V^?B;pRT&+flCf{vv%zmq@)0gW73#Dck;B0y@!vg=Q8v(@^c!Qm`R zWtA$CemI~g#f`oMJv@v>Fhk((D}~tC)S14f!_hu@!4)-&%{j=qAQcDh^fPgOYMb(( ztKgru0v}!3fTA4hqRHPh=<|YzPY%E}AtxNhoftI0mW0=g%V zvzR*Tmz4lWDIy$8zsWMXUqf6ZGxI5>5TSkOSdBEud1{BzC2()JVa)&eBZoUj7(@B0 ziipy|&2vClyz_(ZAF`>yjt2eKil{@n2nQ&&#Vvg3#V(ZUn=!VtP6m8y=LfBqc8I&} ziRW~=nhmldvefPQmzG%PMY6Pl`6jK-ha`N>*H0r{GmAXv9YXGct^3x)?9r`i?A}(> zH&l~(SAZk}?vuD1FFf@eQ5;ABa6hn!i#FO9+T8DByx4lg3qPsIh{dr?@zI%D>d~)= z+M6evq&5Ju0Wt|vO;SemNhqyGFb%Le&*y6#>6h}ZW^EGVx0Dwjj2OXr3}%`cCotu6 zFnF2juxjO?IbdxYt{gb9!@G!oa+W|&KcJNErI6gU{R{CE>*+TMq@MggtCdCn9EErH z=3l>%IV}a{iC%#tg+o&!cO{TafAjQy8aj;+Jt}-&N5>ZEobN@)^}jiGYt}7ck?uW0 zJ?=sooarDmC8W>d{I~Ccgnct^oRjv=pN0+$5_Fk~)DUPxXoq{la4f+)W(wt;sOzDOd0wVi zWnt3i<=*|xM(|kP;j?EX$J(K>)V>+D%c8^pQ?*@o*JV=yByUTeHYoIAp|WJre>=~9 z1>e6zX2iRL^#v00E(nJKf3jxQN8huab00&+txTXfQU85hKqrN5!mc)1k9n#Me>fvz zP6nDo70mU?j9c5!6n-LJO;D)?hCZ-?f)6_PQ06)Ce-E-4_gq}qIWyn312`7AAlGX! zNv+a$?CLJyNg%(NNR3WXrx@ZrIgTM}d| ztpC>MCM#{xR&HvI%=fa2!UTd!)S$CuIw`^$-_l@kSNztM#uZNN4n9)3fI+zVSaixi zPazUuxvLHN+vPOfaaXqu6=_&3p@-mPr|9LR0E6rG)y8DD-svL>*YYD{Y-LrJcxOE~ z@DH99ESP&;Q@-L#wzV#RiS%KDV~NOF@ch_<58!#+V#r^vIjQ=rBiMMYH2;}OI$$`a!5Li2XPm`EW&=fBb=`L7zy}AqB zKK=5(e+SGi&%VlM&d)XRy|mV7+sW)@M;2GH1#Hev`PXwx$!v%L`NoK0Q1!X`%=gC7 z+lu1I%PcMu%B)hq-`(*Q)r02ndssZ_R<)Sbb`2 zspV2gSGPZNfYNS3+RrOz0G%`b*F6KsWz#iHXS~^*r!o*TzkqpJ?A`V~UlN?GXWuTf zU)2E$4|zLvv5Z%{hwHUR|%;QkI6;ec-`@8FK3S zw0tPxhK_ysQkh~6EXBuufX|Bhd-ZdDRn$#=C7rK)l9&YlL|kJb^3<6F)WyZ5=BgeEeYSSgJ!Qk>N&<;U4QwB2L#ZU@h+7K%g^+dhlHb_58GC1OE4bb&u*QcLIWPFdT2A4qR4TF2>k4CZoazMwgqqbvoAn zRv6hhqJ8PriG)8&iYlLXI>)W?oQ#_Sjm4CHoOnpi`UfvAQr9y)0Z1ZzI0#% z#v&m`W}-+^v=K<(aIBgrb;xMx59eWma2YW=+ZV`>#ng%W7wX~;lU1y)>{ejBpQWn` zy$7`8G9PylBX?UGZw5ZiEo0F^@YRqhXlCO1WLJvwMJa|9aXo*PFs7Dx=Ks=VQmVb+eJ# zXHuvfMgdE*6Wn92+-`cJnIR;nKy{vk*;YEKmTounE!-P@J+`x#aKKBFIWJ2r3Ma0^ZzDe zuyQ>A+c_ft%!|&gdL_r@&eK`!jmE%|ZIlS`+0ORmnMB%R4P;Q7>3 zA0CCuSIuH5oRAQ{wV8qMP;ub}SYWC_HfSU)M783o!lp}? zEy(qZBOZKq?kY4!bkv4AVEq!U>o6rka0u=@(L+10+Dw7(xd@Vehz%@c>WeUAL)pib z5VA_I5RiJUOnvbt*EPR)yQTM%AYq_40wGpB-XJ|m{3nkLk-W9*u=AF^yV;{T>`{kT zEOo}GN=`3PsFcCtLcQVZusrhnwc)sGW z@y?UF-NFG9zEI3`fnh3zd~$rEDJ^2X$}K5A1`uQDzD@grwpDoIP!V`P)f|i z@2*WEbTH?r7otmFcm7`Dw|-aZBH45oL3t0mMmwk(yP|dRV&ZhbZP%I!KtOPN$bw(p zSgM0E$xZ$lG=9YR3Hbj@x-9%G+CVp6FBi^PClWiwKeikqREJcTg>q6E$Ov_?n{r6< zHen=B&zoJqr*Es!-Lnh8aCEGVzX1g8#)^-qC^H!eWX7Zo4oF1qZeSL@;+Fn)II+O0 z()!j>esae%TOQ8mERKhNr*+DSVK=z0DHL&!#OPO5zq6_sd-=)VkJYN6m-h<|ckm(H@wH8qLDFm(5gq->GfRm5@<0G%9IG+I!A5mum zkYH?*4~P; z0(JC;SgI{f3tmC$8jB)A=){&7XL$^*O}LAiAFs5kWgQ(V|9_)2f-nd|9wpL%u<>5I z{c4a&?w<81w0yjm(imIcHUe|2n8pd*|FyXjT>zQ;8BECh(YohZ7i-YH_qm{Q+^~z; z5ejTQpe|s!Zc&f$ZA*q)|9E$RW+gZoKS3xRq@gRI7YVefs&^cfq4!@fU&Lbwar$PW$B7))_d{=HUG8CZzuYp#*Gc80(_RIkXmwyxUh3 z8Do3z0y?Vri$&nr@>8Ue7GQL~hj6HP=@qC{M5Ft!n;nZAME8i{9y2s(p^IPjhLJ$x zP{{m~VZwg)m(<-WL+GKN8?@>>^xz2O4m-*GB{|#SjW=F6GAY_xFLjwEE%FrXau%HNPTg}NK?}LEohjzfpm8<$?xR#^PT?vu%97-FQ~Zg@YGcom zv0j&a=eNhtiT+zUB05A?&Go#u-10FW<*q)A6deu66x#ScSTJe+mGb%Ma1gy!h9(Sv zVTAG3F)u_is1x^^ww{O4zS&B4e;F`Y!nm33l>H?<29{}&$jyjssI_M1(}FC6(;zQM zjjKQ&ZvL8V60}<)8DGPLza*?n+q^ltQ5w(d``W6jG+5hX_!-jhDgeL(U%!&61+{Ib z;-%kS+`GvUfliaR)ZKjOILwdfZOa!VBtf$oOI4UtqP`EKFXhd?71ip0t}^J~(a5Jn zT(!#7vNsRbfvf!>jYV@b5efQ%w3P9y+PbPlHm86Z^=vp5b0&be_F}%c2$I_h9$eOz z2RNjx+fXs_pK9B3KZYVyCHXOWx1|4E?M5v2$mNH#pc{yOP7AFtWz>pzI3H{a5)XFK zbMtlB>9~+ao%!pO8G20okW9SQGZ6Wi&rq3}eVC(d?fmw5FAClIwvOKL(T z67&sbZE3s5dn_JW+23^@m~jtAr7^WUv&Y&Vzkk2A+^I1~+1MvV_>s$9%{31s0+MmzKszz-voOTnC;?M2hlS>ilAwLC zw)l%zsN)XBOuZ0a21J4@-H4vP$%BhO9f&}o(?L8)HUBED$!_S^%<8BrB`rqv~HjqVOBE`X3Y7CU*ly$1-+F(}5 zBuy)ryXzP?M2ud}tanLWG#v-Y#|{t=Nklzd`mxvyJl7CrhNU2ymTekL8FX{xideK6^;jMsyI%3!L>cNlN9>ja0#wG_!O_Wg3kJ`4 z2NfvQz}r_tyn!4Si1aK*J6gQ2C&#>Q_!~#7lV<&Ma4;nlMZPTINw3fWSHEU3?RZiW zCkkJE?d56Fwa3=u9nL#!65uSo|4mtghWI%b*D`_cppHW8@30H;Et9h1_SgtMpWe`{m1?w9v; z-Y_lAIdK-~xS(mU)=UaXLA&8*3RR8yXRbVyQ%OY01EptO%uNwqXE}V*`nhjq8e@17 z48sRDu6o&fiXB)US%@dZTR)v2GAubKtO1VDZS=pP;bwEVg-!+CNM5SNm7!)Rxt`y; zE*$Yx*_~|`$PuY@J#23jho2nO8t1wC|qiI#7i5fM9T{kDVDd8 z1cTiL#^K+m@N|ge!ZRqfq}6~)aui!ZVw_VL03P$*t)@v!rn8-5GDgWLpkV$xnPUud zXqf0$tL?yTA@sJ28F?}S1PzH_TUXL8+u+q#x+TBsawYkd*^dybGLo7fC^0Z#%lWhL zGc!xwx0CjGVmixn`blD8`F1;FAS5FeZt-Y4dS_7Z0eN?*7N`V&6S?8#)k=f*-GcJz zJzs*w`QCynOn$-A-Km<`$JzrvDIe5)nS;HJF^A@aSk5v1iednT=uZsv<4dYM(p;XK ziN2>XZHPPy2o(#6PH(EmO~sjJei~|yqipg9-dF%}`v82Nl?|WhLh&ub7(7S0LvCB5 zavbq3wbUum_?qH6PK+(llBXcKD|=pDzKSw)ry>y3#?E} zsZ%!6B--Mi1&+gOJ$5pgsxmNJeHm_rV544=2K-=nS*<-yUYh6R|2p&xIPWr=z2GM~ zZ^95gnh(K30N$tuuN{Fcg`dlcq30P^zZDf^eZiBc`WSeZSS|ly)qa-oDly>T;n?(H z?)wbc*(6SWsCZtsTLSZs;y{AY*rYC^8Sv{Fk$t2ifL)P3FpKF|85IZ-&OHEZ#7ea6 zTZj;e--(D|exDjEN%H=S1ETA!H_IJBl(eQw(zpU`^eR+6tv2=~s!QDVhyFvU)R$!>gv<*$|D($dvp3btu2I_W90?@WL1 z@BGK8l?*(W{rNjz((WhKjoEi1jd$4MDRLagU2l|O3sP@#7_U3V+RKF<5xZ5Om$>pl z3B(?b$(G=3m9h?|wYLt=n`^+8ZDDLMLz3RL^E*uVA&4bP#F(uu3=h5)NGYg4{ba6T z;`6*NCXQ^%8qJ(zXQJz0pa59B;QN>UwTf&C+&#cJ@SnZ`tcar9h9nM8?oV$&29f`> z$8-sQG8{CJjY?o{Jbkbar2<8{tR(%9`FaEGzihO+yXDTCoVE#^G^Gs(F#QA+g*g*W zech&q9u8F*&p_bdt!9-TNCT(u{9x4LFne3nXdq+}w|gPo&O7=vnRfyxym3(8r2 z6=R`ty$fvc^C8U7#ncH%f!puM`Dx}lm-#aIwFazvVio&<kR2nlG|0RO}1n>Px zEkKS}FU8_%G0}r}sVVl7y}tYxGHV{veV%Jc=;&dN?V6#K1!KL!dpHo{ zoZ2k@c;x}@rqEQ?$zLO4PudbM<|!s5*H6gyX`J=6QjnHg*%)b)xKgT5g=n??*O<@D z)`iv=>pmPs4T){=#+`tXv&Rlcpvivw^xa30@W$R)t4^-D>s-D$?WlT|#h6^w#q zj!z>5zQo|oBe05i`bp6p^TMDD)%XQt$ApD-Tp!QL*~6GjN_R^hH%rlfT7E*@W;MP`1ma4g<*$2P(0YiKN@D7~o!{kWPCk<# zCv*?a%glL5;);CYV#?z$CFw^7VaD@b(|01yRpx-ryleU*YhQ!Yg|d1=*B~g5#rW8# z4UAPFXK>4l06w!wIc43}tXiYW|{`?sf^yr!w{7|bm=hm}Op$>cMm zYS?_`)FOCa2s3?Rq~Ntr53N5XN;yM;Pw`ohxmtawshs@~iO_FGU0&t2NCTG9nMiST zo-!&p=2i)kzhWa-C?V$UH4Gg=FV5FRt(n)1NL zKQzVu$2{Q+tz=VR?-OIYZ4MHX#`u;Dpy}+|z589*jNerOQ$t8gv7yx2ZzR@<>yd)q zFg_zP1w{AANOjuxbrm63oCO`f`<`hY#`HG!PUrfq&;v!$nUx0Lo4&0;1&>haBJ2K8 z$}hu8koCR@N?`gCL4|5OE3Jlbl={{78zm0O79~uJvUJeNSC{Xu3kWrM%~+HOJ^|YY zh8AEs+kg{?tlF)&zR?eVQ8{2m;nLU-{z~k>p~Yh3r|%oJ1gjw8=S(PPGA21@Y|DEI zYT}c`%p}t=`?Jiwp5RXG z`*BW5U$2@YN2@Ni4B2wj91e2n$`NkNI|*F=MRIn2b2!JNwiOwv4$$0#fVNlXkToH3 zLI>>8A;Zr$&)ez^eE%+&`ll7*Bp3tBNo7j%T{o6^idv=jShZl8-J`AJQ9sR!Op_2} z!m(s1k{5@*l0-w~o*H)&gAT?})#>qEtt$*Hi6`JAouq7HLN*lv6S1{!CpABL@K*7A z8Z~%!LF2BmE$KyEPOiYFI$#tQ6ol*ZaCq(o>=!r}QKql$C|Lww7;TDN3f?ayRAIF{p76?I1V z4~p&7BbAs&aSO2~v#9i8;(T<61 zebMknz$z!tH8R8c?+&+ZRJ)?XiR{Jm*xH)yiUB*i?UT<%hDoJ%-emIiP9+4C9mG~a~P^y`K8LR;2 zRSgl+eDdraBq1qte%g%tw|T=RJQ3I0>ZKK^=Buf1+>B*UgEz*@g)N;$D_LpK0D#V0 zki_1(^GLJ)wg2}1t2yVHnIBqu3-wX(K)+W~z+S9dLN>*FnJg`ByShTqf>ryS7hHb4 zF2j=&KuGQhO9eIvr5eH~g7jtvpL4VDF z{*SxsPy90E&kNLfhia@o-1;Acz&SQpMJG&232r8JZJDMX^ev3+n12TzMVJ^4o-$5z zsp?T}G$->w9WNp^^6lW&4I6F`x1i$tw}W<2(?Q!j#s+l;6W_ z{L}5WdXpEl)HQ#c=ymznS>jl1C-_;*+|o|PEPC_FlUK=9HLxRVT!l>X!u){q{vrimj?@9K|bVof~)kO-0=?)Al; zbGo&SJS7q#WcZAB0y9It-B1(S!{`IyY4&X5vM|U@Owu!|V-8=(t^PEP%rTfxWPOF3 zO3_MlHl8mFp-!vqESyGI>EAp{eLhLtfR4`!RbxkCO)k3jHggE=|1d0QrKP;#5W=Pq zzMcoR2ifSp626{E#V26NK}B|xhetQP#+c8OoW?Zv@YmVfxHqE3#3dqag=)F`%b1i3ke z6T);Z?9D!bp}xScb;a>S6&6lS`8))_r9cIaJy?JrK}zrnI1|9uv#UrD31VX{l5$vN zzQl-9%@{bOg|1xa=+Wf~dkn`gd`dMBR|}lV;^L&C;)Bfk6Qk5<55R2_dqJN1@s94k z*3wQK$?VxL#AXoqkNDo|{4q18kAoh-VwIhxtxy#)YA`CofTrY~TAa=>KviGOHTeZ4 zGF8ju?UVn5T0=!%&6#qJYBmN7>lD=~v$4DeB~EbJ+_B#&mNrudTgz!__J9F7u z-JrNv-rxFtGRaVs(q*CufhXKwkm&(ugqt|7aWLB*0J6v-Kxgd5ZeubtnJ&}&soyGL z>%q4=YroX|lzvmLFp^=GXn#Zkjo13}ES`WOLq8|!Vv~6=ZSGv`F!kHtlnS_XN&=rT zuDxEvp*hdUqLj)s!p4oYf-Dps@F>1 zBFSA!62N*h-~w>~`5xe?_ggptvN^prh=Qk#e8vF};lDU1tlYO;guq`-@q2M=lo-hm z23%YgUu@%A`*v2)m?$Tt_~bk-_34Q4hN&N=Q3(uX6$2B*N(oQed0w85*pb7^{-#W_ zN78Ia-f?t84@7tX_e9wsk;ky@#}dCDrX?lm2u5@(Y0~5V+}G;=cWuCpf3HFOP?R?n zWN6=O7C9P{(pG3}Ob-=j$(ODql*Pf#v&XYLsXxC}Y_%x%cHP4aULCgzVlvoL{ZEyUT26j+*)MA}O*Mb8-ceL)^>j_qPi5zJUevB$&T7y) z9qug!x`Mr;`>1;qc$nA4)@`!i|KM-q`qK;+!kcJZfCnJP?!l)Lea;e0y!#*qi~Oba zg!o+0@X`NnjfT3u)1qJ$KYVSQP=^!W9;T7Vx#Vm`RP!VvsKIYz7?|^D@^Rhfh3Zay z60zsuUeG%^h-Jvk9Zl~siTW8|CI$>5HMJuWo zj+4V~Jr`bv^kgL=C`uWK@{u9t=f(ai>Yo61e)(q*0~%!Olvnt^gw*R)o#Tw=~AsbNHbk;`koqr zP9R3uRI*ZS|9$BNbr<Y*lt56P{ zwLgC&&JqGC`UA9|cvMm6&jyGpDR<}n}+1@g+)_S?9^2ifzO~noqKjQRazy>&$?@;NDLc0Xu(^TMu+?J=Iqe+zwC6a>nrv6`h*E}^$OqGD0%uOdqIEEOw)-ZSsfzq4Y-GAKdkX>$%_d5cg)1f z4O<4h{Ck-k;$6`dM8M{6NlN{y@XNS97|QPJH*Sbb^Ld8>S2KfZp9m1#V<^HF3h%!Q zx#&b{PuTi=BzF2}S*y{xot($BF_mRlm2zPB6Kn8fSK6SU=ohO3WCzOL6dxmY+T4n7IjbLS(kspKQ*yo=^)6Ajw>6oyue6y4TWU@{C)oG&?<*&53w*|V*1P&#_txBvxSwmg+pN0XrR z3XSJ#8h#G99)#-NK&!S9GS(2jzQ8yX<@2rt2TWDe%kWfG5Qz+p6#8{)>mRFxncliF z*crfb*V87xx}B=7;e!S6ZTR*5m7v0jCrbKA+!|vBLGny(pOmIweF7vunVG=#tD>Kb zHfPOHk&!)`uC20qIqZ>BR>BCm3p=J9_p!x~2zhe_h&OA4Ig!JyyV>Q)xoqe$oG_>V z4nJLwfbUEy){dlIz52UQzWDb8AK&+Egx_fPqIoEUU`}2EAzudH31Oe?{WK={_crSz z5a=E%u%t72ULlBmV@oab*ROx>hqb&?^JGA^fk(>_3vbvDZm2^S+)Nsqgw{~IrLSgd zW@rYKIz$$FUW=o4j_)reeFCP81DPU$cLLZylmq-vgTXV>3XnT^y1<;k-33_-aztOY zJ`f6De;@Tw7<*h#c&Gs0L@i%(B_3A2+rz}^$yC1S%5@Cnu%eZ@BL-V)1j)4P2kuXbv+*fEOn$>iFg zSyMChbVtc-iAYDEri-xqtq#lgNjfFvoPQw9OfNr+g*-)JwI?&K?_Cgw{~BAIU>eSO zLG2Rqc5F2*>TYQ1a^{XR0-t{R=?Os{l!Uc{TsnBTX0{tj$7sAeXGXlldE+yo#s{$H zxJN>cp=?6(J249JCYodgGg&P&p7*9+n(v8gZ9YsiT944!ZU5GBUavCT+V7U5_N3Ei zYhCXtkIVOw5QAD-QJoSy=GUW^F`uYG(D5fE#R_P_Gqj6{k7U{56rcV)R3N87%a)B5 z|8dm$U%EO;NGZ8dz+*pl`CT#o4P|?LTwlP>;2U*_9ngq==>O|HChQZiYlzCyrw9)y<^a zW*t(G9C`#f;L__-+3xm{MYbF}!paP{eleK= z!D867fB3bH%ox6ANe8~VrR|}|%9LOf-_KNuc+&na8a00nn+uo%{iR+lO)x{ZBiYo{ zz6BoG>4TH31H##8S>86MmEMWrOm~WJ;Vj*{Xx!H`v;cxJz`2Ka9fNz1Tid<|w?|UW zo}dzyhA7;CppJtAt*dCNd!qr;&@3IL{uN_zzaeE6mZmRBfwv3_W{*x7apG_b(W-sT z|9m{-V>bJfN9;e5BA}=HF~OAgMNN}Q{WwY1;OPx!lAiMZM2>IFc*+5rCO1Kz;^8UX zfutjsajot>=ywXIXkn9;=B1G`S&>cAxu^9`{bJ=4@kp zIpe6A4||05+IZQZ6T6e&313T}XpQ%IH|M^+yE?T3j>DjZuZdHjk;XUee@eZHx_3(M zR+ysN%7`P*g`v7drZI_Lw)f+ToJ-Dr^Ug@!Mxf<5y-$$5BHz6-O|o{{n$|xpoW8{X z({|vV45okJTVwjqurA1^^)3xO8*YQWw=k!$RP1YYgS-#=-YI(W|HG*3E42&qZJs#X z&ng^^(uX6I4Rq#(iBW>d+RctzP84YV4bzNFT2VIsM<#HRNPFzI2v(${H4Gm0kfQ5> zNsPk*mjb?0Pcu|C!Pnu(Rg!Y*-!uofHS0$^iczkg%uU=VY$RB{gYPlXJ+ApHh75k! zE{&ZON|voWaA;5?xy4}pU2Pg`Lx$hb^5h`MA$C$Ma#=qU89X`id-ivUDDCh#er-Ik zXR&quPN&?>_qoXeH1Ez^m#(CU4j_%sqD3%=YYRdDAgcymkqZy8pUlZ1o4W?Lz8mlA zEhU?8j>K*7NMkp$Zh&|4$@TBV7rxPHj5t}|XCQ}Q&g=(kU%qdrq2}ihO1oI)IPBOL zD4Ne~A07#=U8dG>q3}?f4~>8K@&5p7yfs5kLnJXTIrUs@9^s9$E;pg-^}CjEEYq z#JkunUZ}fa99CyWh|kXj_1jQ^)hF{gfnfn5o$%JRmpWqp9p z;a^F$K5%66L`aXZa2)#}NuaQ%c7P&7wI!cZ-8>H@BLXs$;oZ&tIC|r{VA@mM>#S8t zIle|p*fK4Vj(b{w<)%c&A{m~~sNpGJS8|6@89KuPO$VgES24N8nqOM z)+Avwf3Zq0f_L*AQ__5*OMz#~Wf~SZ9ht>A9g^XZLZpSb2qjgUu+bL;o~sqJLqiS= zo1giLsRs_#~a59|pON;^=di zGniAA3o%W=I{wb29IL+}EXie2e@=JMMD@(XW#)05Em3Ca$mKkLB2fkTH4}iD5WW@; z@|{N%#+4ipho_8Fr(&4+jw;Qm)bVB{4$hu!CWGyu;$LmD-klu<<~KTkAlUAn#iE_} zkwh#ggc)}BSshaj)S~0CNRoi<{0V_7!pg)aciMz&@)w*QB0y?FJW-#2@~v*&60q}5 zOv9FTu^v?SR+8gmPID_uC5BiCt$+@M-a3us!+=|3W+cq$g#7k?VG4KmIH~LvFMbnf zvH(`nFqxy7@ zByEDJOzPG9RLDdId~M_butEv0ZV&;V;{m|(X<(h*{4;FVvZs(cfI(q9;=it_$#K6; zpcG#FS{ZNS@Z*j0Q|*wzNvJp#RJSnU2Rpz1p?xAls)n+>YiFy;TNT-H`MCTKiy(*C zq{qp4K4_T%qV%bDFMbY`Z;`pH)AiRfT)VAUa&7!92O?;pr8;<1{nEqnQ8rZ;4n>f^^4ho4*mm7QDuY|vD9QN{>9bjyu>gJ$jH8$`cwL?8grYfjl2i*~&P;>3qHXoW{yRWq^ zNS)_FcaYCTUZ<{bM(KCsHW1R%fRGldTPODnyuCfT>aZHZ%ErOeY35HPN%orj_~Xj= z5x=nV>BQiZIj+ZQc?66JJ<*0(oZqL%MXJbKnE;EgOHUhIRctTzQ1CT!8bXg@4Y1L< zoLr=s2^<{XBGX1PLqCqb>2xnvrhZ=tyGlggJVNwl+$YyYzMc-(K>#q zyrtIl+1DdIKs!PCU4DFTp#Qk|S3&IJatr1snwR^1jbZmb#e1x%z_K0^L|K{4mGi|qx(8(g+)q9qSbc3!@rnbxtw8*gC~n$30)bR;Gm-#X{Nw= z96XuuH6;bwLuRkA{uuus=b&6vQ5n4`=SB!VynmgV6EaIin@Jd7N^pR*jZGQmP(}_I zSdM#nmrF=fFCkm#a9f=8Ll2ALg6e4%@J7l3x^x}CqQH?$`R6C7cx`{K{;e6V4}w1_ z+2Pjwt`_@%qcH))jtLdYy^jl$kpP{YFNbBzV$}_TR9s% zOI%4#3zTlVl!+vKW7;e(QAod6Iqv>(AyK`H5GZFU=-mrEE(S-qgSK-N>_>iI;!|)d zLaBxLfT)`Msns))+mtX*q2-Gig)og~8XNiPI~`7&A+nf1;E6k4iu1Ld$QU z>){FCaqNXP1NRq!j5$-Hb8xjq2w`+UGgifG^619fD{3Dkj?wTv7F-)V+p)9}8LniB zKpV~lJx9x@CP5HNmk1EV8q&))f0S2;o}6@f-8GSEs#dbX8d_Qc-{!$PgH226a{Q4s z6%2{!SR9Vo?z-S_rgkeU9Ot7P*tc3?U@}GaRe*Ajn7N`~uRB0NxPDnl^d>2|;NkY* z`ajVIa~KlD!>oK45-AWLnepzbojv<*#|p#8!Ow4V>39uNn4i2U{N5lD^>R@lSl9Wd zQ5_E4+}QCpEBLQaZ1z)23*f-t_Q{Ff?Lbq4mh+HI2oteN^;?o+ug&~GCG`idH?dj7 zC{f@K5(lm3=K$}E^1|ClNCOE1-3isbQ!z`ZuByU$Qf8~@tODZVuk(+GT=CkZZNeE zh}Gf78@t{#rT-pqI4!p(2gJ!WfesgRJT)+KsBx{Y+ekai= zr`H2RrKv_R985h$7+?cjIZuHPAY~J{(pHma+=d*gXE2iMR#3^*nc-m1-SU(KRvnKs z8$!rfX~5qGZk-q{Y2Qp)_R_GX;dW{L7_1Cs&Qm_A5s*>R)FPY9wtC1grwxp-OIXe1 zH;L7blmSOa`dZ5zkw3Vn) z{taUiaam>3zn4U3#ZF@rq@Wp|NX%g}QL@=(jTL;{nwj>Vk68Oq^>H0cv4tLI;@oY5 z?qSJkC$4ep0E@vK{KbUAqS#vqG=*qH;m>Y{cl4&DFB*ngU-f;|U{qPxp-^5|hHHX9Bx0vIH7pdeIYsJFB~zr$9BL2j zaKTXI?je)|>Kgq02M(swwy|a`Gv?EURkUlj|0^D;B-1_QgHwtU_1VMGfLjejdRF(Q z47*e*r!oRP_bE0Y^edmoKA)<*e(t!s_P4t?b-;rXSPC;6!3beD=DYI}z3Fgdp1>V% zw3(mcT?Y*|Gbfs9pplji_nfbvEQRl!+QA)IoGMJj@~5U~Atr~tZnObMdjKtEy@Ao| zMl?~*;4^|cqnOS?LXmC86iVavx1!R~vU3Bqeyi3ByPI7L4%SbL(a=yHMqC60EOY!A zV7;96GW^nHC5{iA8~*Yg0p1> z@#N2hMj!bk!e&B4qKbF__JZLe|Dk&H_~dUM)4u4W#+zP!%H?p1Yl!Cjk$mCZ@;%mH z&>s@ECN(9G7g~VK6`X;pj6JUVQT}`@(6HX}IYl{~oSWaxz+1#X33RjwMDE3eKpko5P+>rr<;3Ib`VBWFt3i8fZCic(unf`rEn@$GH81qqVcJ-7! zy9$9v1!&&m}18G%W&@nTH`?Dbj(Y}et`T^o`P){# zie7G$Sh;_cnvP9*{KeP77$*ZXJT)QK$xv_>$^f_4X1hn2|6zqQcfcFRfb*AmO4VON z+tV~Q3>AOWXk`jaD?>N+=sJ&sJ$&6j%I;zvuNsinwnLy@5ildGOTb_!^uCIT5jRLV za7%~efG8eID~%Ods-_P417t!|4)<~+d@?meEE`we+US9>uatn3~rr1Hl&H%aZ{dSc$uGR!`shgVm;OUgtQP+1n2k8;(Earis_wVz^zdv zfdAZGs7`nZdyZ_R2U&@fy(3VnOG%dX(3}@lcz=05YTR)M#CK;4g!YG%3_G%XKJcmg zZ-? zGR|d22+22v|Iu-%Hq)&Nq_QH{OAlomhhrO-y0BsfS}tSEkCf^Opxys71^Ah*&NrNO z4ubq|RMeGgL>tfOTLlOBJ4)AqBO)2^S1-ZyzXzzLS;k=BmUmdy#LN>ZD>`XgGdSeu z-z0di5az#XsSRrM#6|0siCW8~S7WgzPOpZ(65MzN)H6OXGzFyo9V4u0EY!Z1A^v`o zOZs1T4Ja8u-1Q5CZMI?%Ytun*ZAbD8Yn^mt6N(6m~ zKjj~d5rP#j$3u(%xkl9eiRrZAY{#thUvVNL-izU*z0O;&4AQ4blk1my$2riZ(oEN6 z{kmYgBN1~2xQOO)Y6lodRm;#LHj=(wE@Hyb0N(u)PhcB#R)sY#LQBhPTFEyC+j_(pZI z&Ld$~Nb%!zZ;rzHEFd#vPD}g!5eL_Ohh*9m(r|R^)5C=Q* zHWcZ3jULI<53Rih)x~>EVO~IiYh__>P-`+%Ybvh0KRLlva(;D_4}&N z@6BIDY|D91Ucfl`UpWp_T%2{R?_3?8uUpL>NEGz&PUC|DQy~%O;ho{QZODuatZaQ? z%Ks+-0RWW;3eV;Sn5Z}z_>Vr6f)!Rf&|*@dD*tU1aJ1a-4;=Ar0t;!ukeLv|*W6I? zEJAylzf;025C;ojBTSjI(m7HjhK}TcR44b@TrP4=AR~Y&6s?!oPC)2Sw(zA=&y{S5BmD zV&H=$oJR&L5G+qIbp3=}$0Cm0+CIbR0m&zW~O3%&@9zWdnk)4nqC*P#4inp3p3 zDFN%p#p^dGTv$P`7UiA%9sM9bG*#O0&4(P#JJ3$)O_mffW`FR# zI1J@8t}cW%L2Dp)t%J70G@coQOI23bvqdg4k(U2sFZTY)(&M@E1Oe(~QlV;UZe|q{ zEnYN7qU1(puS!w%GMNL%m;KR$9ouq`cCI#g&U`PA3*xjxq8BZj;ze>0bLMPbuKJzR&)xH={$o^gnvYiY?&o?BTtMMN? zIsG&)s}e?R=>1+AV1Dxbi`BP5VD7EZGCK<9R8pw%nAYc-u8Wn4ZR^|}4Qj&s*mA|H z>>!o?Gs`J6(c(6V5#{8DwQN+^`5RS&DHfZa26rmCV9qi1zJ*&l4b+(eFSO+sTRi^C zdq2JU&pX#b+Ww(GWFn9Uh=4_;n8#rg=Qf7r)ti5{R&hl^A}9wI$k68R+LW~)FW7aw z-l6&f+r8V7lriro5dYZKq|QzFHe`#z|94l}e38Ep_IP{V!+@C`z9vtB)`#l$0-~)? z)M1iOGG8&wY{Y$Aib@@r>nCLsq8fhGcAG0%GB6x6gUz~g#{Jl&f=schas47h75)-# zJ+o+E#Y7b@sdMWKpPE8%q;Xab5^=@jlvSZ3&(<<=vj{HNat>?1L)U*@L@eRQ#^Pla z`xp>qP^#BpiUvSE)#ranFm2jpSVf2wvZ>WSXBio1I+e=!m8}TG}%ED3@83sZWj!z3?vG< z$u516X(tlSYSQv$d(T}+rwr3-v*_q$jy;UR0QX7z#uYah_4)B+sQ zQCsk3%_^+?75rNA{adeOn-7);#tPagA_7cAVNFv|y79a_WE%#&LiwDG?GC!fHk1?6 z<;9OSYorAEqJ|c)^?lOtok=1iL+iVC2_rtd$F`qOJ|ak^Sl{$=D>4xMCKw-#iB<^E zsi2s$CA5Cw&OQXK3H{)gpB;-uikd5SPEjOFjQ5>%-$iWwOxAq!h#P zFZi4cetlz1BRc?$1cb2D36`zdY|ECBkv!v8YEWRJLb!9)i6`t%)l>EzS1X?{( zTcdgEnK}vr)lDL-d=Kg23}8G2y~RZbkmDoURoT7wXKz1nlhpOGK);)+h?c1gwk~nO z%INT^|JbP6p?NHJOsI6v-D`5cNXr5(C_*Mm_(Ts{!|XA2G4>PayFL6f$dgY|oNsa? zlkl~pjam+e%0sv{cx&i!M>X%rsv}P7#{L;sZV+qt&oWo-50z@wp4j&WT!wB7TCl*M8l!l)3upML1*E51Hwk8Yd6Mh&UnNxs~O`o)HU| zJ9x*`abkV{eYYJ5Q^3D^7pIBoCu_Q!_L3U6od@2DXYV8>X~q-*~w2=d+vZX&Krx6%{!3qLe9D#SGn6_>%-O#L%v_{QlL4F zr=AMhs`ib}9^1JIE2|xhI(M)YAsF_~ zG;<13snOeZGn(0sB0S8z`D)I_xj_^|hWDEPasX7{R1rqtsfafMv%!BnCzx41B7aLo z#R9F43n~JIQZ}Jb3UKH3^{tKMe7f**Pim+*h}getIcVn${&*C*@#{>-A@UX(N!{LB z+<}xXbUyAegUlal=wZ3jaxKH@F4A)1=ye2f?#p*N1fCWq59E$ht%h$smQk5MN>5uO zHa_%dHyc_h8$y#jk^RE8h&Kw(RXWX%2(+2S9enY7Rh$bKEwHi1B^IOv-7Y(|mhA6= z(j8GwzqAGqsJWU@%A34a%ysBV*UPBhdBt$HSIM*ug09x$Q6 zn}DGSJo#DuD4G^a^>Y{qP?J{!Ys~E*Pik-JS=%>~fCb0)gZC~K?JV6i*FR8LjXut< z8;s!MFwyXLh^hxAO#h0-CKFR=gAjo!q-gD8q!Wfy~GCj=PL3}bR2(t>}-KmEw;TBg6*g2CZ=kYpj7>8YfOE= z{?d^Q)K68tl~;Ryb4GII@j7k~<^-oj(tkBBNWdah5NI`I;Lbgg&!^8mvu9HYVpE8B zJ;8?_v?oO0EDVBER_V&s=mHE`h&ME@)M#@a@a z{Hs%|W2zg2ce30nJR?_f0lDYm@v24$bp(1E1!2ywiF^EsxHuakU0}yVl|qlR7oSRl z6xsDL6Tz(`DT8dpulQcll(e2+QNoYaAKC6VPB1*S-Ozh-z4)4<6$7T5TKNZ{X+Wy* z>s_e(X#Ud{zK{Q`!YXLI=qqyrZaN&uqm|5R$(&%jMyx%rPxRG`TvX-Ft}pikjY9zc zOj@XlWVjI4f$D1Cd3jf6&~%m?atjCOlwHt1Y^6CkHY3)%(il*S6lEat!A;Q*D; ze@?W6T8YdMBKTa)krYzr({BK@!-{<-y50U%dFGmf4#CT&vC}U76~aumc*57emnMao zawAFa<4SKBM;rQn3xY_?F${pVB}1Lr+!>y=Y++Cik};nk`95tXYyH_z7+@t!SB@mL zv_SFcM%mf1{BkRmM>H1FbxrT0t81|cJgMCRWqCwOdN!y;X!oopo?ao1b-aW7W9q;v zDYhq9o1m`k#6%7_Sgj+hlu8;=l|RRps^#Bymv|*ld%66eTtpT9Vk0<5;YoN>H5W&( zTQ16IRx<-C3)(rpB|$&&Q{_Kd-Mh6q=drgL{eq*F2Tk zY#Ko}2ajvt++!y@8dt+QUovLytj@S3tOT`fS9#6d?MTmx^f+I6f7|)tv#b?3z)<$#POrI-I{7vYzW zc+h-7)8-Oc`I-?O|6CNl)*6=}i*uFb8P?dqTh+^8m*HGw`ov<&74+W~DBFk99Vd1h-9Q5=Yhm8nHBuUTYc4zC3|)C`YVS1E+WhkwKqnJyfNTsBw3ST7md z@wX9pI=J-;WJUspYA;%m*`MRehIswhx>9Skqpp_rquA0snD`q>_ac_oYzygwN8&KY zrTK%FVINGhE%I$SvNd|8jh+5{{l3_`Fss6Oj=bq~GSLSFc?o^glt@W9oNMy2KVH2$ zPwCLT=q60O(hEAt^A(%SZNtYcWR@@A;gon?H3S>!*CLn#(SLIC9+(KfZ@2mpodrr| zsTm&xjt|M5c1^F>Z`bsmPAWYqTb!QA9GDzE^YJp5$b?AKQS+5(n-ve@T8U6C#gx`EmM4J*swZ&Qa7D@XFFBiNRRG@ z;mjT7Qpcs*evM8WN8uYMwb#4Xgcn{0`~x_ACoL<9t3Muwf+RY|*A8sh{97dhX+Y{3x&)nkJh_PV|eC(L1utx4oLG&oINQ76YlVHCM?RKt!a zs3G3Pb<2Ts?x3V>o(+_A)?q_*+HFhz;jRG;`ZlhZ`y2X;EP6HxgzuN=E}|db3w7_O zdIMk6kJ@0s$qG=>sun2j{uLSmhrX~nfC(F#*>uVPo!Daj{0BJl8zX5EHcwF_c=_~x zvZ*llC&`tuM2fP9c@`uOpM_e7*xNt0?Y|nU$t~`DM+@5)8GS($r6yk>H=d7ae@KVl zpZ3{c&-87GR(!@_Iyodu7%r9R8Mp2JTcxz$n2yZW?q~bayT0O-_q=AHR6p=`xy}(@ zt~u_vx)QQ5BRm+Oya1lg4bS7OT6_0AMk)mn*Sd_dI?SUGj|%_H|G*ImwTPe&II1(> zpb}ZC0p7h{)l9Mm=b_RxH)6WxLs zPzSO=Z?zM&2g!%sw#Wj>1n zE^)!hg7-ar+8c7DD*?15t$}niYv+vff?c*pouDXW4xIC5 z+rS=~;cN+~&G;c1Scp1xf6z98J#Xgoe=&IesP1CPZ>rx-rqLFR!rGNS2R(S#oc~|K zYL9=|uF94XjQjQSCY{OybFeD%Xg1a|fuQ4Anuz1e%cAEg#cU3o?J$(;4mU^CXY1i6 zoG=q!Hpv76rJy{PB@Q1U<%glzgC`kq$hlUY1-7k3((<@QP6JS(meReceqUP1js+a; zBJeDZpgcnVE}iSVR#CVG`{KoDU~8XL$5xLgA7PB;|m^OAXZNeF}?Y zy5wy#*$?U47`=ES?vZ_%urM}Oz`^_<`K*YzI`F-u_`YdzFK45)DUKKLJ|yt9L3wMI-)Upuz_-a#XWs}LaI?oPRd#5G5<#j5kaqm@9L&65 z;vhW<{(Qaq4#+emOG;TP?RHK+!y_SkOkKNNB|QaN5jueyiR)eoEe*hQbf%8o?F{!6 zz*4=8Qttndn2Y;sCk49r;;@Yk68S?cJCU+~4v>mE58?=g1+jlTW)FSRJ7&ZaA?Xuc z>YsZj5_ru9l)i8qr#BUu16I%CQwfqt4WLyu7v?gSwHqUO1B!y}yblbjD(g zE@KWSAW7Wmv}ZHw6v%W!6jq8wq^wrv!>H<4Nha#o*3LVz?dTTKH|dN+ZXWcTiil=twMS(7O>bEqhAL6Kgj%Gi?0^p;o)T)p~&)7aqK#1N3zWWw`zh- zZu3AUeZ%FS(gLxj)849inOz+8Q0}thD%<#C)HpBeBs43V`EN6G#95TwNq}7Tc*Baw z;eaB=sL$1I3&n5?g`7I`*+8(hvvX|bb+Ek5#LKt<7Y>o`Om*IRk_Fk6ip)G~KH~M25Z(qGE3t@Ni=d z$K*4hJJat2Zx|Ysw(oCscvc|#fD&-XP$)tVEEN-%@xMZefDUr$a)nU_Xw5~l9ji%( zeLSSdo_q1^*XM;L$0ZQAJNMpttUAT?_<^N}Sxdi%s=O2(uG$Nm(ek0Wk8=o0w-~6a zT=l&o=?Q`44QP#Dv){~sXoohrTQZKgsb%aEw4#smNg$hQ6mE`vOI8ivPVV82uYLdh zNDA}=MW?*8afud?q2|*xgzCx}PE*sJyV;biH2oF=&%jfN+^A(_c;g+GI4`>|S8{>u zr&QfQwIJjrsG1OWRJR6m*@I0l!Gx7;*Cfg&5YU>t6!>&L!Mk1@8I|H?DAP7@iX+Sk zU*UQ-1iNV3xnMk7ma84FLzaKc261gIe=F;Y0OSXm9k00g9Uo_v@oLEULA286e6YZm zpIQ6h)9KlpPTLh|jbD4Dui`RQd9XnhS!#2{Za&rSxrOwXW_btk zx-nNFD3_~1AVoIAra`ukX}&tnH|ze*S`_V7AsXHL)I117ym%$L7<>U}BOb69k&%gD zCDL@pQEBrI!0MCn^1?G~z3$qD4nWhbXNaZXt<%sr0r$7O_;3NoN_nBOg;OIN7BAeq zpTtKE9Rsj?2UAja8B6$D(j+V>mCLtOy5WHUV6%o6AoPrhQQZS8G51jL*hG zTu@y-t%?tPYM#seS3KU^-iOQcARPwsn;*Uu>h+&TV9YP3sm79e*5 z^&G3nRLZ*8v|1oL92q*mquxaQ|+C7C!o zN<)ph)kO+7L1*BDDn9+YWrZ`nL_OtyLFZY2T;)R>VrTEWp*6NjQzE!Fx+d`XVC()f z?-0%P?E6xH>CO)B`_Qv-Gq95pTfJ4TN`antUH&Q<26q3IIJlgd%Av6351pr zZmzxhPumvPi?vsGH0J9yi-#&4WoOhb8=@UTaSLnkii zgazm~!YjV~(fBi=>aA@^NA^h)S0PeeA>n#o(zr0}%sui#1`BGM3&~u04GOlT-_y+0 za^46Ec*ZUTIf&yPHEIf}E0`ZUE%$JqTm2$D&3mw~6*3ba&-q$m<=suh@Ws|Ra*5K- z5$uW@UcVGda!YG^@Sy3c^HF4Jn~k*ywB|N*;dSHl>k}}s&)4X`e)bolnWEUt`{+TF zJOip7)nJE047U2J`1w*o;}Mak-{YMZW7jnPGJXBH{&OHg#l2YgGh*i4ednCx=+zDJ zz1bX$`-c9!Du@->SwCj|?aZ2SxYR7Ktb8DMxhSXk;KA`6=HA8j&SlB5+uxDL7hosW zZi_HOAm2dv-aUocHB(4dm^_KQ@=naBE)*w7Er_=hnvtv@-MrA&Px5 zR5s>}9x#u0nx_KA{yxx|mDD+uFX2KqgGupn?+3`+kKCWuSC8h?#5$IJg~Q79Zj%vH zy=_cu8w-`j?p>B-X628h8SI(@m?B8u4o#+_!)2HK5!0!$BYf?7#|10dMyjbN>-Rjw zB{JCJV$51EfBx8D^0I_F26VK^errVc?9nqJhq}yMIdFel^uRu!2M-?CuE=k#YB8gS z%NU-3)Iq5qsLnpt{LQaUWNEZUrJJ5e)JCX(yZEk?UgTN(6Hw!d3aawoJR3_E;7kKN z`)}k)1t)9O`2+Twnme}|C~{}UN2JHPh*a8=dAeMzphpggxmb;-oiDGEn4dYXCpy8c z6Qb%X7mQB^<=JXepb~oKFP)Ce>M(~>iVZ(kcwzZ5*mm4`Iq8OQN`m@+e=tw5b=RY? z3W%!*=89Ti{v(m&~T=oh4i8zkm^0D&iou=B8uq9wzo2;4+>Al0# z$H;riAtLe_Q4RMfzIqis*;+sMho6Ft<-&t4tlYVxh$_hgnPz~em3SwW$l=C%e5+sEj z(#`x~GLM4zxP^GRQ_zcoV<|IyxqTjnNsB!bbYo~jM`d+ECq&o8`RWD@cJ~2IUdUZC zVr!1<-nlNyAk6tXTh==zJ7Cnk!y7^?a{(@Z?3+2dm{_?3kp}}(A$JjD) z0BpWn`yO9MHq4p7*S%Dvbo_rjop(IdZ`jAraX7+}>`i3vJ<1A+kTOEnLH6Ec9b_ka zWX~jfZw^8wqsZP{_Q)R3?e{#d=O2IM_397z_rC6Hd_M2XG-kMuo5aUC%z?&We=UAM zTL8!M&a(n@mu(#c!tv-)Ok6^E-EB7OJ}qj8Pu9Sct$N2!Vj|@oXl~=M0Z+hJfG?{z zr=s!Mwt9^5@IlwnWS1L!?=tM-7eh^yB6SQyl_dKH7ZZoPPydne58;&uiF%_}xTOg> z(V->prZZnKpcg}dvSh)~rn$YE#0p%}`qhv1 z{4urH?ULri{`=(qkLBf!u2+ogefm2)F(fy22N@Z2rEdpA-+pPSrJ6KM69&D+Ara#4?O2gBb zjsy*JLd5(%f2D%Nmx#T#&RfGL?Ok#`&1#WlS~G9CIEoNtHVE@}Pr*(`G?cgiy1``#CJw$>qbj{ZP%-4f!e(%%rQII%SC z{xaohiG!++0W&#F>>tvB82GeU2#_8Q56IrnljPj#rb35Pp#PYf0QU~yjo|q9@X8!K zf4k$7rOf&~ef;0^^OnI23DBDhpg)C9PA@+(B_DdUL7a7p*}CIao>wUKuSj? zF5myE{KoBvw1W{^6Sa7nDLj*3V%>0JchstGpHBcGi;3i3+D z#35LN7mj87X0pchYrGzP%De8m-%=a+;4FV4(uww{KDxcZ(~PdRfb1GcfYiVFV6cA1 zJ?&rZu>Z~Un$()vayqI45-79s>|F)ac@bS|RG&yHyUat)eKi$@eehcJ& z0d@6|J`z|G6|pl>b6|vk{ny1F2~ifi+}osr?NCDI&(2 zmFBHxRCcw+4BcK@u(jl|BMaxrk`pUUZm=%k3U<-l46VH%}Ff7AjjU(Lvi?TvK!~%k3RnV z2Su6s4x(O6)|ENG?VPtToi5BuFGU+CkPUo^2Dt1vljl%!V7o>R2 zH@@4oW3P?8`-R6qugp8e zFXyp09%ooVsiK^wedbL;WfUk`QU?sBadmIUa52+$y5 z))7(JhCtFV9&|H+=HnbhDkBPtC}GPH_w%zW?vVj^b^ZK-^55M(N@szU%94Rt=DN@R zq9P}t@DkHGBxBANM$7|6r~Hob`1gF0kqP(Npc6%oMBdA`zmwsEvdULRNmGk^E~Fye zDIF761@&=sDl^}$1JM=aQrx>kv>I+MV^tj8b+w1SkEwajJI^YTr*i&7~E&P?iD%iUwyT8NrWD zArxqh-O~hg$fr%ezkz=+ITNCOcDIZKz53M3ur^sb;ce$+GYFY&*D;uhkIPssV&UT6 z7XApJ7sCp?gugb8Zr)NwDI9$gZ4IaMS|)sLWK`IG8rh!haM|O)luO&3w|ic;tL}eH z())o{@OrS@c8AC(gsm1W=2g=NIR*wg`nx(MCY;X&qdjAxwnnB-{_y?AW*%S^_hI+tDCBu{ArTG`b$%v31#b78$W8AP^Ot*K<`L=cvKskEfIztf zd*7>xAD+7RWOfkr`7qw@=I;cl-dAIO&leE8T#gYjEM9Oan_~>|$l+6Fa(MNfDSM&X zAgixH3$A@_^Z;s?Bw>D%=@{J*!8qx1Fw`jgcFjmio&ZxtQ|V43%3MJ7Zc!GyE#mo{ z!e&Pg6?)qfQr!t=aP|YMC&OjZDxn-w1A~4C{A=E}biZGNtfjJYd6=!k_dyn>Ya85` z^c&z;u=@Cah)3;UaK5{U{}WvarrNoP_pj6v6L@q~$Kj!lt+H@^E~Yc9+!neg;NB0& zfXO|U!y(-TOpAR@(-!Y*ewBi)o!zhU>%Zl{Z_m1Er)ksuaB1$mbS^i!?Wh2J*~RVW z#YdIVzFd8kuCyX}K|}g+!p8V=tbZ44dSeh4kPCpDh>zPQ{QPPq(i)*e@(t3aIam}; zuQ&pE#r9?z2EZ?GPj86MiW2r$1C3E_P`B8EGX|~X&!zkhen&%47gF08%kdypU<;k; znf5`CPcm;5W5sut|8be5Z()gpQ}=H&akPCE3eRUqL=qs?;EvXe?}}NNlp?&@aoI<% z^BFjYC7Jmb3Z3*zQeXNJ%%5L{Barc5o$fdb_PW6AIPP)}P=>Y%IT>)-`ZY7mOQDNH zv?o7&?}6;}P)QcA3;N0IW(ZNw_fv?UC9=rMzPWq)Y3f=wZyy3C{55*kY?x-cRWh6- zFrDg;D$mYZuIHiysd)n@JbM8Ap{ zhlevbKTAM`C@8(dcKl$Yon$t;sS#YaKajs5N&VZWs{ZO~R9L(}H5;EF75wx_P1UUggD`R<>SGoRkW z%oB<85QkIvacVA``*vJdnBQi-pYqk2yu8IgI{)?VPV?^Zd5MTIwHVIK)Xy)l9b!cU@u7#4{b0Ey2^jY-LVq%6lOxKHg3Rw-%(8ZZ@zmu3X8edfvAf`J zh}2zzpRXC(IUT`nQl@M{UD`&jss_8CvnS8oN=Ul>^k(1nN7s#;Ng?JF+PeAa&~4x$ zw_x_WHn3Lt-980p(jpqdFqWD6TK(sGc0J!py^MY#t4#41o%;>l2}#-^WPPL?>v)r;CfUSEUDYK1Y3^n@@2H7fs{2fe zdW&c%N%mfR&Ind~`hqA~yK=lw?mL~bRXIJPA%hfo5q6&Z&O>`ig~8@O{g)Ymg5R#n z8-D_#jf^*md;^!!xi4%tRF+?e5SL3TC8DK>5}igHgO%VzQ2dQq~#5iJox9!HR-w2CJT`0*Hl%>78e&E6{-0?yZtOc_vYVQUv1+)a=F9%!&Lp5 zUdFpITL>Me$)%LFP?!jX1!s>*2kptgJ(}0@IF>j6(ZwpyJ%fmbP69EH;w353Qr5(u zaycySnIkE2oJKk=bsn*T*_@@?dNE-gMOc_6UA}t(P#i;8f4CTs>DGCg^RZc4+3Q3W zjn(yVoty-74{YN${|tquJEI=-z{W-WkySn6V;Ne=(*XkP+T9q5KwvRZmtt5!>*wkX zLPUJ)cN;r5Q(K^0all$e6AGZ;*@NX9m;T|NJRhA?JaNOP(obGAX11v{F8H1=^bzUQoJ1W`)*=?@jRmrk$~PM_=8f*4?P zv!adhtU!;k!2Ud)1e}?3{S0}FSr70nz$d<@A6!u-)%AN2fIssOxMWiln9~@0SdMom zw60}(hlQs=5NnBy6c)(85TWWF0MWn6v9!6DEFCy}5YBfn!;w^MDVP1Lim&kIqx*IJxWP zc^`Z8B^COES?#}Zs41k&x6lM)0ZLl@Z>9r$(qEx{M*>44TJ+joP3-f+wfrcj?P&2; z3V4M>>-|@w<5-%(kD!}PKtD$L4&ACQsK_r$^V#~Hy!;Zs(F2d@2UQzZ>YUH8N(d#K ziVQWxQ!PJ7gwbD=Y*Slk2S9DDJ{)?pN`Jhc3H>RF@--1)q~k^4D)+Z0qmE_gAn>DE zrD~`MgIP>_+*R~t+N(xpOke)Y1XufhZu)>(Id(I4-xx6Da!Yd~>x6YX-AwDfLObu!f*GRLS>VrtCBR!lqeO zK@@Y+2mIcTm)cO5DFV<-`_j4M1N1vpo~q(!S4ZbifQA=0gAT z!k#f(TiYR{%Wfl(yjN#k*_IFb54dDjU(6M%Wr?)e3w+$-P*;V_!o3XBVbWp zZ7;bIb#SvLwYGJ!jtY^!_4Rot#~>UkgnvM1?^yS_70M-<$MwM)v|IR*QSbLiYPsx< zwPH~_cYuBqml`Ivg3ggAd#Nl_{Wjo=&P26;glH%m*W&bq2sSj3ATV`<=~@x%G*orJQeeSmJ}7t?;~n_`F1d8JTt zo64Ese|B#da8bm_jK`cR{nh%@?y;6lgWcSJ|1xq4Z<}w1S^i5=qQ70T zF7z20-`-rzIrz*xl{z47^6~1OJJKC|n>6OJg`Hq#Wp@x#Hp7yXsDSbMm~})j(lg!g zP94wciD`!~`^!91vus}<)S!&K$SOn1|j`k%HW^ia!0e0j+uQNC5XK zI*wvBD-|iKWLlhUuo@J;OOpXiE>i`@7*fbakDFjcnO(q!7}eGr<`jmBxzXa;VBXP; zi~#7Ulv4Qp9#$Yf%DpF%Pt56GU=AUF(xHPETPJf-nLhNXEAyWM`8kT`Ei2*67>~FO z{|jT>G&OAlB|lQ43yQu>jD>R9ve?Rg;dq*J zr_BIb!?M?n76ONzN;2wV#m3ZtX7Z{31QtF-DZGIiO@<|hev#!!Sy2y@v1}=D3G)8! z3IL+_pV)Q<3;RU_6$phO1+g(G&2z&UW!C}l&rzBmKf1#7fQ!*B4q75MD6WGmzXJ^g z$1TRZa{wtL*L=tTHQ*dyj-0dgmU}+IQ>TqPsIv?8`L`%s?$uw0IHCsg_0$6r!e8g- z53id2Pj*2JPtvo`Np4wYo}Jr2A8XGH3zIsojQ;g#cK`12?$UmW-||yG5YR)q7+M!e z%lEE7=wg$7CCsrQT!jv&sA$|z8oirkOlo!d75Kp~7N0S;kICK7@$Bfj3lB{i8k2$_ zc0sjh_%`42o5A5gMU4gJoW0T zm02VBP-z6DsNJKBo0QLF#zN)e6lL__X=i)(k4~5drT-!3Q+zb2I)}cN+d8})!QB&1 zTT)Ud1r886pLY_F+Ah)+$D;1;L3$n+mpW~9W4h^5c6au?V6Cdw_wB&$won!ioD!QH z#2=keC&sl6!p;Fx`;8P+;i^mhI85{wBN-wG>o6 z53`xntknILgjwTCt4?C9nq|x>m7=mD94Gzh>qo^k>FqZVP7ywYifJLU!O6P}oO`2S zK!cMM)@A>gg`RyyF zY;X8pTTeJK>-tmwqo?6v>tG&xqs;3)(YKyQf5j#VS~N!i1U{&?zr}44*XQLosUS-~ zFZ54cUE3VoYdx7&eo`s;bB}gzpLWs1=c3;KQR_Sw?|sHx?e_COM?Io#v7n;kxgE(~ z{i44j^qm>=rENWF-DPIX^}imx5tm$HSNne0>rPR2D&eXcqthVYWNh|*KweP7?!5lj z3lpH!kg}c4k3j*qX3ZTbbZ1N!PJ=~(ErcA)qVYK?#r0U0w0v~>T%Un1q9SQZ(J=GJ9!I9SPXC<-rPi5fjIs=fV#FK7;$1Y=4 z`a$`j$pQi>y;rM8-Qur$>$9l!q>?d;K=zMG4{YTX`4o&-qQABbZt4I#3=1RxGoeZ! zv>pV#(R-n?r&N}T78em`a-h+PN%E0QMWt8*TZy}GomDPdK2*PzSLh_uMphNTu>!2N zyj=NFc3HftE;bcNHnNE~9=2jA{P|_X{4o_;C&eZhI(@%S6IM!Iiles_UWwW}4Q}!; z8pIUIB_xNr;P zUvPgjj|Jh&YSsxj`&;<-<=`iEWzOt(j!EqxX*ozsDo zxml3D#6DkjxL(a31dof~p{RfSf1`U5QPGX3AS|r2t9jwlO8cc}-dwH?d(R%yf%jtD z#zZOa9Yuj5 zy(OHhwUZmW?UQn!*?!mloF}`3y$u8_cEtc_2godV;zB!;ahJ9PqMp?i*D3-xF9NK- zyX>hD4OO(wKO7Ik6ry%55g|XQ+O9!5r83`)d>*o55Jk;o^&Y-7*hv;tcuD|7^nYzG zQqe4HDyIRbbMl`g$+S4|{!#UZG%fhr#&nrN3@4j4IuoDL7<>mPwwGE0*cH$%bI97Z zTz(SxTAQw@Y$4@uTm98j$B3h>EeHh9-y4BKf5bN>!ib8JNkvAeAJHE&$8-dyyj!-c zm2o0p($i{dt*lb~?#80Zeqiq7Xfv?6dTLtkaP~kxNJKv;KyEf7OzBfo-l+q8D;P); zi=xC~b&aL*-yhai9P?#O)KQ{czESLX!+Bm)EJhoZkYiL<)~vt0XVsacq=9_{(!endU)3UiAXq&{TWKR0<(c6Z#fIw5m{2Dzzz(VSanq{(OHAfvWi# z2q^x*A>bnY)MMHS`}X8lS6A21H_Hnhu0|aSPFmI^kMP>}@Pw!etPc9A^!FQkv|svV z=`)QY)D}EGgaj9ca%qR5cmM4}44>B=XJghxV>>^ ziWfxDdV7J9yaYkz?EcMmkjF6j)p+v;*3E+N(T8ZM7|jrUjAWEMKkASpHY8?AABjM! z5g_Bu9=!C>q%tSfwoq6_+ZY~For8GzvdMFwv2_98A={(n^3Hy#LpstN1E5KrmRyZ5sa7+!8ndygKSh4OBFq z!=9j{4XOVyL03HT6*3}Ai^W-g!his+WkZamuMv@i5~;uv5-28mfkDOWZ$dbk@*Jx2 zuAY@S(QG0Gn?H7*dRQ2+f{~F?lm}w*sGi&iY#>#PCMu#x!+Q;P{49VbF-UO#UE-#* ztlABkbtRG4V3leUu-D;|Zf%-4rRrwN<~+GajZhJLfi%TkPT2bGsqPY8(rVhRQ*qny zZ#nJe{Y2h=+HJVoxRRtdf>p8Ls5o~uGpBm{gVx#ef~u@mJRSOeb4IgAn*qvQqN{#5 zSQDa*OW5EyPKmw`ZH;+`@o*Y;`jgobLjP?FVmL!FJlIw~aD9b6*czMZ>dC%-SZOTG z?s1^?(lVVlH_{E8nEjx>Fc(LOlR+7e(2ey<;p( zw#6;T!LW*UtNd(wM=5Q}sj(3c%<^3kNKK;m6XkU670;#5F0yh;os>>8+Ei}-j!8dn z|5q8hKIcCyxSmAJxkGRVl8ma$N=qQxC9<`hdLeOkDu5r6;rT9XJ;%kSrcT`4+KT0f z4t)mFi~l;nT{VxZ*adVX#HtHkkg|)%=K-U*5DGtDZoEWME9N+unBu6*}m zDF@wQy~5c1@7@=#`Q~!HOuQm@9A}8@=7~i0?a;^r$3Ndnp2@%~q82DI(tcXllRWtq zmRy3bpIK}Jgxs5{z~jV}Jq)O%V{W8pEU5$wHD$Hn!sI>5=qn@IfWNNak` z0l13X{XdL<*$=2PRll(N_e?Vvz|z(Js{AM(KzF`mKzAOiHC z^oa#bRL=!%xUo)!+KmX=3u$!N#B3sNR2$|#A=&Tk`@(EwiiqirzMtf>>2%O&J#+5r zf%N#YYr1O%sw%uN#UsSftfC}w=87DAX@Jpm%Wa6IE^FmkZ%9to9XU`+VvT?<)NZhd2_WD(?y;*u^-1HHb5b zdZqg*l-6@LA8KuTs##vCsjXbFxcDWyf$Nnsm`=3UQ#HHE7>;tKLskV|)Kxw#;7%wAQ=6a``vdCBgVfH#2fUI(VDT zjbGn4Hct2&{jqOxSG11xNTdBm_dMigj{cXClq1jSA#*y6x#_`O|K;=ub$N9=iT*VK zN=pKIWJx1XEpLFUNOqgc1t*}0oTB545WjaW9GhNFeEU|~x{D_w{sswAZj-Z&Lm9CWoS#*euJF+ zg%SYG*I>qn){p_d5&%Mno;!x3zfOD5#=B=_Fs{6D;BYj@yh(GeAPGD5G7JdxvR20R znH3I_w3G|L`Zrzioqq9c#_!1FZQTde-11-C^f)gD%nbgsqpNmuLur3Ndd&L=UIzs! zIm2{j`)aU+H?9EZ#fA-<5dm$X*nz%B%!8n_nqn@-ww|R>;a`Y+g&pGEmjJ8oQGmfB z^B#9Bp4I&&slFR!#I?Hq=OU(6+BkDlz0w(9cPT~@H;vVu_tikuC%Ob`sq1$6I3{ZZ zEJZpfRYFc(cjSID=8@TbSP9pA&rFuf(z*rIJ)HH8xn3=fv$^jSXg27K83D3S^6x>z zzb9dVxj0(FcX6`3ju?G`R^0Twa_(9)?tHQ5xIyHr01!btcFb-r;L=--F&WN1cX62Z ztK!MoUV_;^*sfK5|IzIz;|VtC!`KHhXKRZD=CWDZ^L@6P)r-gBM!1Xka9u7WWZ|Ui zN>CFGrMT7sEGCvBJBGw?h{HdKh>A49i-V^PU)Q1fCl7{547Y-P5^sS?4+is!m5l8m z)cIfa`IK4~J*;$WhHGH9Wxi9hW znKtKEem?#a!n)1~xWOBUjV1&{(E;Fo4GpOk=K06u`0elm)}dfAb%^#V@VLhai%^+B z*5bCRNDHmo=|2L>GVpai^#koV;E31&tQ*|dpH2qxvHvdc<)#x2p&=hEA%#h(I{a~; z;cENrv}j)H8w0$a*FyTzr9j~MxM*gO#5Tz1b{B=^NQA8_aoVmGm)IlHtqEjCX9|2Q zjHD~E&YYre<~7^dnE=WQpW`ySz~V)oNHP#|Y7K-2VQ?NkculdbL#Hy<0p7K=srbpO zfvn&!1@F@WY#0SAE}l(iZ9hv)-4$gRF;~T_p)Fbb9JKHkZ}d)dgT)Rue6O$V^zAu% z?fIV(5zt5TzghC$=<>+QnL91?7qzw|1I$~le(^tK&U!Ba^@Amj0(}mz08>*NgI4Sc z`t$egfL>?lDoB2D`bG=s`1?S%>*o?aH78kq^H=al&3_a@Ga--*RB5x#hjTk7<(l8h zWtpM)S%kY#eShhm`*o&^L_-0HdCu@+W%v)wH;_UHh^h0WElkMFggo$tZlV5OEOi3% zFhmX@#@^wzy=GCAQlDJl>S z4WqzYE#wsjZhmqR=hvRL_Gx1ZQFGdNYG7pP(3X?7|3A8}QB0A1!8mHPI#0eifXwH2 zbw=LuJqqNBhJZ!+nM|^oQlT+&V?5w1K2mO4j4jOYq|@`5H}=JSk++adAhU(dzMSnwbAbiZ#2jPZ6@WtIY^m5-TB63s!hqA0{mmF#;hu?Am(fWuGK`; z0C(C_;OG=5`S{x@M;HxZA4LTzoY&5FOd`MpEK&*zbc|GLwL@Y|& zw2(aM7z<0%MYDYG=SV#OkKBWH%$g8z*;T$$FpJuDSEa*z>T<1~snv1RTo7_-X=e5P z-vPeakX`b4^-WlKpNSxy3%IZm=YOIt^dk>fL+r&Bj8YOz z+x8>N3iZ@V!fsaa$orgeHSSK!XENX~EHzfnJOT@Qa(H5)Kb?204(86N&}9plWmQ`3 z& z00{d^o)g?(3{&cK!1B)ej=*>_6xGaO51EuZxOplLUyAY|=c&Mv0@|z`lyarI?KbQ&i zFxDSM;@OF!30dHcWaMMpCr`EDRMJxbv7pG|vz#&c)5|U*P|$a8!f|`>^>XSRg5VG= zU`o)8pf2-$Q2SIM8TE<}6~OPd>RgSFl)%QT4a6r)CIW=G%LSLxDO*Vq38Ru1BcRQF zWJyvc>%N|fZY3+^GV~xGA{n$E<5Vi@?M;qRlHtvdLzV5egDpVcZ^oE=*YT`;xp8y- zkF~7E!TWap(Fb2e+>zKTL`dZa1)3ZGOMN&ikKNF1a9byk_TV@b+-ppdL`eeY_9{`C ziR9|FCvTa|PwGwR&rGP8)a5X9(d_h|8N>xBm-y4*Uxc$lZ9XKu3Bte8JexIp12Jlh z)_?Cj)o9UgO^}Em#how(qc~{4gR>4^X+UBhp+k2GdF>G=i`b0apgTXCTO9=!X6BPi zZck2n^RWMUqB1Y+&bNw= zGzxlMWgd?*w`GsU`k>}p8=tQ~OEV^N8T<>STD^Tm&4(i9kMm*3;6$9tA+0~9V2tAk zv4&YD=k%s55monhLV6ghkNn7CI>g`j3Ff~YhQ-&c=dFNTkpBfkrI_$-{YfM&4inpJ zP!CXB72SqTgA!scFt(4ni~~m71!4KI3!_PO3^j>8<9(DrjUgHSar$Ln6{)Q*SO0twLzQMuHXd&sVs!^2Lbk_gA_Uma+vNr@+Kz&n%Q9wI@2qh71Tc%XYE!216oAB6U zaFYg4dbrX?^V1+G^}4Oii&pO2ru63A<JVL9i|r zTAVo>Kou|Td&X4&oY&2Tj1rwnl?49;2Hwdz~d~5Epcl5=uVZTF3 z55^lwAA-f61sUVpteYIH{>4Yo9^sO=Dn6~v=kQ(=kf=(U-{r}AvE%*97_68nye6zr zQWnKY_)wv$Wjxd}t4?TO8^R(+1`-|>A1vvB4Fze`Ca03-{BF(frRLs9eB>Qj;h*{7 zBl`wX(6v6~R|>w*J(Oi>YD2U2c%%Wl;{Hu4vE2n>uwv(`yfu!cM0>Q6{@j%Vm%^DK z>QH2Ne{$J=V96zNt#`F}1-9cdQiWY1i$R4q(NGtHvFiY`-i8-_X5BLzy=SC3`)>)S@{+unnTmCIt6uYIzG1QF~l zHNpAHnnmD_)ExNL@Bh1%^9LyvsyY)bK?dJ89<0IW4?O|oiU_8|2G5W28fB=anG{VQdP#GK@S~N$^z~8sgGB}cMp6?*@ZPSF5oDw0^Ko(*JVntj3=eoptfI->p9YV6mVkq6s`2j6J!J#rN!B%AH{V4Njnx`66Efwzw|M(B#rNeQNE zS4{Vx#LW&LHR4q-9)(hym_*SnMsOwh?a7y)T!F1_E@WRsm;sA|oe~{zMo;}pg(NRe z^Yllc5=PVYLvrfbZVVA!A zD9r>!sva)S^WY#>>$gh()%`}x*p|Myy^$9pF|=~!L(E6d>@ zrGqpk#Vgm!)?b?(P5D8_LRnz$717`K^)vsoWL=7uh6x6}ly6c|Uq7zJffYy|@1a{_ ztm-yTb%Q{94`FXTwQlan)6Vy{! zJZ7_b`Qi_f9K^glJ`z;VPcW!lgb8k!c!>8lip&fG1xg=G%v|hYJvg{Css4V*-BQA7 zRz;Zy6fiMBt*NC;rZGIQfUwpR_br1(CaxF4ZgJfPAZKAx0kSz?*f`!s?hc(K6-E{b z&=4K={QS2J-fhzFPQ)^e9BD?sEXA@LjVq}W5?2OTHu_8=gGUgmpzgSIh(aJE>*08( z-HV~U7s35^q9eT^kKQ=sx7&ED|9+zmSF>?~SG2Lyf-;j2F2X0K^^Ch5693Q*CZ?JC zko5G0a&Q4 ze<%xfZ4pwnK((0RuctbTR-!R}ZYETP-1xq51E@(jtMG&QNfTKlQM6m8H0eq+ke>9m z?HpjL{rsyN@?2=$G7dQ=l%V=ko7}mQT3fV}DcfN1_q3&qrWZk`4T!GKWH`eZ>mELc zeG|RR0JVF`^$cq`#z&hHO<>8CP5!r+ju%>5@0=dUuFGui$++>oP3$|KCKmK|9PKHLr=kdhrMW+HU%ZoVo@yISAM4UdfLMCXA`^z#@UUG`y)*_n{{Z zR-nuAU2rNLtB!|e3~H(0G!Skj@Nm^|nGTJH)G-kC3Y}rgbTiqof+cAYz<72& zUYAV&JFzy3x4QX2@~LTn*6c06Q;}d=v|`Ve%A~eKY#MRt2MxA0!pf|DPeC?>GGyp z$xlUAu)7Oo`i;>^j@ih*c<9zQHB}fqm4P;yoYSw~9cj*}^KFHKLbQ|`=*dLHz3H>D z_xep>V*D^qRfiR^U>p3X;3zxlNa|>wF>4kz{mFb6+(bT+idU4At8x#u$L4jo9)5?+ zPEY6Gj#G|+QRLn8jE7ICsj2^)Gd16|)z&__1qy(%Lnr~g{l21i4K#VHB+9L$mGlTt zpZHpg>hy;e_fLEq{K}|O{#aRiMpBjj?1R;txiMSFyrH0~$XXt1dZ z|5KN3@)rW8bdgrCDVzk$%P>n2#u=_|r~H=NTLDBfZttBhFbI zK5K^j5D@&X*GL}0Tf1K5IoD!%k1A~bnjh5tw%qflZvuufC zsKOr)&t^yUrd%FgvTaNT;VO`iPJ25N6Ah`N@I%;_pH#vHsK~TTsO_Tu{dh>Vr*DF$ zFx8fXiSdojpe&SsWZ6{}eS51?UnR+@;@9h#@z0H zDXcrmaMB1_R+lZ9l+e8YV2MN2M&%FmP4@k!g>@qDnU3zSbm*Z=O<|Pa)QibWcT;}Q zA>0fnJ>N1V_we@^E7E#<9KT&jMz0_`#d8dRVXkG+%UgfRk(~6Aoa^5acE((Tk9F1u zz#mF5tdV&@LWO`It>;Dm{+0K1>ftmUH%i%NoK>edP4>M6b5@xhtJ1#et6$hG!Mr&H zDruS#fo)b@1p5#=4#Wz-7oBDx>)27j(F_F}K$ob7@2?)eV{^2m4e~u2s+w8TneGg% z$LHFZOU3LPCVBFh6EAO)>EGWT_o{F?z1Vh~`4i!7H?X2aAA^@_V^lbOTB3n3mzB0m zPylFxPFukCvR2|xm;FuV<@h_S4Sw&Qp%^Hri&k>8dme?8lHSIRd;ByNtt@UX5+kgC z$A9>gLVe!41(iKY58Zy}_?>(JANPyG^R#f>sRjkjLDJ|a!}_fBqwQbGdKnTDu&#?~ zeeX`?;ZE1@>Ef|3PJrn9lZo0pMG1ksnP}wz^d>K_DYXPm0$?Rnz$pu%m*z{uN0Qla zEI%=G|EN1DL^l480xVX=FHWe9a-~Dt!^>3}(5nP=cmP|kZ1#l>_w`5mKOr8x4j(r5 z)KlSm5;XK8C1A6oB?^H|K2KOZBRHF7*95(~uEjUwFDe#`G|pQ=%F zW>)H_GVoXXeB|_5x|$d49pjKMK;PlQ>(L%z@omFi$tstwVp?q;hqTo!eBiVd^Ju*G zi^3Et4reN3Zfq$ub-EA+zmp&ItCBqVIBrW$>-~)2(ZhnXf48y~!;8tW-%HWb&-?oN zj&2o?i<_C3%dEp=e%oWekB>#Jjva2?yPi(u*)`z)6e%|xJ1WNaX{yWU4(ZdH5WV|` zS(qDYhfAe#N|u_+Zj3##H-QwIL=G;U)ck~u@}+^=x()iX)h?796uM;$J&YFGOL1@L=OK5}#yv=EWsNmT zza?fjh1@TWfs=dR%t@@fjMLpo#&lIA93+cwN^Ph!mP+%D+q~kj31hFgpY8`t0M;9T+yF>d%8Y%ndUDiFMo4xbYt_-?Jr5|uJ5j3+w}^s zzj&gV(k=iCq(1ygM;p+``Hr-OgW47m&s~4rMh4Pg+XSIB{f~h?8#S*!34U>P0 zyh0Szb}qdD^;4AF6?f7CVbr_NMNYZqkgm)yIgLuN zo-3;n6EUxA2jQfW;ek7HkmbCqTAn?02?}ue?AX49Aw(>D?KiN+`xT>2l~Kw9kg1?s zbk<8H{d+WXEO}~QSJbAE$(3UL-yzR6@`Ug;Y!X6j|B{Hj6A?DhnE{AfU69W+XR4uP zid?dUfiRDRqtLPRSI)6wPQRDYybJ;1uZ6GI?HXM2=a9Uc-S}u~V4sAx(5CkpfX34Y z7eApF-H&}5c%5KkdDwh}zck7M;CoBOJEm0#IRqSQf#H}5DLGlbXxNc9cWDmn;fDi{ zHliGS9&q#Uye=TiI!s>!^5kCW>wSd}>@{4RNNdA?ZkgH<6CA3&pE3;~6B*Z+0}rTG?e7G-ySO5lk2sNZ0dWze z`WiLc`~6D3s89`(M_!^k(yF&1oP=nI>db=iyUia)Xhs!uiz=p9Se4?TYo&-UieFHJ zDE%=3QiK95xCCR(DNkBCNz|dDOu2q6s>gWdZ>wfffyUjLZXFSJE$fsO&rAaZa{Fzp z#$sy(pvTBBIFD-}VW%uGn5VH&Nk(}ozqbC+A`PN|RyS2cH*$p~X9XDI77_E!S_mZe z0`D;Ls_x0I55j?16jrz$+FW+09aM!1pLbzx}nCC@{zmmz~QVJKD`TSse9L=R6?6 zviJ>PPpv?7I#1SBvjP@Aop^16?IcOuT$LBy1T)Iy!A0*mHecGHX#*-d8U#plPUdv9UAlz=nx6K1yD}W51S;iTJ|PLgq)z9 zpF3weBsqq=$ym$?zu#TA?tDV=Y=%ay1smH*O>~8$E(9kshiJ92>>PLS>P&F`!0ulF zr`mVBnY@5RP2rCc{gaAgs|=^)8A7SDxrH z*pn?-5WcBI7ZI2rZyX^B>48f>Y#R{U~ijg?UCQ)Mqn1adPk^qjAe;VBdL> zYAo38?WX_aTCP2n7fil%Y${ac6YZ(*~ z@UJapGac_ev_yZbVqCz?8=Nk4_Lwfimv}lfzUZ34@2M8Zy>Ae6L$htHh} zgHH{F>@e<1h_kR@I6@%mhfSC@Qz5lAXpg}Q&U=VK^E zbR^Na9f{i#06<|C-0>c4yhTd+{f)I?c&o>ofdF~0XL8pDBY8QPCkbFY&FF)~&ItM6I6L@jO?PbQ{ex>r_U@TJzj2~!3UCeb_ ze)}-75=DtS)*73qyPMb2k>VBTstX`2PeE-3{!7tkY9S@qb+Yy^NnSmo;`G*8xcO1= zn)A9V0?t=;{QI`{@|>B4^e`|dgVXC+!oX^NkN<2%!_b&6Nc)2}6-`*}KniJs8M_FP zkIP%lMSgs@i39KCCW--eAm8hN*-;^5QA$aVkPTEL?8U6yR-1~@ zUL^j!6|sZW-2)*2nLnjYe?}dW8vAJg7{Vs5><60`NL1M;K#u-2>0qmv|JBQQrHx)l z58ROrM)CJ_5?-OKAWfEjKl%E)fz}sAD=<`Mk@H_-bzIz_?KovuPe}MHRQl5R&!+$G ziC=VB*e#RI;?XC%nRk&_$TZ}iZ(^zFz+y5gv{-40(kpV~p#P!itiz(}-mgEy;2<%e zbcuq52+}Pj0)l{)q@Y80qcjZNjdUs@-6i4B-3UWSNTUb>((&6o-}n97%gaj+`<#8R zd#%rkFkw7x|Bz|uFABN@=1f1~p4d!Glri7CDn0n@yYvnzaX+6~>ruSBS3HHE7o&z= zS~cPmj(q~Qv)Cp<#&A4(Dm{oMyD)#B8~J@+&_qYqYh~7N%8Af74y8WQ5FflvJQ}U9 zZKl{rO0YE9e>cJ*O{aDAyDN~$hN#d_1W?=#btMV{c7=E3sys!>i9#lT%5k~%Vhv+BtH zTSV97xDj5>g=D(UErmQ-^&DhM4*eCZ=Z}h672Tv&Nv%g(b+yq+f<1;~vw{Ug{~%@E z9%)7)Ce(+JsZKs2cE9~r@g>Jq4vVq%-5zsrWyG#oUYOvT&>yrU0hTAQP2DfwLU9;D z>~?lYIG$25)H7voc~22+HEd5FbevTNyF;wf4q9XOLqD^*QKECad%ihKlx2c~y z5>46TQ41ABNh$V6j+b8UxSP$4d}T2yhby5W=a9ws{lkzN zQ#8>TSH7H79_w^~-UosEv#qQvi^pMpZ};Pp_?!d8zG6|(L@HHi{$XKH_*9>dNL>{Y z9M;k!_kChDmJFsXL(<(uJ&rF};m|*}>V>eZST_12t9 z1N=9Cqr_Cz6ayHS-*>*^LEW=rQn$Yy!EYlRZY6fR^y89O3d16R>Q0u;&D-0JcD}&U zrOvm1DVYXP$I=Y8jV6nW-+}G))OHw#G0~t5OBV4ZI!`i>X6KT51UnH0n;fN$$F7mW zJ9K@=8w3PP@$W--n&^&=AVexyBA-pVykD46qZg087GJQjvHhojwXVHs4W#qAaQOS) z2Y9n3M|`dhwg6kt`8S3euoKS8f}(3)%qGHuBlZ)Ql#OK8F}bxB zM8Y=b*Gx48NnEshNoRxmh!AEDC^bX3!}m{gL;KdAKr@=4qMW_qx@Gs{KOKUuG-_9F z;+x5uG?tcOPaI*wAH)!NhIVZ)FyIe`u~EK9T`Dljhp;ha``&fjd#N%)jiwO5hF4rK zW;Vs3*N{#MlG7v5%!kv)E#%E1Ki)ozVI|SdguXGL-)zeBdPtJ?@sX`kk85rroQn-} zdxVv|N3F}QOpGnqF+w>u(#;rb3)%mBx_de@GWi+Mr{DP7Ry&>smOiq4^RywIZc&Si zysX>*8DgoE0Ljjm)mme5@9W$M@#v?>yYAckK(Y)+%peUq{I_kEKN(1Zd>-FfumD(J zTfSY&jv#gUSs|xrJ+vJX)lf=8hmQJ{qY6>++D$xNaQcyybNZaHizV#`N^IwpZ;73t zMFGy`L;l-eqy@W%E~D?PyyZyOec;W4l(h8Cu)3L_X8VbvbuX~#`f3Q!ew=@m){jqn z4o#2VMD#kAV;0V)>c`vsappu;>7GDg1OV!>klfhmdv$kd|M3$pl$jcqh-k8NTS7WD zkXdiU8!N2p{&W5K3AMevl!o&5NerPa#Lm#)%C+mjVb=vPvF2Ypv`-cT(z1A$>kgeF zUj~aW8As|7&1Yaj0Z;;{<O?nlQVu`y83qpFsZOg!yJ@zjSvak}TB zNhq&$f6>ljcj;z{7$x)HclG=r>YqZopTC0Xgl2lTtb#t4NEBFlLAo#Pg)4FPd;?XV za4yg)Z{}26bx(gTngT60_XMP+ZLeMDAYSa+mtFBlW2F*_u0%Sv0hr$! z0u-{I-icJea)(o*rAnxN=C#;XP(O4OH06IgOk5F_#vuNJtl?wWSvSuk2M{q*6K@;g zpE_TK!dhFuYEbXJ?OajiMbW5L#ly+Kihsp@9iaFCvVA2A&NW2|qd{+I!?dSqM}$w5 zR_lW0pofsw4csPd=d?t!^LrULfZChLT=wGC&SHK%i}Lu?6uH;o=lee{>s?w8GMpE^ zj#YIModGUq{J#{=Gze4Gy4HxzVkvvy+t&irCh(j3QegySUcoo2O`i~hcU(!6%qq-( z3#v)!eEt z1zDg!8gT5f{y_`r%iONCpO-(ht{nBd`)Xd9DO;KD3olB!+?MOx*E{+151zt=Ja0e5 z=Gd}HxI<_XQQc`P%b0Bwzec}w4nMX~W`o{qg#(Wwe@aOeqsTY%_4rko(%*P_Nx@FY zdP&5|x$DH|-fpp~{!C~(E>Im|Z5J!SdhLrYs9>?{y^Gl(eQVd+9uTA}gh9=R4!c<+OYZ{56j0XCmE zXL0l+M{8R0wu?cWGTA(Zu~OU<9#r@zx$%ZNdC8`ItvOT-LRb{#u-Wo;dZ|@?Xo8Op zUBV3W*YLda_0A#-c$pWyjVp?VTPJ_(gWEI1E6O9^k{tuY>wWDn*9hiQZ;Ig@?3ya! z;XfIG`LksuFQ@Bt+R*g#BZq74$m8*-x6J4p7~R+1*7MCBJCKyy5Zlce@jj|{2Ea-Y z`z6Q^@AI9*PZTX7HxZDr@o}}e;Mvb06;&ya&v5`b(q7_fvZG8R#xH9$+klC_rvxxOBq;6o4>taJli3uT|Cl4 z+yVF9uwvL>AdJSAp+@U)Dr9GeZh^-fhl)aCuS=V^-Db)zAXqvbLq(Mi?iR5pFpc@6 zY2|N98sw0_CkLl{n7;SmFBr&6Zzebqy7Hr_U_!QcWDFrz`MuBYK2@=|Hfim)6t4an ztFNiP;?v_E=0W0NFJr@$zF z-Jmr)MVm&HEvwT`Zuf-}o#r?kOI)9!mlM6<^5J-+iSC;;=S8zs=d|G~u>s=IFXqf^ z3j$>94D!#O(8DmFC06vQE~JoYTKelYskAOt+0^-#`S$Z^8e~HPP2N-AA%J#c!f^ZPPlm>(4yLQYP;Is9}t_vvnP_0IFH zv1bk1e(b)!$S+5_(Fm^N!$|nE8xO#IMSYYFgVn=SDEqg?L5Kj3W-7eG#$Wn~jV`T| zbpHt<%Q2+eaPT9x!Y|k$0EL6(fIKA#5?;{)&%?zmKbwELpUekUO9-2Iu(GMkYb;$I zE<@r`1&`w)ejEx*EB2SzfpU3O@0ldy27*RIf2k}vg=g+_TS<}Ss1FOHSI?hpBr7NO z+^gp!{hY!;Bok2t8+)bbxVzP|v3{7R`EGjLGNVwV#^o3`bB|x zNC3{a5uWj{s35=gC>Eu;V`VC;vmL#UI%F< zeh8+vil;XcftKHIdNigVfpt!co9Df>lz|<`!t?PU%6BddpN#IrBYnkiwA*AUCzq5C z_>SX?&BIDcNF5%QUDug`m)@@%;|CvXxMA&Az1>(C*-SFQt2(hFNMhzWcHcG93C94!qJSsr66!eSKri~H0GY6S=hg7%q+Z@csIC2fv zi!*d#z!+o|O62-v)ZoWh7`8LO6owg^UO`GnNL|JwqT}2^)YGsUZM{S= zGJ}MyOd78cAP0WZy=f4zq0L|IEAVCG{%1|1R`xTr6T%VJ&bG&Y*^)DKw-4s(Ze2FQ zsjyITMD+!YwlVVfd8l5qjF!3-U(}*Q;~EF#1vN1D8Cu5=bKTTc0@Dq5PH~kuXzXTz zlt6zM=gElZv{Hipy8LV}Jc@x}vJeX}jqY+?nxe<0M3Yl#1#}Ah7Q3;u!kGaJ-81}$XLN0~&@W(8ew!aV zQQhUQrWh?bwcvR3r+>tmcu|7&Ec|d&)y)|peeAaqZXq)qoc&$_ph|LRvD6@X_XQ;t zx)p((pFngJd4o?|rV?1<1!aUFnjYbr2e0yJ*;*WVvnz;yDJXoJ+nZ)B9R91-_&Hra zhDWx48k-r4I3`LWU34R7sse5GKMe+O`C!YhKrq?Kgy!lc?jTDIV)zb*6k#p-UvX%9 z#{sJxbG&??80zCj5BYQ+icLT+(9QS4NId_nnrl-G6`#XPJbI)4`Yn3&+;d?Rjib}Y zsrs9|N~eH)On~g^wuEKPTYBdhIBMVk`*@m|?HqPx`QY7aYZ4d+tzE0<6PXZT!`r?D zeP@;Wm==Lww9Z|J%WMQZsc$>6EiJq^lKFh$$5?F5`4?PrdW+O=SUUAV8w)UJD|tXx zTBxdyd(%XDXnvi5Lu1v@CR@I?jlueoTo#B0DkPP$S$lu z%BiwgA|K7HZhI1&(Kdv!s@;{ps_Q6GFKH1iq zJBE|9xmyKjgIMrPd$KM6G!NZkE$dtl4j@f@Sf@7&VnYHk>7N_Bz}yD4?){#d^9K9r z0$$Tpw`u*(kUG#$1f`A9-R>N~bJ_IC7a=si8|MR3`we#hQNqC}jakK?r;z`F$bxFf73m(Ez$mFuPZT7Bv4!LGBANTbT810ZOe^y~ z`0(Gs*$-TYo;BrqhhQIaRZAn1{B3}D-pZzErH}hA9o~J=-o}=g3~lD3uE=FsYh0Gm zRmR<1Tc<*c^wo*NJUJH6Xsh(aVYqP&uSOuRqQ!%E=%2Abck0QP528mJfUj_EX1YW} z57E&MAvffiCrY9iC(0T`;5Z*tuB9IDiYb?j^V*53dEC=|JXCeT8(T5O7L?4rYk~+1 z`1|<2=KQ%WtrXCwGOhfo+y;JbS2j9)Pr%ueu4s+xr4nK%=GE)N(TLSqH=WqPF3Vt+ z6~vm}ixHY;{`RNH!x8^M9!N3m6LpW+dRo?F_U`sU$Pwr{1Q4$Ohfx(e1|Vl z`1$Y(vsd@Gq0Ks>8IC+C8$1iwtkj@y4%*mMnc_?R1pih#noBM0-d4!{4W97 zOd~OSox_wnv%S^OU7~p_McAzfuN~k!STN#8uu-Un3J!Eoq8lxR2M!*B<@e$4_}tZ@ z_t&*fydS4)%ES9&(w-+8a|AEod-2gtG-y_^k-t9Pi+fA=wBR3!sy`i?ZhDYOVaRAo zJZt?k`XP;lNHmzJwQ+I3sn z=oFVAU!zp`OfPmSyp#P)Ty7^ri-E%@GJn>^RVSfG=5F5FX?Smc%$urv&~K*V*vl=k zaDRHvnC&D;S$q30fe`}PAXp}r;0rCGWDoU?)QE-6t7W$a*;|}coaenEK#Hx5^J&oG zt?vlLiK0kALB~%v3Kgucu|Sh&3NWNfYtAx&SIBZW>@GIc0-E~&j;}B8r!aFOB$%)l zpB}%BR%)=kqAw-8Xd3zj5|e|XsDp$YTM0MR!ufRc?v>|sp~7$e0xdyH2`i`VGAXCa zW-2r*4Lb3h{GjdqfaFHO{Z`4v>!@$J)k%U|hp)R;jee*N|N;dS%H){M9hp14r9$E)3^ zDV34HW>Q9Mml_Yztrii*n(p(Br*Z<-jDx5!cf2H{q%=J z&%MKKt#7Gs_xvbEUA#A3#=#z786H*kA_*Cv&A^aKlY;LRXIDtxh`{LI&d@Zybsp66 z-WqE3Tezmmq=!V8cJlf|+I4JDq1oJn%F*z0nYx2R@$bDKlng|Ya@u&}QLR6r?5A)B zZQgm_WMksdJBoqW1;8NX4$Az}^Puy5_yU2)Ju*4a61OYE*CdWu__9Ty+(?oW4B#2i zl8p8;EYKeaI$uqVGxF^-T(V3H5jMN^|8}R?Ah}17MB`J(Od0{qN(#2&-Ilw!o808q z7mRaK+$jlCimKW^uec#UtCk&#e`ZJRi6LtjG)W)8v*^9iK+2M?(hn7-qS;g z9Sh~pKIeAVPrQDTWMyBU+`l%O3!eCF(2&YK2>V=>^3yp)nfD>fFIj(Hu2N6yu3^nI zEEXIiCRQ&48*|xLr>6o6rF7`9P~}9lW@>lY7W;&AsWSIs0%CGh}4adE&&UCJsu88ENZMXD@P!?pV#eWw^-cV@6C=C zki>UWF>9!3EHp7Gm30>>g7JgZEB-hYqH@-X5bwHM@QT-%rNR6YCuXuRm9JdE#}y;q zjAVykN=NGdx*H`P+~WR#tkWp`u*{c{d8Ig^U~-kA?$VbR_3PK*x~tki@p_O<9mAmw z3(=%^A|)CFS+FBOZk;tUlKov!)Y(`P&XmEL<@s_|7|i+m>UeF4Tg>&tld-!3(Z&SG zbt*O@P0XLWv}($Q1no3MU-=91XvrI!`3dV(kpJ*O?Gt#Q;Gas1MJ;3|7<+`Xc_TDX z{oL7&c*LV@_>Z7Z1W_s2HTDv-Ki%gpOA6N-Qa5E(vE@xyvSlV-eh|LX9z>`7(tXdm z1?o9b$+U4!F6%!lQr9S^suQi@d%Aa*2zQg#QcVL{%})WNJW!hBU#Xh>=QB;v@-K$F zTKQVgvqKPAVdfUEjuNADUrgBFvK1(l@GKv}+K4+DigYF(9TGs<`0825nBlwUDs^>F zIdG!};&8gZpZAcVQ}cHjqs2)a0aQv9^%+DetovhDd0)U>d01O0QNn20H$LJ~&~cc5 z{edKTF+B{b$65E_si%W&Z@#F_Vj=VoO(Bz|Vb=3^zfYWYE}Qu|etEwo{18X(sc+3$ zact4R-v${L{?{+YwjzddI!`YWMR9u%jD~!~d+b`CE2rWWQy<#ED3l16f*7+47S$6?-r|}o&~_T?Js%9+ z7F>}pRP&BQrx~34LkG7LG9Ai_#W!ss!D~dGTsaZLG+f8JzRUAWu+MrO0rfNNTpuH2 z8(%$|Wq(wH_tz7|DDRc7bv_6XzUn=#)z$l8ZSppcRGakHG4v?GR~(2?FT^O(tRW8s z8YWBBe2F-dr)gi!Rw?`wY7SXP+M7vAyxXuZ*c~UuC4J-H&ET&m9=Lj$aSwvw!0rAfH~DllOgI>r zUbmO{QK}QbbwhyfWMc;vXanioR=@m)+Q<0c*PvT@twg z0>9NG^06DWzE$jzm9ciO%418Jcs7p4W2zO@rf}+l9@CgtPr~iZ8Tnd2@Xzeo*)77f z2Ov>2LY=!ZV95*nbqgFdetsLYnHAOcb8XI9BS=%)E~c}Hu)l(yEe*SdFLz~6jEQ(V zDC`X90Mh!BDSMY_?>d7a(YT!{`yT;v!C&spfEoXve83v9iUO}x5_XVXC+9ss^jYW4 zqG$N@%(StC?uS2{y%DY=|7e5(&PLdz_Q=#7%*E`Us}#*RHPu-@dI~Zy8xTmXXXHh% z^qB}pCNfYzaqCYpY35>2TP9YXfV#hY9WV&!P@?xU-^zf8chr(-79r>l${vBo=YJ2d z(l%Mz$q?5(^q-x(9e?x~f$+-N+6uI}&VsYI0PMhD-CvqO7V`n;6m_T^#XwJfHaUKp zE@I&+GxN_G4UQDiV#E@V;*93W!Oayjp#04G^oygtDj3VjY2Q92apTIkkZWGAe;DsG_ z6D4qQpk9gG{<>}Wp~Ut9OlWthZ)XYSDR=_eeTut@TE{X1wS*9ftj_;ns>-Y zLodSj^nG_4yqw(WSo%G_^2LZ`-rgSxJL!l0Z1d*vNch#T*BI|U}Z1cv9 zy&3z04jirB)6CsIFLN;wcv7_Q(EX7-7Q5%eecA|Z*a=EpM?dxc6#2}*Qd~CzIvIND zac$W2WOGen#nwjAMapN@j{JQ+;P!>kFs1@6Q%R|8^uYWj58v-5Qf~(Q&%S>#&+|zR zxKMLhsfx?*Sou5n+jy*Qzh|_#9gAwMfD?~0z=Z4oG!)fODU9Hnv>`waCjvm$pI0!< zlrcD~4puRRl-$(huXmoD$bd zx_{NLK=mZvfgzLbW*tUfNE!*3xnq@wC*B+JSbP2C2lJcq*z4MzK(Nqo=iwMxd-9AP zcEW*#7`+k$D&N9|!$3H&p|Gx$RWg}P0?z+kYIHRa&l`qk2Gv*hfoch=tYOUfqIS$v^^tqhmL0cOLr=N+uAn*)2 z|B*;`3ZFW93WkZRsNEC7+VY>1lvnS|J?^!feJ>w&(-srCoy5Y#aa-W};eCNObNEVM zu=&Pn(Dg~y4SvlD6-+VQeR);~@mLz1M4%ciDqWh#4RRnaejv=PAc@0+LJ*IpuHz>a z{v{$OmxX;bKdFzw=6eB4W`aGz9;$2=2a&`IQ_D%_xhZBwi}Nb>QU`1^h{AsfdX&ew zKuiKwN%piH3^VU(*0qIZ`~)iHyHzUqWK=Z=*9zDCLT4(gWp_(dCNq->+(w-9g z*5kd#kS82>Q;rWGI}#8&YQPm>+U9WX#@}D7&8GeDD^ahcYp4sW#>qKWjX}yCx)HG42K-=Y#Bl(ulRjT_5UB8nRKY*q(JY%K ziIbTD0~6v|bY`^>2A?=FRH*9(ZQ4Pl@55m1!_;S3?%us4EjH0>=LeD(b__7UPtL7& zQoMrg)h(Cnbd|V4vRWd*^Go(;^UN(}YJAP1-nOyu5&p*{`D z5!;eK%zJm1cbKtwnsL}p(OQx7@YfhqgDBjF_)!^iCIZ85`}Khr{36VAwMeCkcPeQV zr_Rqz@$S^Wx4?K^mC}&x&cTYeb@@FgfwgTvrQy{AL_kh*<#onnLbsGkh+arvf%yid z2yiVziI%jL#U3TRnnk%7Zc+YhHQ&F*f$gr3X#2iN4s@c-GcVb3(-W6AG?6$$tA>748MnNx=1nAZ9DcRZIF;z(tlf#&umvmO(9 zm?iTyktu|zl5oxCej{8{ziQBPv+pxBeKbFhT|w96zs!DZeuh(&RdhKJr+iGUYGQ~2 zTp?DLQYDGiL_fW)hpqmkP~vXF9zdVmWwQpL!nUA6Y}1W+OwznS_D5o3w+`%ugu3Y; z9`Fh};7?E{UhEY+;coLGC9W ziSh+Ia3$WIssDQ zhf{%R-LaFZYn(MHIks+zO{7&%6%d=fD1vc6FlCd$@<4_r58e`PU3HLhHK=91u!}>4 zY$hx_u=lnp&cEQ6pdGCx|1Q}1%oqY1tAW*6@!xU<7}SzgvD~pnIPPjale?7#uNWXo z+nDyE%kTOvaVb_N(x6RI7dgYkf`ny7+1lnb)>P`_2PLitvAb6K3Zl}U9s!~Y$Ej`# z)OtY?j?cwgf4sDa57JC-^|eq)il z{=9GeN&`!gQ>2DzV)?jkh~hYpGiMg-QS!)qbm;kWsXZG*06HuF)cN*hC^g6R{9x^~ zKFqe;1~Jk=r_)|#k~l_w=B@qiQ|xwaJYSyoU_Uf zuc9rN_sY{kn-_2i-eI&|%XWKO9ynLzf%1qCT)$9kRv${(n-xs_XC7$a)M(Rzav<=Y zcbeZlg1~V%2MLw}$6`*;m2}Vr4@qmk;&lg&aiLNQ-nRP6c<;WZM&D6SwIm(qn)%Ix zn&3yN+Ws(W_=-z}6i-*ti5I0-7vdwPe#5)QNUyxy(KHk*uEve>%6i8F>IpJ8ie<^h zC;6Z_uozm&PNtk`0t6BPYZx{cB;pI`JyfXW7w=qtHz0o*Q4d{w_7?|r>9JDDRG#Ao z{9Bq1lE{PO(VxA=rv4-9{W-2RqO^!GYyUR!tM3h-4r@b4ppHFi#^=mK@4da73nuw% z1M*B>vPWsE3ldMaXiUbG-LwLw^(NFGf34;et}HP<65fd=@J;I_Wz0~M3xO#SG6TD& zw2_SXb~f#tT3#FAqGR%DYb#Dk--E*JbDz3VNYvpK7a6s){BuFTH)b3WJ^({96F%Am zZa)jR2XNZ%I-B0CF#ZL$jSK{VbnorJUcEJl0KUG}J#um>`~)>s+th?gevyyZ&T#mi zj&E%|v9;klS4|@g(#~Ct-w0vPv=f!6Q}51m>|L2TIsiF~woksebE*;oetJ1ozQm)o zrr}JP6OXPj)V&c<0^tFZ-lt9;z%}*5o7fBGLXEBzeov88sM@fv-7Kh1@G_;fiTaJb z1{DcRI|lWN3%p*fiAP(7#Q>jah7H%Bnmy=c`bLWA`%qCa6qOY(SDhxo2i_@1|5F?R z!&(R3-xUqT0_O3kqfiB=3b?(rKmIPhaTH0)ZXP1CHaw5YYyh9{pLnyWS}Awuc^$sx zhr%`^!gDv|{s%YyG$< znERm|O#PXt=Jt4PPgVM-@y=@2ujY<=Y5PP6kf48enX;336(qr9`|#-x%yW7rDI`P? z<>j=^(Vj2KAE=!*N4wdaEL zDsm^9BX#Hd2SGd)%heecMLjj%Aj4}G0PoJlEqB<7=_1@dp#Q-v1+D(nfCNe3&@j(f z>Z%%C9(RX7P4Q)Wk3XWs#5!!(rRFE}0-(_!Y;D}=;qnsYFY1?feQJ)~BkTQegkCet$*rT;pr+nL>v>R~>sOa?aJ)#VQh$`d)scaou}n1e!y+x(BV&kiuzAtQ%2BSO+VR-DQz6PKWow};^;{(;Z_3s3IA-i6 z?1b&xK3lv+IEBo!xw&fL%jt&%Wm{%%Ae{wQpoVUJ{jF`Mg5<6Qyu#{pk{D{|nMD8F z*PIR^*v0 z(|wt_v&d5lS>ANr_VKCOL&TE1 z@9`gX9@q&c%=(gB0q_8uURUfbC~onZhilb#q^rS%0>3NMRCEQ3Z+L;8meen569KFV zCcREBWiIcvoz2jhL{(>UlEDHf)tQ$-jlG`FZGKcd0WM$* zo_OwS<+lor_}27$8EQ>~t}T3B^jd(F4o$yNgkM`Sx%aVMmI&zsw->8Fjz^V&mje}W z>Am03RW{O7!=t!wIx@-#!+?6X$@!U>R|*0K)ghYHXz7HAx`mZ(Sekbb0&SX5_E(e3 z7sxdYquBvJxkviw+4plU>|SB8Mw3^^yK-?&AX=)3PQGKptFkk?YMcsNzbC?=+S1pO z8=h6Dl0{5m{rmHseAfO8W6;AU1rxdpOE%xwt=13bU_k&>YC6=K(5Fneq1XF{i&>8C z%sb>ZC#l-M5vZV3Hvusn*U1FFr~KeckDP9K0%Ubj zKuy6O{j5E_Vs#*y8rbYNLNy)_#DQPY7jSz?!og%4+!c*9OVaNBxR*LQi6tSg_?i$) z_;t;L52rp-Yt})T#Fz91+93kpUtm&=RcG3B?$SOUlRC(#^#00y8+51K;}ysxGQ8=F zxF;w|T^ym>^_Z)J33n6V-@^RNsrzjJ1C#ACE+26diXn|0lUU$5L78mP6d_r1tdNak1~AQqy(ZXH0bus#9~56 z{_KzNJ+b5YiSFqm3=8s>X#y8@N}4_Qeu8MBEr69Xl12~3;Bb+T6o=sM>BUEm=l|T7 zFl^Jw>lM7a`shv_u6w*5Uk>y3$cXx*80Nt=5E~fyu+x`c@p^ zbhO+5UT~2)J6pwO?h?Q?w{E9bs1CCtbPx!c^2cqXk;KKf#JgWiTfvK(xTmfK7OsMg zQz&LplsdUW5ptUI!Cm$+zo@doiNbIXhk==aw8PvEg|Qx%w(f*X2ApaOf3mxQ-PL{{ z*I?EnO_`ipuy3HD@H0qjnjye;29Oa0#Xh4`AeV9z{r6#EIl%WZ-x8>gy39NCA6R>NHa;Dv^2$swaOh5gNu4~DXm)zw+eIy<= za{5FvPWcR8p@gN&!bJW6YQriX%r~zxZuZ{kcY@G|HYVXkY)~;uqTk5*WZQ+hJhv`J z8B2s7mMo8EPMCD+Jzc|+*!8fIf2mou>ukqyQne%u6DpCkV3S_m-&Ww?bFgk)fQWms z8o^wDbD-AElUJl$_$bj?*S!FNKN@WH4H#^${`dLA`&rq#B*4rRtAq8Gz45j64;aSA z$yoiw9$`)YrW_Zb-5zb$SrLxD6SKEHc5%tljjYqyW&n#zb;7T6j<_69F@wf5#%skI z-X-cZaGQCfw;4a-G@^Fy#MIYgNB}I14PjzLHw_oBPeGIlfD}p|660 zgzS@vsiHMO@g&hwi03ZPq-YE+SJ(K(ZECb>v+%8a%f&IA>trd zij754`f#tYcJ@@v&Ax3e=;xA@t8MhT7Wi*KS463eo?&U}zelJ$Jyd+ybzP`*O1c2#7vjiomC$U!k=91=h zdM*t#^h5OuJpF0GW~KP4W+^VD4E&`~uh4VexCDdn*pmIfj& zaPNQpeVc(RDg?8?goPcyI_=wxy#)WsAwkTj?SOx!)vBE#_WHM zmyNY&R?*nts7S!M2$>bz7hbYnRdt4-%))K%Y;gT~lxQflEVag{~^oM=j0uLx8LPISrGJ7>Z2& zw=mKK!XnDdEVD=s!^Dj$$T2}9t(5j}JQKBs}U1|z@ze5t?#c-+pBG5Q>M9-@E?R`@ebsQ7-V~Da9>o<1D<()=Cuh`4OJc0mixHyKBQEJS&4UM|@DkJdbl? zN4J4kx9-=no#)UhL9A|2yyMgfOQnQJKGHDq;u&uqlmPvq>#k5o~aZ z28l;!(**=}qn`1A(+^l}dU^`G#I1xfInz}_Uw2V+twNiqOn|QO zTaAtVbgeiICAvg*qgBxBV~Hu$AG&y;c>G8Jl|?&xQwuO9nlfF_ynRk8hKk1KLOGSn zQwI*b9wip!8}U1uJzh$_Ecn)=aVyDZ=+7=f{!WtcUM%X>E`34QmVyKE=p!dz@%zFC zCXgOE$*1J*tiF!&`Lp>4d}()?C)9EIY1Dfer-LfM{&v?M%93wIhkkh6VrztDZV;b> z_c2>a)3@}r@EJ+`7>9kgoJG200+KDN0T1Enn)B2Ec8sXzMuAYsI+Xq9p7zqw9a7*5 ze~xZRa)~nfq_Vl^8~siBm3eZe267C0SL})XP`QHShCH@g{Da?T1`&P&SSiN&x1k(CaSF@+=MXJwG~m$O z%zOKiJ7C@A6IJ9h4()-HrdkKL4@&4er8kNcvWTyyLZIf&r`KG)7fr@fm*MaqlPlZ4uaSulPXE1P zW?Hsc<6YzVs8z(l^=v~i>_6*uzdvE1AENmuxX{25 zfTGprTiWx}$#}GcAIP7~#SDVsWn;D#+H;5Z$-6+S=t->b?M6y;9kUx*IvIrzCw;v1 zY_*z#A3BVi%{N+!}ID$0|r*lJ!ZOD$JaO3r=vlm z=MDpZ$sXg)4qgAX!zd$=HMQ;e5o~rwus+<6!+ISi`3;U?)k#ARlO^(!M&gdf7G+1r zr|B;5PEDI?K3rgl%e%m`@d=jUor?*J5POw2u)g^g`m`7sf zQBA?ve?4f~&$~A1PIF8O?BOfY#@A=BBqM`vrA_r`bYwOTwuE^`d*G53Gt;1>Zn-&$ z=5(Q$MQo`t58|muIIbVE=e~Xy-S(}9YWdRK5TYe034%Ruit2T6&5uNHVJFo6bZWqM z_Vm;4GX0sa`RKn4lOKre4ZW=G`z)Mt*l!H%l&kQ&6xp~g=3~wFK(JsT;uw9t0dDma z{SedsyYgVV_@%>IM1F>XDQz!myD{QMpU1% zYjRkLVcn^!T-$~u9~OOcm$Sd{OWXm!8;BcgvtQRMt+MwKK1~W&ZW}JTxaJnfu0gJ` zN1n;KM%L(Ddp&3THYCeys~IoKC{&l1w|T!uXQZ& zg-BhE-7;?oGB{vjteYY%T0iXgKo2Z2nTv98 zuJyjU1}ZDt*3)<4xX6sqFC3IKL=rp4;Z+?F-PL3(sC z6s)(tZ7JD(y7`^>ua~?-;^O%Y{O{{@OH@e6+k@2U(fxfwjq4#hZ(c8eyWqV1$$7l<{S-*bN;mRokYq$rp z_>$xE_Q;6)?nFy`H#5-fcrQ5TPq&Io+Wisf=7y&~1o=B2)?wa#h8tP_EX7wUN|%xC zv|%Bnq(PsD-q`Wp7a?Wl(>NNElhUCC#G^ps*j~5hM{!Cjx|%ykAAEjRDo|Z$3pwY< z&!a~y()Zj+cBKE4VtMrks0_e=sbmX4YQOn=*A2~6qg=>=j|q_iK-!n{*=mVTY}c*A z7sWb{O25D>hV3#1QNOGrc7)OH%ZHiHZaaog3ci*HxkJu%-D)*@`k@n}R9HA6QlhS* zx%8y%>I@y|0(kl=!282_)dkwSq{~Z6 zM&B&#le_mRyp^)^IiK6|0kxGgOR7iaG`d^ltfBI4)&?@2@KyLLnA5teWL4O$^L)na zfhuEs9=Ki(59dka=H=sC(q;4z@;xnq2gZ+SzBi%sks^x+ArmLz{@PIFD(nhsxZ;YBe=0jn zL)z+y)1Cpp-vnsftyyDIti26Zn5nnLH&>|Ayr5fUN@o~sKeluN&e$iOWKW;%F}Mt# z85Ze$a`zbvty~_HqbcC05g7C*!Srlm&Whbyn1ZM$@0M_$(tHY)`VQn#wbZ)Fzu|1` zDPhIcc;;qr6qDfRRv_gJkWxyW*eiWG)g%-cK`G6Ad zZhd!}PfZyaFXH&liBDW;XpF^o%&v=qo&xL%Smwm(u+bd3Avoo4#+0|vetl7V1d?In zA@v_fSI4&$pev~BWajgLwIg5nw$12!`QnVTN(mEFHBB(7$UG;Zb>{COn?F}qS(Gf_ z>Vn$Go8p=KK@TEa#0@XcaWg!64%fXv%d@U854vo1tE3!pN4{7$cgktyNTI^oy(~leXtsN#HC|2i!n%TRslM%S8e>>e zwD)^mTP;xQ3w0)Fk27akl?0~3MeqqsEg;V;_(%WR55aSah=*8%3`>{~Nh<_~CT0JE z{|5-#9jLT=ssEMAmz73<$90|5oeDJ5%g}{R^9e9sL(*ta3wY-7r`%;Jf6Q#l1pm3c z9_98P#XJQ~&t>~){VD3PKxt`e^zH`?Qml_#r{rXSd_96pdK*q+Pn@3f7)K_6m}4;S9DTa@wG%wuUG%c{Ef zXZM@F^6yO0=8Pz4x;zgf+{WPbtqF)S#KBEMW5#iQ*KBMW(Bd}6I{)^tzNUm5LufU~ z*50nm$3@xIH{f30DfZ+9rVEFWVhy!C&5jh7#Q0^TKm)jt8a7M8-v|9y1;Ii~?4#f74fl+> z#&u@UGbA-WkfR=7u6XSFDxhy-{894v z-f;^0&zrO#k7Yy<1QDCKw7B|)ZeO>&gd(J=#aKQQ@(m0R-sAvE@J&(Km))S@ zH4HY~LK>Nx!4F5qIPby>V?RiWW29|42ZLVEryBdK1sTz(!Th%{>nvwH?H#5R1vGIF zE&rEdS?viNYn9c4K9AdQlU^GI>wA&d+HE>BJihluF}VK&=l@^p(%un$=}?NKX9Bg7sM$|bs^e4h(bXp_|uf~kxkxpyBD z!G;ezyE43P5vRSIc4*}{nK6pxJ$^>Y85f(+;XJARx^6gyY#z5|9v9?~1G(qK^-NXf zwG%kTkIim9PcFWVQZ0PkK8$0ppnJN`GDfm#_;zO{VZ5kWJC#ism0>2Z1S^&W#yGIeov-1Bu^{f&ZS`Fwm4@I2N z9e`iKk(-ks`_%HKv7cRA58Bjo;-P5x$8TR#!*!P&K;JUB*$=4a`$H3pu&Bx%NdPrq zyJ5Z$vMORsLhiWw5h=p&Q1dfTTalbg%G?2|%+i*hid$PZhY^pTLat8(;P#;KRK$H? zW?)4E@&Zc8`a*+UoFJKIBLL?$YWSSMrU)BM`T``8Q(BdMP>EJCF}04A83i;dP<&qx zFQ0&4bXtpBZ8ipPdin`ryp}2%we(i4|Kur5yb2AFi~RBL-Ma>)v5lQw)AOItwG0xE zB3jQPjzAIKeiW|Z|K{d^?=~)Qt2;1q_N+@(3)E+xW~ZLc_uXR1Q6hT5uVk4ozvb^8 zs0wF$?UEE7B}%u1y??K6GM$y_I|!EhDSVGxNoHwP2*f~y!F?$^tRArWL8e6Op2i z&Qf=4w`mH;hdBb$)Apb*wkY~E?-|K4;Z9KpdBm$4v%B(*;xSKTwEy3lw}pn4E*J5p zm|og8EL8+&X#uDrr*DvTvd&z47<7hsNZXT$w!O9k9A!iLqs9@iX$TjFT{Zd&jrOSvmvc6#g_9 zy2(yGLgREA4uf{jT*IyJ2DT*+{vuf~Zh^Di-rUZPr|ki;z|#N+9m70)qx)2Y+2LQU zsjCH`hj7}`44d*`@^ENV7sw`jg)qNvyWX?|C0Ww3HkkZ85vQM5+9<6*yf8cz{sKJT zddQ^aEgPLgmg_E%CJh$;<{)V#!t{s{3^M~4*#h6RoJF)IXIyXDj>O!a#f$(N(p`i! z2oev>?abL3782VWVupSWhtkH@J>Q?`<{b^ZIlTNu9pLq=_~oBKbw+4&v*5i9n%~FD z-H_5&7n@nh!gU~+O%<+_Rfgtqv{jtDfKacK6G*M1jN|e{%WKp3Tk$2?szxOef8-v+ z&Ypp%Pzl`b>!)%Rw8_&JhYvR2f}{8~JI{raYh$o(0@@`1Y5~2Q%=sPU&E5Qv9O=&jOszj4<{J7`r>h2;+rj#Zy&(3~6ZdZsS6oHH0ON#6Wy%(!# zt*)cvS%_WH_T#7I(ueymG|(moAhWca@MDAaAqy8K;d`l?4L~C8_zB~i`3WZ=IONfP zb4+HW_?WfOkfA$|{5QTd(Rpe2N{IBIc3y>7573KR_oxY(7+dO`V(PDS6`3$$<3o^@1^46Ck-RA9 z2AV6y0#wJE57KOS+Evqty_+OZ%1tJf^Z2+F0cE2}q9DaHSAe#&4tzgLE8(4n8iW?7T5~fsI*`(=7jKpI z^tT%ai~`;!5qM>HP(S7M%a|GC?==UJ=#;<9Cv@^2a}t^xKk{E`Ww8;*?$>DKz+R^W za;L?}Wl8QrrQ~0*uJ#sz%0kjiS01r)bJIB!WzyO;RPK*ut!I@p&kb4gfzsjmd%TBP zg(SJh5cvez?+wp6;fP&XYfFf2sk_6D8LjE?xb6`h>UDJ`n*Tw3W^T|q-!03G|KY&V z@1&Mbz_1Y*B_blSo-*jqD!D{8__f)~-ah=M5BxKaizEAsL+M-hi=i;7CovKSSa+oM zoWaYcLC2*%ziO;${WUe>p*P$zIPh{I-TP=xK>QbQ)#kqFSYh{?+ttwb9{Kd~_Laa; zoQ4xftHBfD=lB@M=0#YJ>Ys*;p504kl?UDo)h<<8z8gu(w`Um&pMY=h0_5L}ngd&< ztTJ~C|N2td7mTE^xZT6M0=^Zrbnov&jLv!3)Lx z;KUcD19qB2kkPR1edcKBz`p|@8zjq5bGBlIKRuY-b=r4NiU@x()iI?m_O6lE~^ zkpo+LQbciV091KqPCS%E4MwI2LzB)|ySueQ>jjED&;fXv4#2fI{(l8ex~Ka)C@sU& zGMh4`pN~`Z6Gd-1iHAO{3YM~s98*Ocm{>q|*#MwByB_2xJiX7HbR4?b_=>WSdT{B% z)v*G(qjcIqQ|aS4B*7` zDV|$S#WbVa*}mqJv#~^&VcR+dBB1-TW$*2nAcNIOq)=K9I&4hQQVa;-<)r9!`I)|N zDo?3;Aml6Tc=6XXfR^{*IWII`!pY+zLm>^_65BGe>;nmFQUrLzT?>vlC$SMwQ#UAi#ZftDV z**+7bMcEWE8FWM6(M~lC0blqXepYCn|KL|uKF?Pblw_OrC9-vn`taJow5P}G@a97ZC3c)Nd*v7J&2SL9H{F0;Y!11^_rfl3AK+TxnC0K+(wfG{?R1&}`=S8>t zmxeAsBtV^>e<_#5%=i3#%st_TCJY-N!5vMqkyiOgicbXKVqYJ4KdU&+y$FmSFz2Q| zg=Dy!391c9+6I8Qr3AA1U`)EK|FU_$J#YSyn3Pn=ts)+DBXNB-cq<`!dp=lDAaz`L zbeF%e)41CrLQtj5JJ{uXqvryuyj^n>WWcg0W63DS~orMy!6 zTd~IRAgkJU>Mi`MF`D5ZB=G77-0^|eQ}HmB76(aWJ76@S9X4_#7Q#ho4ZegVYz726 zN9;(qmpP^Zb(e0iK7ykPUKX`HmiXgE_DNv2W?tuAnS<;Gxa z#B{}r=!ct0i_nzU1+G>GkxXOIs8F~45djXyo-UG>w34aV!JwX@FlWB)|I?l9EwphF z58V?8RK-x?fHw2^KveLJ)0EK!nylgFz`9ce!#4+iwDKcOA}R4c7|Mv;N?-PMsAgpvu+s8F{l&=oQd4lgnU~MnMlMe zAN*(Jp1&SfoT zwWpuRGN*~-2diTpATFnJP9aX`1RXcD*Zg3`EpN$Pd5zuH&fI$rt$9WO>N_Sf%-zGAZ)CPY}N#FK1ys_JN9`w1uJsr)Dt9u=JsZ?t$8V7U;mAw;%76 zI;T5SpOEtKy?$XN3%tCN9J!Z(Or-prwnz04cpeY(@@1(=EJ19QoJXORD9<7#YC+Ah z`du2qde!w$gjo1_%5J&O`gM%VL!Y#{rXr}*qf<~u)gBhsaQ^9`8@suGI3Cae8U3o9 zVOF$D9|mJd4!;_^^VUyOE6V^*bwLgPJA5luu5EyCHYzE@h?-pNOA)$#AuFhK`!;ZLi}mS%0o z$_hY$?B$QF2VMDHFVqsC#TJhb(AR!G$pU}1ss}?;skPzN+eUBW6G*(M-;WG7j+Xlb zALhH-7pJpMQqrc3Xa61jV@>n=yf}R5Nwr?8xVG0jivS&bp9!h3zP4IA0ffXMD|jDU zmD$HbB_Ptyj4kBv9zP;VfQ^e8&QasyZ`3VeC;Yskr*AP+{i*p(E<|&e`4bhPJ!A?V z=94WYbx%ksF?10W{M&0IR1!#MZu=(=_A0E>C3}Bp6$p@T@dCzoCcwrB0~^BvE#7f9 z0a+`$;WSk4+PO;voIy3e$!#5y-3{=@Cn(n zv&YzXs3rW(J%?MR0!k}RJ4hWGoy~id5e2e})j|YV?LwQJhX{uE$4gQ!xj10sOUe6w z1yRB^=pM_E^6+Py5q)%iQGm-Rn3=39HjG{t9+g*8GrzBki;|tFE$(-dsd~A%=N*ZD zbTD16Hv*gowFLiTW)hO7MemjtiHN4m!UP=eb>HbtvJansSAEpBaB0oa<^pjF(=skT z?KJE0nODpK%S`myyO%AyIV5cAnt*|OeqeKvV0KRS`i@vGI_EEVy+?S92mmH~`^%4h zLU`Lpg5Ij_e z;q1M)-XFlzlLpmtqg+oUz5zxQVoxk>AY5ZpBK!R`(SHJOxMHDr`15d}VRj>7$2dzJ z1+W9)XBJUW+e@gQ^c_gPxul2xQg6_g02rFIQQZLSJ%80W z&t#IEI+1JtmGo(>j+Wq)xM>l}IJtlO4tGrCuW!l-9}QacKj0^br=|fUm~xX3uzD;b zg4_xp#P$R`Gz!+Mwr~;;cB>-+Z><|`{d{F8);>hNO@LG7`{zg{sr2_#3baNkF^Om| zamNwB7iVW7v^*FM;FRGcEQqdj1oKQTX1U8Okz?7H`(Nb35As)WzW~-C2Ik!EaUwFB z7V-jb9yK}7Nkr>JJOtb&B3aIl@;P&5d7bJ82{BcL@ynih@_^K^0Cy^oNHLmi5uJm{ z_f7lU9KpVhY6`^vu`AUiK~bD*s|9}E7~F$d`Z`P{PerwX&qj$y_~ty~jc5{=6NCAp z%^PY*cj;`6v&Xy_U_P&xnwePuj+wi$e&$(tW>$gZw*8Tf*@=xay+aH<82hU|N&JT# z<3M&9G;t_QKQ7}l+KS2`($*p!e6y0z?f9}GqD;=*8w<~p#yMA&QpbV$_| z?I}@4p>S7Wb1E#S=k_FWDQtKSIn*dL*f^O^-T`SW+Lk_Rj^ktfgWJ!G{Ftyho()4dr1bHS?@6(lz5>x@5Gl#&1$gd=Lf0?$AQB5(K&ksY&C021bC%jd!xFP(`-qR3zgb=jd+J*JOvl|61iKlm z;?Enz26ySZepBqAc6NZfrlTKSjMn8V3$Y(86SD$EQUXtLfSrU`(U3^GZ5)(#_`xJ< zR~Ug*gE6E+8E9Ok+pd*yfufE(nFi2o-XE87IGr-u%4_KC*E{=A(Dca1#cL8)b`o6z z3{p0yK_W{$GTH*bIeTRUZ|C0c{#x;k*nIoPNiCcRdmS`P$Y+XH(L&o90CiH= zs0}q?X)zW4skp1siC@-u=Exjk_Ej_n_@D{!t`LZ)Anv}dJ+oqm1z(iTE87ZobC?C zv~JlSwYKh_dyG`roTk0Nnl_u{!}JP}XRkv`^Yh695EjFpiUi+`HRt6r`&`JkHdU+6 zp#>kH?lJa5hz#Vp*_=R5tfIR_Za^Jb`&v^y7X+vL8Pgn&yO z_|XOng9@d}zs^AW_97^e*w9P^%s<7(X#PqhDu3p<|QVo-sd z4dW7Eua8oqEZW(43Fil#55C*pLB!nS-55ap+j!Kg1JFTOTdqa&~O7xM}9gd>svHa9dk znTm^P(eNGKNBL%h8YObb4hf#i}Z2&0C7BAiEt&(_Z<_ zHEUpc48$ud-w_YjuOVr=k$R?|cH=p=Sca6_19o*BNsWKFM+?e|URf23pvc0#ZlcWz z%{9O;L)RbUzEVf*=PdC`C4`B97v-AA2Ggf$ocJgEaF`sX52S?-LT)iWW^mWk$@vw0 zowRak!rJB@g=cntTHg+y8u2IyvJ1Y8I5)igzBA_bctM;{Rnn59DOw7{7Ls-fP`uIQ z44tfl!0FA)~nqz5g!xhTEIV@b_LU%jy{tN_TMl z+0}((JIcuo+g|qjBp)Au{#9!iDPg9lXl88}OTcPu#L-jH`wWa0|Bg{_PEXa^mJ_J= z!1Yuk%iuI>fh)pQ`W|oon}3SD`j;DbPr+gI7s-Frahppw9t|*O#zWKf(I&}`3M|8v zdpTb_U%t6?`Nxt)---kmd&iLag2#uaky9u=VMj)95DbA9LbUFMIi$hfVK`v^S23u?^S+UPk7@;qOH=oJo#F4Ajk> z;CL&^IIpDMb<$bfZ3PMurT(GE8HqM5_^u9%7)2mI?%e4J5}K_|!BwO{>GUet3l(8x zl4lEv*m}hZZ7#^tjmm^~{vu+tee+8MHZD5*`3+&)#Hr^M-I40&K_N=k6e{Qy{ddK#r4jK zKR8R>q%ZK~`eWcv$lAoGUJsM8G}6k5aAaWqLPeF`&d-Jj=W_zJn-9$JpK~s9mq?vk zHRO%1V(mRFdyV}G+|m~w0%+3it9Z@V+b#v)TaHT_5A;Xg`U0VC%gttM#!l0r`hS|7 zb_?mYK;dAvEajlLuQ-?=Fc1&zA9NCaE)q??Q&%mYEfId6bA~X%#PZNR03uOqDAwVp zMni@O;r-8;<-V^$Tm?1Z0#6P|TKDt$(l&?^Ipbar8(hPiFGp%A>sf_p zA5qBJBhv1IqZ*0D+%xTFj=QX}#)vX=8N4+qKiJOtK4?5@Pcl==1C#qw^y6ijmLP6;-Yi;`kLl8+8CA4wK zLTJ9xyngGDL`0tIGgOT5g?wj$HqTi^;DWaGQM*kl)JaOG?ywnLf99Iy@()(UO)v%|h$=VpuQ_`9Blw!}AbZWm!f z-VGrb#8sV(klW2aOE4lnpHa{fv=!iZ+9*r|>I+XZFbb@wZsHsux#2HDT~>v|5#M?ybg+KOU2pU#pPi;zA6d0=6QrF$$ahSRjFT)w+p@A`WrZK* zD=GZ}4d!3j06kh#!gB$*BKKc!8qF!Up8B;a7#Tex>=&{R+;PuT@t*Z%Yd%OQ%LS(K zTHmjdhHv${3=XC`*>~bq~hmbjHw?oy?}u z(&S!;o#y+<)Aad)OC4Fi$)hS@{)btY)ezZ$6RCJQ_s(Rw^Iehwp_hBv{-e$;OE5iR`H4=h2H@{o1Yagb_W7}nm6;l~j2;T}hh_S*Er#4$- z8MO0szXCb+pV*fWpR`QfFA_+omXStkp#(u#nXSRW(@*n#l%5<;D+icl zRHzT3DQ{u8?$s?d6e^~Z<9edVnvemJve9(KUdV|fqz})$WRUgr-f?40eoO6N2^U9! z?03O)rfq*&w{}4yR^oVa>h*+PpM~5XsXOJ<{PhS!8vUeWHV0Lm_SxCToCEzxbWiqs z9T;j=!Yumf?Cf!i0#?+al=$%CQRyRN!BY8Z&;yE>J}0?YF}tyO-Ti1*)^>2GTr?m1 z@a`E|_WEzpf1wJ4w^xHMhX_9pbbW{j24#97myjD;DpkeBrHw%)d~ZzZy1@`u_tUf; z?h2GeG^lfyth_9ygnnErE_^umS0y0nI#tmQpI&;gCP_JDrMV7#kN$QhvN8DMS7VAY zf`s$vgCw!E=G`C>L?-;Jva8n%&#EqDsX8&qz0amISta{#S3_Z5G4{)aZowKi^<}5l zS^~a&>4DRPO6|g7GUgmVMcI^<8BQX=iH8QzTsVWH4@J zCoH`A@yBs`Jc~QpN$WG2fyF0{yY)+6v;KJI5J3&Ll{pOF^WPN&H&JAnE*&Pl^#-_oI@e1X z^X2QKRoyf|iYO`7lS+=S4Z2P*HJYgBpEOa04T!(3fjT|2i#^be!Ynt*H>01s{K_Ff zI3GZI*+{*x_AxjO1P}3K6cZ0kw@Q&xy61txu0=)xMCv&;@X10|J#0Rg7E?_v#eJ%h zc`j`D@agHaJK;4D6$o7aEW5&)@f;&?v`R(r@$d|b28@UffA*eLx+^SaHhoUN2KVXP zv1DQR{v;xt@97;sbTq1Y;sd@&@2k)8HDmr@t*UDu=7X>lC3*(GLCkT;OYo+&B+3Wd z;|j-061nfKJ7F88@J1=FQQAgfq+Y;{ZI~Bub40p|>xtzI$0?8RaNA5WTPxMg;OoXtpbRk8QE?+^q znQiVGj37rwT*Oo=DS+4%Yjb2s}RN5JH9 z*g98+Te>jjpvmmfNf`Dq@a1zz=+K}j#=dWy1!Mg6tN0q`Cr=PmN%T;P0`Wp=0CIA$ zNS4Z&Jr6FldS#9=XDhN)bHnd`a97IzOy*4sh6zXl8l3Q0z6fFStmCfdoao`G~~kHU9F1 zkx>Zqa=Gn;Z$&1=!t+pxwb{)-`^v2Eny>Gytard;vZobk2q3rrFFWlnpXGVeBALhD ze47YCQ8%8TbZUH1G zO&tP?!o(n&*tp>Kn1XOL@N~v|TK?&?p~dNsfCJPB;{(r7UT3FW0bZf^`)#x58O_IC z3ST~+H^|<@iqOjr(b3HXU8x7KGY?Bb^A^#6dC78Cgd5F=iH!GMzCH1QV1lN==Hvf0 zw-2E>7wEU3#Sx8p*;@FIu&omQy;?w39R>En&IFcI``p_D5sW0sTAB$^ywl|HmG~e3 zaI(XB$loT%DaP$hhtDAftH>4_(RpC{f~1v_8Grsg3HfpVJ3bsE3jVG_Gou8`t#55V zQHMp3t@l=>Y#aDTZT0in&uV5eJ_(h*U!j7X{XAqZR8j=V4uD$g^G;?5>g1AD26hX; zBTs<`q7hGbSoj7Lbo-m^F9E>t#&(dw1f*8NjArA@^R66~wz;(SjNq>rgy!#Npdxt{ zEiIRqsx3X2_e)}P`zmv%UN%OVUjKVO;%ItE-Ecf=G$sCtP7u9>mgy$2`RLu5lx%mONq)U@D*B=Wvf1oyyd&+a$phs5EG%9PVctrVCTj`_S}i&l@E6+ z+|`rGf<)`bb$daXiWlt@YPjol>S%)sRzJG*qP0u^IJ(WAe1 zOT5>3U3^85?RixMKg8cUdC=qvw|>whRHCWg5}>CwD%5zCL$Af{Kh9To(kWyq9Dk#o z+oZ<;WOw5ug2?u}nWu3%|G;D18ABriSxF{qZm^mRuY zxuXM_l@oDZ_7L7~8cUW9p+f)Ri_cKnFVUE+AdyrqgLNd*3 z@#93XLcM2n-N9K+`fbEuVM*d-o}r#YUGmTxukAa}W z)qhC(aq$T{pzBOm)~*$XQI$MdC=1wj+_*bE)}(LGo&5u1sNlHd33MV;O9J7&zF(cj zNY`)u+5rhc5S-$z*Ut%eZ*IV7JEy=T=hl+30(4w>Za}JB7sO z8sNBtFM#1)aq))a8fVj<3;|1)ub>RI+Yn<9%x6kZ5sQ$VnOw^W1SJ5F=G}sQZtUjW z>iOiBGAIIujqyQZ_kvu5i?GJy;8E7*&%qub91FaewxX~HqQTUcV)YZ~s~Y2Y%BgseeRQepZyIo3XF9kb=8j_7GCC2#lt; zHIqeH<3kgK{iu>Ch1O(JS!Y*Ip6uOjV`{jy>E#T)hOANQFIQw+XA5O5WQ|My+E0Kp z9BK+F%dF8mXawVaRrX+!Kd?AbYg?peG4fcO5EVj#2xGl(#ES3tgGLF45l_EA8I|OH zYdXTQ3Wpi8RUI|%`wgp18lj1s@^im?{9u(*pYXB1B(enGT>ZuHSL^XDKZGcvf-cXh zs)SjAnyX z4Z3u>Er}}It{}|Hn2u+yBKAq_A~&gkO4vZG4i~{QwSc1i50`+we;bG;ps-|d?W$cK zp{dnBd<>`@E`L8z99zYTkZ{53JSe1959~|jzo;ZW2jRzjFAl@~r3vSWsFX?E6lJE~ z2r7XP#^D%hN|dv*%v95aDk}F3wb&zO!^dEgBP|-uJvcJZow#u$_y})zKQ~uH(m$BD z*rFm2XaZQnQ$=Ww#5AibIwKxdoJKI~+Hzsh8f4@I?MVWMsrESf5<4tH%SZ!2iK+rb7=2Hu@XRaIK@>b#*Hegk#D4=!T{Q6_b;ZVR z<$XWT_arg4r{0McWN8Kaq{LNA0*Y=Y`1Ahd=hKduaP2~mzfy83D%_Fqn&9B5?Qj%i zHhjU#8aee=56y7oYEh3t3g4Wn{=gV`jdF6e-qk{xWN8{}{_2mLs~Wc+6SF+4@l-Z(q?Y&6Z+$IiM;UGCFW2|ENhAk)s$w{sRW zk~{(lu9O{NuY~Ju)q=VAFG6sO!?R>U3$gn2_=X?w%P?ms?tdw0AiyQ#K<7%ha}R|k2?vu+Re0rs-;a*F~pTB1?FMh za)#ybhnONj7X=iRn|waE#V%18g!9(`I$$*@h+*Z-nf9($-m!F*s7ujGHbKTHNerboe>cfYwbD%@L`iij( z7x7okx#_ncQg>XMOD3iW?M_l?Kte|o%8-#)yJ3e98ZZU>9_AKLG#>h9owx*@O=#C- z#@q*Dtk11bZZanBExrbN1t}&|odv7`uKK*0@IMZzdYSNQl8&%RA<}ArS43C#D z)rPuIwY!;LY$2!Xv6xydnmp#Ou+SuUw z(*ERV`;hZOepF+G*M0-yWw|l)8-ejJP;bGnZ}(8_k)PyY${Yz)Dg3i_?HkgJE*+AN z+ZNjaCn+zB=T7&td+JW7Nlw$NPE!M0Gl#YEgIg&&hmsZz1o-=^d?0C~xY4f_Oe|>9 zA4W(bLl8(`y5-~}Pj*L`Sk~tuL|wZ@Hj2s=otD-{7FOF9lW97AcHR~w{`s{t0J`8(SmN$M^ePIR-0st^6C1DrsoaY< zx6bzUlD5pcE07p#x!eQU%PtyI% z`YZXfOOxJhRD5?0Mx(8pt=4Znnc^&;KV0!CVh>@UFw-lr9h-`PiPT~`dRL0to!hj%eFun5o@LN zdVy!0<2ZiRg~`_$KbL&FJBvPs*!l##6sGC2zx{Y%P@7$9G4v+pwq~*Nxmejfc)83+ zLZ^THpYl3wAcBBh>PtS;r$an+L7Q|z^ZQg`_~OCN-h~f2{zBmazAWYZ<zcdj-c}?;k@f(y0=+C8uiWb+DXfn$td0e2`ZjM*mx>|_%~@mz7tz3FHPkm`$RJB)KegUVtf!nmS3RsDWzYT!(x_g>7LvbfO?nw)i2v z6Q5d&es^D;4wXZ4sr_(aU>Bi848-HkoPPN40s518s9iXS{%ti0HGF`}{Ut>3M4Xpq z)_dNj$jU=RsPFz1Hf{1p+_ABGgWQi@7y3DAApOZ6S zY>><;soM%oXAWG*Mqs+C`@a3x!dS~c4c~hL$F|cToDbAewPN4`n_aCR8eJet ziRxd96;D!#5{{_64?!^|B417%2IOFtFZh1(8*_GC+n! zw9eWUkK8#TCa(55*S6ks^ZU2upj_)S=)_fX&*FqyeiV*KwB!c;9Wpyi3y9+zs)XA= z5L$aO678_|2dur`W=v3LEBEX|1t27}KGf>UFfOG-P20aDIM{=XDuqb$Ypi5KN7;Uc zmCZbE#8ufY{W7j+I@Eu>Km{jIwq+f?cC8DC1q2p-7Bc6!W`>@P=Ge2mo6rO0RO{R6 zPzh=;V_Qhpsk!Q4`S0j)ZZ~SE}*;M*>0VaWLLf4l(w#3#4LRcpH zXEC^Yv4glJo)P+)M%5Q>3Z_3i-h)$%F4W+iI4LP6N-FyF9;#N!1SWQyDz8`U@w#xc z{NiqsMroMvv z+7s77Q1&YSiWyyE4xL1I19NJ+9yHpim2GH$q3p$LNSNi*7;$-93?e7&a<)^_fg&R6 z)3?yA@-wa5xg&Yka}0NRjv12?p6y++EUickMH#MToQ=1YmzHX{e_wf!|Ti?7vJ1-$p^9(@|!v*%7cQ>=GWUo4kEU;$DPbsuUu=JMneLnK?^|^ zLEe3D>vNtI>dcQ1sL9NCCXqC#stQF{Cv_0Lbk!qzz zFs4L(Iwy|y?Kg<`9D645-(q5heMGNbOU9g9TCg}joK+J7|hchS!L}K$++LoY-YF#r{V3xt$X&cnAoba{CDu`K~wTT zu66u#n10^JRT{HRrwlRFG1JVPQRsK(QeBb7o`<_9_vcZXCKL&AET?*|S8X$lu3n&wroa)XE%Z%F}Y3W?C>S5zoTL z+i{{pegiN5HC8FTmnpepPV}$=6x|5TI9w@#g3Cswe(uHqr&J@O(-g81I?|yJi{455 z+Y+>EhXVvA_efLiA7cn@`YSL%GE2vT%K|AfOIS#hgc2yFU4(g}dM0n$2z#JqQK zf`JX?&Wm{#itb?=zpR7SU<`LP1<@!-w!n(abo^ZXZ{9Mkc4Sp-hI>=2^=O6@f)UL(PBn}(aG$~PNvVaF<+-uljOj3tWl5jsdN!o&Q zXRRWpqFQ3s{VAHbbn-IM1W;Cm*g&op1p3XdCnh{#K0aAx6YsSvp2lf<7JXZwr4CKL zA181^^>20gfHRpT>(E!K@Oh4vr5c%oUch!E#OnyVoD6mxJNQ^FCS zqrJdGgd_zvwaz>gfhRE3_>Uc`mRic6U{CM>Dmh-VO{P-Jcao8?8p6-%7u~T0&?_wSio^pke_=d&XDWDE~0gLi#1r6OQ2UNuU%O zv2JgN`S_zCs~l7x!)I|2;?9VYY{(|wn=i2xuw$G)n@vT{9O^2obhJOu;|!(&irwil8tyhnV!at4Rk|{_#2WTb@1rAZgS=3d$?-ej z=zw%#Ts53SG6fMxBZ9~lC>AW41M2+Yxf}TLg;?c44!tn)x_J4+NAiJxx41Hn+S6+k z-6OnosOG@9%DM=~L25_&cQXAymhosTI_sdtu)GgYh=slJOue5j8(GDc{|6RQ!P+If>X^}k4N_w5{uNEZWMblRKoVDF7HO2 z?qY-LY=^{lp`(yRtY%zK*~^7Rk(Bou9bWSF8Kd@yHP-(lNa>%(r~hea#_N!A-&cFCe62*F3>uj&I7O%n+X5v4+DUsH?mbxCKG50-!eq+%DBLZgIxl!3D2=FNV8 z1ZKI6Cbuz5R=wL%F7}j;^etzrdm3@#nnOFZQiW`*9>1P3tixqu{gpn|B&XzK#9Weg?Q`Yn-9DWjV*!p zM{M-%K?vF*Ui4x+rzGIf?k@t=0KlJ0E&uC_6DFiQ(jQeo*)9*P3w_=(w_U=e18*z> zR+LwYqMg6x{ia^D>%1wEPrsmN&>SM^ z$J6mgi*|&gP}9_3d?*XSsJ$ljRDTA&pttBPm~gKQYJqH&OWj`4Fb?ZO>&`LzCaN-x zW?%Ha>%bq%0;<~cpQuvXVEWIhy<-jj1`8nleug(e5wJ53GT8qk?JJ|A{JwDCVPKF( zlx{>oKpeV5Q2`|d1f;u5YUrV*k&u*7e@IA)O2g14p>z)|B_&<=@V{U0x64{CKCqT7 z=6%oE&))lq>b7tyr&8BM4Ji`Y9rn9JUdm)xZlQk;X~0d;@@(YAsjF7pIg2G^ZS0lA z&g%Q>?Gc#!8ng!mbyqyK^Vi=vcyECto~_XhTXXM%poZAwOKo#XA!T)|(Cz#e zORuHFA5^y+Na><}|AtEG;WT70(&9E3T@9LI`)pz?1s$dc=4~9t$kw!uH0Un9^I^Z8 z9W9lB5BOkJ1$K`@SoKt=8G=pV*wJCFpmC$`n{zo%EZvik)9;2v-BvCHoy&dB5}_{o z-x}|8?&WlUu+YXQZ*SQ@>P!F6y+0PerP5@y1IixbAw3P|{x+PXj2_{0;UmjsF|=Kv zOSUt;q-#aM#5@QIpYdy->Ael4xB6RE=fBRXAH*&g^r0ZREK z6!gq{ugN?`LA`~SZ5I)NjOH!Ib(a|tomP_%|!s| zk>nr#jT@Q%H?;9gM9{zJ%Iuf0x{lw6tV!b2#&2ukWOOcMDLm1Azm(4+sq9NKhUgVZ z*o3peO7{QjB*wa})e`Vwi@yXE5o^M$C*GJIC;q$TyB{Y)?Co27FSYge*Sy?o+9Zc+ ztgwmLKfSeo$MQlyCCu(IVHiD1I`M=al;>3SU+H*DwIBVQp?7exwJR!*0WyCYCQNM} z0kBBzxNs<1t|m{Ze&%#6sI^@p>F%+7lHy+4g*kEicRl@iGh=YzIxEqN^V z(PRfUGn{xCU=H#4+7_%#YzBj0f3nc1v)kRE)68FcC~;t$I?OP8+c&Zy=nG-J_-~#c zP$u$yzq3ItFuWGq8|ZNp@JrRB!}A8(`xXpYpeNtKejZ~|;lfFyI38RKe)d2}>rzPs z8!4&-g6Kv5i4ESnmn^)S3XaDe+Z@jS-Q#Y154b6&ZrWP}qz|<935ZLNzR{f1OoVv( zC(0NC^)raAQqcXJ1nf*0;0)%}-kLx$cwDJ+^n`2MbS{X&6mnMaJ8oqT2hqj&5ad*| zOoaj>G;F$cc2Jq$GSALlY7>J`1Jktk>U)>%h9ksDeLxf0HmXz7#LM|l!nriBRc`|ra_JF%y#iCenx@(ht{KlJFkCP)x)Qu z1l)-KUeu0PuzoP3f*0gt{t+A9h0~P0kp{;9?HSri(hJbbK9sQU)t`DjzwzPe(3^rY z$}e2>g2T>fFl$X45o-581#~piI6*mDigKyq!jVnps?FqT?4<0uH5)XJH%9JQ3<{$w zIPEod-fsWMb5P=}Km1l#zf?uMnWbucG}L=ZY@)Mq!vMSZY{b>#)L+j+q5$#Z5gPnw zOE8BhGK2ZAqM_XEi8wO*Ckp}xxF16_KdUwydd=WL&@~AN3l6`_*7vcNzcY379rVtj z4+2kmT_!A3VGzc5cArUCf3Yl5!tdWl<}hc!MS2&&3TXzFVf1Hbv7ke%TN_{a6lC?c z0_BMLfj>EKEC1yY{hN9Yrf@~MRs5uLo~kbT*Xlh7m9AMKZl>!nDG30)oW96FuUh9x zJ<=Ca1fkZ9M&?npP4-$M)tWgirJ&Y#OW6|2rGrS9c~<&AiLX{!Gz4U9U^CTXsXlM0?*% zrvTXdFmuF_*0L#5Jy<>%vj+w!=r@9pi3KG1S6Vxd8vh>y-~=D7(P7#`LT~aW$r)?L z@T;&z5FWzz?4d=>)qK(#a3bz-fgi8AIff0Gdp{IBNEN{ku%8JidPt#=`9;NZL5{}r zK#>mgY}&IrmcnRxZ#3zhPsDX(8L?@&J1E)0C<`%5Xg`y&8d_t6k;wT6?Uia-fa+67_Q(HIcJRrI~OqO%p#%W?|D!ozz zl2Tcp4(u&0vDaT+Y~w@dTb!yG>c*Wg<(#AA#rRg|t3zk`%8Af;|4s8dIwtOTroAA+ zQcaSz)Pj4K-UY5(C7S8CtR(YU&)JcL{VlqmtU73pzr5F-|6|$jbb@O25}>%6mPDnM z1yBrHA&{46Q_^lG#0i&`-8F8Ry_T!(TcQOcnYgoa`fYX6#1;E6~)` z$dO_58aS0GP-aYmXn7FOzyo`&{tc8{|3;TSc(K!K{86pB$T;H46jl-wqQ>L)2Q3xm zomfl|9LdiQqc(KES-*VWImp?6L%+svcKf`4TkiG~`YTD-g~xn3nhFK%Pu-s&B-*FR zT3-E2F=!*f!VwRkl)&ZwH7fr+e3!}xUIaEO$i+K`SrVljwn)6kZ6S&i7?mrjdKeh; zF3d)Mc*8(l`CiN@&XdgKdn%6tpS9)v3%XKV_er>zfn1>(QRt2prh8uYy^-ogOh`rg zOF?0k#?g(|?y!+z`wseL%AeYeD;!v*antTwfBoexL)LE!#0Z;JpF=6Xb2529@1#Yf zYEhPw1gP%f2519p|M^@RT}c{uGo8ySC~;_7i=X=|%Yy;u`cAA>=!0_MV8^)|ciV|E z`!-B0$qv*nEwDz+GaI2Wsammsb1?`qc-?*X`a0k?b_19&Elro%?`+drHgj!%_N3pd zrKJU@{%mGDoTs#!ZK&cY41@(p#I#rf%fekSzUEFq?5NK^&Jb3n;tWTk_d^P4qTEaz z9}45I+)3>-Pcm$8_0wG|JOz&eKCbbfg-2hRsV*e~>BLYglv9ZR*}wY52=UO!O{L1a z1Vaw|tiIDr&9Ln@bbodqjB=;4;iMl8L9hFN~&e=-z<0g2JyV9FPP_^7|Lv@eh(oseoyAQ!kvB(C(C z*UW}C@E=lGS*O!txNWKM5y&CY@YX1|6f~1V)~ETt-Rq_}^RLH(Y(_f(ETN=quviXR z*O*Uxi{p~1Oy5wO?x!{FF&k_TiQHClU%h%g6YiH@>;z#e> zjn+WanLC0nQq`N8TY%OG%qsk^%6wNdGC`5VQyQDt2E^xWY z7uHn#lM!jX2ZX-7zvnaP-v){l1k|#`-N95ne&a)-L&?hSaA5zpQZCZ_pEyeo{Z9|m zWPYDwIhOxlkn|D3#=lU`@9E=DfxAZBuHxd@LcG)Fm!SlVZbcVv7@?4TMpJ_HZ(z#c zld*z|Lt4H(%vSx4D<~8JXJ)7`{>yx;HM5R(zR8h5g}o?|XKMH(-@V-JeH+L=ia(#D zA$A6f6UX_L%ps`hS)8S8Vo<=ja)xkLst^@^7K=4aHB2gtH*={$B}ZdrZksSA`EuGq zj|pR%o&gnE8SeJI)akI)8xM*K*QM$S{n9OX?*%_SCK;wYwg!sJ<9vQ~inLUGBp>Sb zJy@)^xbjh$b0vOjRad@#RTxYv1GNyzDYBH~c(Q~&B9lEYr%o~n2w)1>s0tv0pi3Y< zCC|_QV>0tH)Dac8s2~28oj||;W|;!2Z}~a6rmx16Uw?vSF)Ne!@qO$VaSDe^kk12$ z+|HeE1iD+-0T+`V1@wZV9`G5Or=Vd6J)_i{0zxsrA8HO;AB@8Nk@8E9BG|mAARi(p zXmONjuy#1=p@GV-WaM!#t8(m%nc0Ezw&_NApz z^D`El1sn*i)3C1Xa(?VueK=`vdh~b3WieK?CAI0?vU>AtF9czwx4p@}ly|k+c6!?-AIr=lnOp0<2p$wPCq7U3szUozS5vdVc>G$b7wQVZBh$j*TTJ z;8G>!*CH|5gvW$b3(&tR-TO}rOZ)E8!mOw_KTb5d2o|$E8ijL^NT{yfYHvbIG5Bub z@lDN73?`#pw$x${T z)uT+8m7la*S1YTlAptLK#@YEDi)6FRMa+}@3ca^Sp2;mTc-fS&HFnGro7`($#xsZK z=)qZ!A*}DjK#tVPqB)@RrX_3T2V z%@9XOTueRGxdc8s1ELqgXi6%7V2IKvp=Zwc?$`bRqsWVfxc!;Mrdy)9+HjJ5m|tqM z(|OiHmh1lUa&g!)31#7*X*sn(S&0hMeap-lLWie`ogZQbkts zILlqdwjV>J{WzIMs}Y7Lvm2@ApsWTY{4?Yq@l9X9rkK6DJZio6dTNcl#fc>{KE|p4 z>ru9US>MSV$PjQ=6-b}a$KkhW&Kx3pwJ$sH`t%ObI_n};_02Wvc$LA_hr#q1{QD$W zQ3L-Qo_#T`vN8=fsv3{wkOQCU2`eNLFy<^HS$a6H7}?V~7Q~V~IKoB!o1Q-EVbEZ?)?(GYoWaJtRTv@uJ6{H=f{GP2A1~P%=^!zoey20*a`3i& zXi!i-X=R!XuJUdpNsM6vc*B)gaqkqz;kqB1ub+=Zhu(WALisrw@ydF-TEu!{O}UVwJ76~D@L!uP%LK-vL@%kk%9Cgl)3_6|`WXn*||pQo@#SW&)IQ&!H^ z1GF7vnFh;xN%n2z+_2opdB)FZKLOpbcjOHv<+(JZfbLVn>Mj$e z0zuVFiO;c<_GJM7jaQh{M;=%MGy;%%zgOceDk>`M%yxjNfonTudYo_%OVEcr^5Q)! z3@mOSG`dGW4K77uF-81=D_BR?nfbhfCkIaLKvdoQU!fcr`b%$-uxt z1NBEPwzHb!t2n;!|FZV!TJ#JJ!{&}-=g{m*SUB@B#31Ivk~&bx;{fk`+!0^FL7uJx zhB^B5?k|ePsJ1ybyw$8Zv#%4^&KN&Op?hoI|L+tzrAluIp26&^J}1cbAFY&I>Cguc|EHhP0XBdzZZYFr)yA=dAuGEJ9 ziiBlVXrQm+SctLjWNyk75OkE|BcG=K#2cA34+dn)z`5zRJnqCsgXw?47lk>-KGh6Q z-a6+vW>1j?>_TbfBN7rP z_+A8SiFZ`NVixX2_*3VETt8_mD=U#pUrWpOot}T&5p&k9XLDBp$KVnm9y4$wIbU(U z%s*2SZ~@+ETUSipOK%Ni1aCW>a2x4M#-u@l{3^UMQ;D9RZRdLZQM^~qyerO<9ig^m(BCLCsV5$?(5yJlwfWy@dAAb?i z1{bY$YjKU?ZtCz25kiA}S!^U{_IN^|%TglqmQHUp z^OH`umxX@s3XiEQWk!t}h(F+aWgeUC6&3d$i*pB#its6!vA2a%xnWyfhj%Cji!{SMof_NEG0TbFnFRr>mHT&n)lqn`4!mT&Reh1U=`bySx> zvuCVFxW6?L5y0m$c+&W}pL2y0s?I(0NV9)Kj{(3#Okko_ozlq9%xlDY%0ew-z8J!O z2oB*7w`gs<@^Y{6J^CAaCF8yKY4^LD?1d2Yg-qCu9wU3wt%eO@K4%f4BRL-LlzHlq z_{bF4CD$-i-59@(!_}L(2>WTRr$>u<7nCyJkURApQsB)W5V;rPB29}IKqIshQD*!( z6@wCd(H66AuejGkzRO)W_Xh+|9pV4jgA~br;Al<3QU47+Z@*mZOFM5UdKymf4faz% zT1DI!Fg}WWZ*>Oqsnrkp% zH|(k!G{!t46KyZfk%CCN{otssWsIY2wN6=mZ3nlX4M@*|D6v-hJ{}K%pLFSAa{MEO zT@bhVW8RdE@7J4UnDTnw@5^LoXnwd*lm4o~c}`~09-veJ&9^+KCL{?UY@Fm@^yh3J z!dZaDF!!sb7XrQ_vc%nE50D^KIq*C0Je1R!!)QCY@R67RT-MY3s|7KrvU8#& z_Yr|ig=N*Qw)#9Vs<$UpeNdvdp%O1@lKN=9molHkNHo^kd?j^a_(LC&D8Zk3TU(%F zx<5J0<4WV);d1uC;MJk+l7NyCp68D~P#e%H+Gr|HpG|tfIKAaq{%^IbRJf1o1T< zn~AwD;BE-6lTKZ3ek8!c}@a@eeBd}x@d0!+}(z54aK1#BVS*GH46D(_4kc? zh0y9un7^aQHaO}J6LvbOt?madnaR&RO=)8ZE_zJN_H2jl%b9`vSERcIB0i8?%JdFP zpvUWd_1w89@k4Q}O~uSi0;{YfyR7u=8`FW938Q{I1Dpt=XS>jk;j)_5P;&xM zv%bmxhl4Kv_U+s596a8bk%Ln-^9Dd-syX{9Wqx=vm%H(;)6)#+&CKUPQ%VBmZmX(W zR}Mc{idsf;`b8)gwlwk*ItAvHgb3VOa%t;%qLR`1u=$lEt0bu(%=$AwJ(4*F?+q+IcZWSFP}JP=@kENe)6?(YJ*2+3OIZ* z>(gLP$>c+R;eepgWrKKQEn znSwFr*B~F4NpqjCakQ5&4ern#=dDJv5S#pCbh~Z+2HzzL_A>$fbfD@%@36v%6WXo1 zdvOrT)*^gX&wn~XeJ3@i{T-k3rO9ulpBy*Rtmu^t* z7={`IYa9rQ&BmA>{S?c3rR5t69*6|mPOO>T*zO&A=hE`wB*QsTP zZOgclHlDTV9e1c@t6XGj^3prE6`G}1F+YfNCJxJ0r`Y-SroTyM0apLrWy-OtS*Ph# z8@2RS0SjD|LhVay!s}PSvZTDWwp8663`Y+u%4$~VjsYGw_v>T6_{H4ZDRamVLC5E- zvSj$A4Cvk6a^e{7R&AV&TXl6^sijvkqdr_2v&D(z?e_0}$q(;HX0C^`NER6WJe9^c z@~H=|@9Y-+tyJM(R>cb;5{0GG@D6@O(`#`vKT5sEC9^RabE~2}1&=Ze1$6Lp=ATi> z)0$0leTd?3U=O0%>var9qNUH5RbDJ)N!`(si5g>~)~7evciBDBBH?gFusR6eybIUO zn-(fqu2$SF(kCD`RMc-0c|Q z0+z51|1Nr^Ipdb3jp(&nb@WLnBJU9UvXp%JLSvMEDLr;wQZBXwWzUa0Wy8UTg$URe z4IH{)rxo)*{dVXD(8_lUSdvxfT}=7atn)4R1E(SiI1RPg{y!-HGEyF9iAbl0!jyYX z>{X=jzJh@FTh@?|u`7F=!>xC1@MEbd8-}L%o4jR!>oS%(y`kv{Z48w)1U#Z(LnALg zvT`m#qfM*3R$r7^lmi%itvSDuU8}2rd67=?c)L<+W1Uqlw9B7d~x}pJW zAStQJL6OFHL&Kkb7oSwR$_uYoD(?}&QTFqW&c5{19%F{(<>e5Vh5F7vH$HvQQ|#s8 zK{EsW79E_!Jm`&5Pq)2Hi z6nv^){pC|94O#+>Pk?MzD&H5+!mI5=m&+yy?AS|KQ zlcNuaa@L0}M{m`s$FGO2 z7!vIKb}&z+7GC*m?AWm1iix@*O(gp8dpEc{UUw?gyAZ%(ZlQj217AE2=<+Hp=wgeCq=*mYhXoZsbUc7Mx0=VBI9^Y2nu8udPaM zZI*M!$#uJF)0;(Ux_v%|R0WD8<16>R;R>N&g<*FEdkX`JfXF%Xh?C&E*b*s)Wzg1T z`|C43DRd;;hwJqV%_6or1k8Mhz}HUKop>7Kvp*l>aUjgEj|vmF+~TDVY252JMAgGL&_N@_lh(Flt_Pa$Yj;YpEABv9)w%Maj7g2f~i1ELmpT86?RSC>}` zdXxk%wD8ZuFwx;F`#rE+Q6EDVfd*%7mi1OCFQQ!Lk4j=Fu1g3;>#naE900k@|8m1+ zeM`n7A}gNW8#0qga}u7{8~!6+ZT?$KyT(~{j)AYPa3tmqjZ=twzcCr53mjFg*pfn9 z9Q<>K3n~-N0_1dVgG>VX=0ZCq4%N$Y*#tsw6y(O9>wCfO5&!t@Dez4Vjd?Pe6;8-8 z$keLMbkeUjpsUAd9(#jNwwz>ke<1#=#rvbmnQVIsd}BPFG^^U9|r4pzOgKu>$oEzmd<1@na;JY+-sbi8-zA zXa27P@*4(+-(*k`{F%-x))>4n^e3w>B5{@5b2fzkcG=z>yuD-nN<~bv?eLYIS2xC( z5@QERg1!8Zs_4&>;L=~2pTS@Yj7E%@e+3B{(-51~hQFf0ylto^0iJ9j9 z7L6$Z%EF$FekxX&ieDEcp!t%RaDIOl%_t48VP~MYiJZgbR(g_)vQjqwd9DafL`lWH2Ig1O9Hnki5|5CGKdGb@r9m0pw{7Z6L^Sox04Uq#o25QKya5 zY10$#0{6a-l+HOJ=~=Ycq*jvd)<4lh_N`U!Y)S1$Pe0LBf)RVhLMNu3@-LQFb+Ut= z-ypz*)ClDQ{+ZC%?_fo$-REMGrp<2<{9#whisC-@%4ai6WZ(HycsI>f*!00<^jBhk ztnU-x&j`P^@|b?zdw=Iwe86oc6cz@`u+ZjA9ktPJln&;a`SrkeqPIt;{cUIo%iqPt zr`jnF?bgN!q_ikC5l1C{IdS$9iD7I@ch3z`wC}_xXVpg8UYKKbxMY`6T z^gXr!z<2V+lVZ!;{mik?%QAntk*OyN6+>bMAhaq$$yVf zts+AT@#H*t&v775$}~6p@!1bQ!6-H}w;!{LPh*7{ zqL6a9#*S>4lv%?xRPOym7F_? z+Z7J{rx1wCd^X+*b~yVvS5jcQi0*Q8e4;+5bG1~JZralRq<7;o4p;luO+;5^&X>14GWn-HHi)n~#-6`A zwhNN!uTHUM?~v#!Qm5KAj_S4i%&b|r2~@Lf~RKf4JDUPi%tEY`w|c02mGI$HtNj`hO044@|4RQLjLfLd1OBFvAf< z`TMY?7Ia%pz0%vxLvi@h0Q94PN^F>-{L1Zfs_sQjg=J>(3zHj7Dz|Rjs^TIu>20v6 zdti8*O}XpCU`WKQAz(R^6F}Q~JK7&U9Z?$YxN{S<+OVcHdZre&+^oxpT3%sA&VF+E zEojrFUlnKpt3bWlYPnSa^RuyTWWtEhKchE5v_8U_i$HBHa;q$u3NYA{JG+=(;h=@k zDX6KbS;Tdv=H=zZ0E1&w{ga$E}{!n=~`y9w|*fbyb`4jWpXpdsi{&0J) zX?HHwI6$01#&3M>T!FIs*z&*#sjOhFhkbJypwo0My6JxOiP9Yt1RIMUz;|bJDS&OV zxP6lO0qmcX)EAKGUH@NdqqO3D^z5WJ#F;P_>s6_wf5Q2tZWd+uR0chhs}n*ChlNs{ zD~PKrK@)VCGaiuUKb*gAahI7tZAogHC+Om^?jNZZ)cGO56PhYIqSp%B1#%}lHOS< z%)ketR+B|((!GI=oNjvw*~&qX=und5lr`pj)h>$}M!}7|mLD#k8T?h?h21AM31X2| zZ!+SAZOPnT;f6VKt7c9#S7XM#P8~opA<_GR1`rie{*#>%JJzdKmBDZN2y`uwA{-A}&G(%`jAevX-B0GrwP=ean43J2d zaz>MP#ASkY)m2xqFTTmBF}tEZn~N+=8E&d z=Dq3ZVO3KDwvySf`ZOmUr;oSYR{QlAcuL@?XlfMXbZ8o`qL`4|$^zSZ6)IfO?9sV` zM1SPMIUg90*Elko*%qT1%qN-Yf)3N(wUL-;V~Zun9%}F;Ppi$UE6FiWnr3%Q>D!W- z?0=eqxCf%=R|u?o{0vvV`CS9rcQFGYFare9oK{xBWQH8gwVg}j9KWhqzn&kuh8JR{ zN+-}V6Pw3wL9EqPSF0QUfV514w8If~8aY%BoeIsmO60UmhO>Y5gXTLzC`H6~R zJ2s2X+2-iWsStWb8tuv}Mx51K*M+ySZhi7x?yO9YyV}S%)!O9Z=vce}1|K)C?pl$K z$2#MlbN9)l^bF<;D)`>3HbR1}F^yVGqU+jy2*D8AYqGVbMcW2JsuHyZv zx6_C8-UKP5z<__lkJeX-eyHGH8SL>|F`WNhJoS8dgdfltzHK<&7JFwfan&KlCW&$O zWw;*^-Tw$q*VH%#nZ29U+l^<~#xR zbLlUX;Ffo@_oWt0SK~MGBVrwv)$m4c$>+Jrd?v+GQ6bJIF?f6G`sY1vP~-4dKVeC{ zVRipEU9#|3v)A=+GrEk{{+ZM*OF!Ro*RYd-d}F@m&*Zdw4#*5!o+{4_<`$tQHaK_s zug=N+7Ut@csU{e*`Te#}Z&LxiIT=utal|c8gOEJ%h)EsJ-QaQ6H)wR#7HMy*$!+OP*w z4P<^yD@TWcz;x}--LF<09JN8LlzXksAf`8~hE;@(Y(5GWQ&+0%y*Q4aeu9 z?qk9S&iX92T!id$B;`vB94}}!8#u~JcCEgThQ1&A3jzgal~5FnYM;#132Z>FMfvUI z65F?UX(!)X)R}?OX2j<&;q>v&u8ODj$L26k!QR-0Fg3e7S~!!kOylS0S@alMiw$ke*zD*zXOB`pG1iYBOqz$D<75cg zZ>`o(3O`qyqO0U14!o7I+D#7scRC!b5`otOt@uL4pmSWQb7dALRUDd*9Utb;#!K>_ zhJZLh8`d9|EtAS&yfrwEZ-HkN$mDHx@1Rn}br2t=(j$@lA_E`!vW|xC(HiHau-5{N zmtyc)SCvUKh{eJcopDbZ@+D=K$to=L95eKCR8%JtnFl9zQmT^I<&(FWuAep&#?s7; zcdNY$fD*gU&i{fA@Ggy%1^P;d+BuYN8EPie8cPJ)SE~vGH1YOe+=myuU;;?D$fDs+ zcZOikofF3Jo*d+DI12n0w}?2_&SoZ#<{dyKS4fh<) z`T5Il-NyLpE1oDa>}&9Rz}{%cE`M|-MRlO(5#VNIxAS`;kif8M)Q0>1W}xxCqZ;%E zqt)kfDRf1=H~OJ)PuvdhV4&2he#VG;;e8ZSV>2(1fWC5~ZjuX}HKP4kTnIQ*JMA z!)aQr#8=^|Ot|+cPt5;E&abpXYvO1~{Jve;CE+G{cQ-9nfMqSiYrj=KOD``L$wOVu~Jt1CrC7;KmK+^{Mu z05}IWZeFw!&SS8p=!frR6ga|q9IM0hi)m~*T{bkFYwW^mcyn*FMY43 zaW^w7$L#%6kXqjvn9cAwcucnS(JmoBwZk1}CS~+qz{Mh@qGu(+2Csb@;CZQONcFhY zj{V&aZwSb>A<*Hf-$}sqan!9M{g-h{VZK#k5uf|#5iTcBL^t7CI-oE8;$m59Ht1{G z1=p=CbfE<%Aam`RtyIVB!H?c&RoV*Nnu|XEPE-BIY46HVw((SA89e4x_NWmmV13*c^P9!xh+J{^8pnZ5#jHr&{i5;A0CPR4yjCT5Liw)vsm9 zXDsfO{mLwDAdlNjM*w!EK`p&gwY%t915OZz!~*q3QEmvQyiX!Z$h2f5j#)C2w3(Yd z_x^5foDz-M8wHbaC+uK*M5?4iPZ*$adu(r}jS8YS1|ikN&=JV9d(Bm5V3(IM_ohM* zonkr@Mke;&>#h5(DZ>(-j;IH~UbW@Vp_XmlszVi`vZC7&6hytPoU3`dPf{pqy> z%>nt_FlF(8K(CoY9Kc{b!`9xZ!(N@fE7tWeo0ER2-MhOB%|_U1t36OhAUVdhz8j_D z{b;%eL}~hh{A6S%KHC;knY;cvT7_iW`>o!>;+*)uQ&7-8%Up1-NbaSA$O%tl{aYfg zji-#{G7W>O_s#0^I~(A&2`ob%U}wqb=i@m0eQ7-0;)RYwy9`$??(JU5qf-J9-KYe- z&7KQp zgIlCqX~9kP7b)fClR=D{iyfh_Sja6x98m=~7091JA;WA+ql-90wHvjozP=ET)QZ7k z^R5-KT(=?{%n))XX6=DI?bR({jJiVnXazMKA3(D3zgq0m?RFQb_<)>@0~BHN*f-O+ zEPbFep?sk2W&AJd9xID}WqT+&*hfUI&h2d$Ayi%cY=Fw-o?wjQx)?j<`OkrG8U6f! z!z4drfnCQ%*D)O>^7)A^9(;V{Ykpk0G|#nI&*v2RLDBH}Pr`FQ z>k`fyV(T#63VQ~+M|rCjQ96Bd_!7C*6!Kpe_;ZY*d$ogbkZUhmgiAg8vQ zew$5obX1duX$aYV2A5-Xg<^ykwD>^(V)AwOTSb(1 z=U6kBTA@i=f+?380_eY2$r$Ck3Jd7Qtp_bp4?+Bw8v+@3vLeLGev5|?PWG#Yg1Cc@ z-!x!_u`1J!6CA;@@ml%ugcXmU3Pp3&c{G?~=dZ$V3VIkCNJZ)@5(K`=2tR8neNfPC z&h%-aGNi5nH-kUWpUDL94p&f+&I8c_LLhY|V8WcOa=g}4(}w%#Va-TxQhb6*{e(Ps zAdU*cQ{SCQzzE(*aDJ#xUwulGX6XaCiAf)deRlnWh0wi6S9n~&jG5UTYj6GRwH9XX z#APAZyyUes8c5O^{?Uux8ECmN21gxVlrmvT2|mW9Z0`9d$8tr*X!>v$)EgHK4t@xV z3kRMii6ruzqS>ca_Y;I}<8gPV`bSMa>3{GbZ8V-6U_Q1F0Q77x3B6NNdakzjubL^%GOBS;C7*H3VE22F9h# zk6k}}2BeFLv{G>iM2hIhoa}huZOl*X2VxUn2MwX}^=Lj$kM6ZXhcbP?qA2T5`V&%{ zvd-V?0gc@JcM(i~onZk+z=j*kdSfMHR$w zG3KUy&s$GWGyu;>l_gUoGy%9IESxR*9e_@{pq{YPxD_A#vVUHGcww=hBLT6U9uV_} zUbK(8PQ{$(?{x}?*=C_K0WoCTRk#>`=VVQY84wO{yJ z0fs8~6wN+;SCKE1@U|t2VhSDo2KfzM#Euqp zNE16JMT3bu!i%FmC6H^%A&->E^g44dCfKe!z$^XCLwV)4#+frIX~;d~mC0K%Ih?4M~1j#0B$@o4+E$a==vf zygQE-4~SR!V2%b}gb8Sl?{}tlm=dYKAAhrcD26D{e9U`cFk%83k)3wr2r9{`9V5{i zeIHrg<=h((28J@yB0)}@MsCe^9w6nl$U@l1w>$+Vm994AY}h0F(&sz#EH8UG}I$1Qy8MRXe!|80%?^!;v~1hN|;)`6Wwb%ShM)zv)c|>Gb-?! z4_t`yHJ|y8AReL!CSOII3}BCh`>>j8N{ynk+t!%OBo@~lUlc8xgrj=LndULh3iwJ`iSCCB7XZazm${%|6~ z4fa8E!b+Tm*VMCcg&Z$yo_#JFeY|^hA5qK7nJV?}ug-+-Q!Td9LFgqvngnE)@D+sM zev8ZN(y*pu0Vi{v_C827Du!*MwhYGxr8a%tS(K;241G$x%yaALZ67>sh3xKgIqKmh z{^go{-{+v*zg?K&7tWrHrk*r3dmnWQhj0<`zNcxLeZ1fV zumMMu7VmSqwDj@ifZsL}&bCQ&xy7jhsx%GKXr4j8o?C(?9F7@u`Qp(yV}V&Hr4LR2 z(JCONmc}&Mne9JeIp>2PR5RuBVKj3rk@o9=$Icn_Ih8>gEjQvrJ3o4?_F{OJTHz9}!W4HGI^-&FSvtF`L3!gT{IT?-3eQ5ik`8l;uU}$_ z*;`*dBaFFdn^@HN{xbU9jen3Ns@9-2;gI4Y07q;|xV^Z@*ZOlF+BhD8{OWZB^!s{Y ze{x^RK5EnDNV9X6k^cym%vHk4pk}PWVoJY@!fAj3G{qn>nF#>38tvT)@lKhq%QO}? zjPM9-J`(=-I^M&%t=$#Z_bsuI6)ed&0QYXLI5KAtqhrCSj8y9RY0N+%-9V_{!x#THhExJ2-e z*lgc(pT`>9GX)wwoNTVBFUn%;DOv&W`qHje1@7%|MtoNW+oO4IA87mMAJ`^OC1AVX zf5Oen*?s`^bHEJ0;O~45gT;(+=j*Gy!BNx;m4XxU7 zvm@_Xlkd<^D1npRY05Q{@rPT3XD7rdzO|2MI+Ofd87+M->1f*1ukd_j7kKf<>pUdTP!M*36bN1fP^LZSt zUJ{59GCk;RW$e5C-of?L)8a2y9S09d&ZR}fgVFCB>xrz2I~k!Hl!U;Q@6BY*^Bwsb z-8lQMsXT28*k*Fg-(ib^!P;lY+)VIu0xW3c0akO~it5DDx?J55oDK zCU7E?-CC|PTv~Jf_*QCc4l!ZYM_&q|d1tr#qc2qu&G>gj>Eyov>`I26OqtJO%>&J! zEh^tTpeOqVgA~ndO5gOn5caH(+4Jyt)tI?fSU=+RrMD2`In|x`0sXt3 zP~R6df$qIZ;&j-;fgRK$@d9P80;IZztUN!#XK-Q0!Jc=~beZ4)K`7Yt`^FLA8VuELH zU0d5g)PO-Uoy!JS?nlC9PyM?2138=N6rM53?1{|ZEftF1Vq(=KD5@ZRgYh69D?F!^ zr^TAiL*lyB8(~Qaq)HLx)q4%Y{rJR$q=>yl|J}k0uJ-n_Dc7Q$4;Bi-5{mmFrH=wp zWZ&3noSwbwiQ*NyjYE?yRGlzokXICU?v4Q1@C6z`)?zN4(f)kJSpEyVhUj~_zt$aj z%WcQxmK>hhB|h?fh5mhoR;h78@IPxrcV$kWjv>@We1}OTgdjM34<`Cs?AIJ zd{1~^bZ7IuYq)kCxq@Y+Fj|gor#v5J$;nx1C>KYI@q1B(-%uf&chS5 zx2{G?7!@}6v;VDai*aOdIu}aEJhDuc=fPXx8}_r9O(rZ|usRD3HSai%dwRz(sL8j( zhbp+kll4nB>`i{@3X95_X`1m9;@613~K3DmzDos{o$Wqye6yZ2zfnmZ-(Nd2xG_R!W zP~*I;&{=c|ba?b_w2Fw;H8yHx^#cR>mJ#W%L)te4{?v>HlFw&aaO|E-@|HhjpdB_; z6iP&;w2R=dn9iz7sTkrIzsn9OSCRVmqP67gE?j%&2Pe!87uWplXw++N_KXQ8%&)Ds z{)a!Pv<);HL&%F^uK3iyCja>3Idw{WCFC)CTc4(@7i(YlS^9B&Li-?(L}0CrC5If^ zzXz6zT^|YCZvKXUgxONUrK%}c@!85uGGwGpcN5p&Iy`td`uV;%k?=<>g=fVD2!YQ| zbQld)KjP9JWdKzI^5S`m9;Fw*9@lb-w()kd-^o?~8~X1IcE)>%nku{6+m7&Q|Iky^ zc5lq!Zhe)LJOR9^9PCEGb_two`hzTzXDE=y1-W4h7*@iDTy(?WqxnboudLruNG8^)QGs+xHorC1I^Q6%*jpsylqG-=pbwsbKrT_tG7Q2FOe+?3K zM?SYWcr2NwblO;A3&wr#)eXQ?PI(_g7+|~_ZX97gPxUzt~xKg{K zz*w2jMW~4Q{~!MGny9b|XjX_8d!R5PlG4Q~SN!yKz(?3&@^H)lYOK;z44&gi8Q{=wZ4>K+3 zrMZu2w;^2SA=I$CuY12ZY(4F`ClXX2L#IN*2BpaA-?yK*u%x4ROUB^Lm4wUoQL(Kg zu91AipRJ(6yt~tnj)If&Z>SpJgg?Yu7j14ZSf47Ft1QH>_Yk;CrB1$%)$RwSArrY= zh0telv#4&!JnqiiGzwf+QK zRj{E1<&YQ6(uB1YqPhVlThPF`h{1M5a}yYJHT$1kW0lUX%}ujg{`AM)2tt<)=Y_#s z_n_2I4-+;GH?XmY-n@OJF=3nmxc+l5k-U?9fuGVl>_u;d5n3^ZlKe>G=V zPld^(XeY@SuHE--Phxu(2U}olvywo|271^uW;-m?OgMy zlW!L%d&jx5>LDLO=Ob2cY_W8G%-qfK>y;5vHuO}_Ahfca=61)V+qhK9UPGrrH8)ID zB5a_(^^}z;=93VtJb=K?bxA`LXDJM6#&$S6*1h(B^48V>#zwyN-p0A|=fk|1PAtQ@ zWr@{o^0AE^<}VN9f18eE!72_?2K1o9V9tOONk1 z1PI&Pi1D6;zmAAuhtSe@hV|ZXCe=juoS029U~o<$ijTGVk@E33?O%t%-w*=*m|Ky< zq6Y5P)M?1G?aZ2uf*dgpSD_)uVL%BsR&ZYQwzM)4?+HKl6kVKD_#nxUVZj+eUgDF2 znap_=;FdP-vVB5HdegFsJ)a`Jl7(<55h1+E4)kbN5Kt6}%EG1gh05Gt) z2d{d@gj~BmLR&Mor-5$V&O8#y9gsv%N}J|AM&6G?Xtym|x`n|n@bs?kAK?K*o4J<6 zhqKh}=aTn_<0-?jHfK}N28V;Xb zg3p56+B5|AMXI5(FNB=$aCy$us>CJ9^v-T)#mklJ7b;l?56=cYsih__U;SbxiP(F> zj`ZzahH1R5!vc@g1b-54(yo=zB9KTkQZfi5(( zlMpC~#LBFi8o>W`v~_m@C753vO_SzRtf`2^q?ec!wwcB=u--IeLr%x{2RGKUJJ(?Pw zpZ)=8+S?9O(aJUXzrMCi3m#POeqrSUR61DHdRkEBDwB@sJEEIDS7?`H&O|jJWw=uU zntQv7&&pG6>pqBDFD=|JhXoy&F@RYdYq`!E(aD|H&59?%Yi|_93_d;tt?&*yOi-hn z)AFT*K9)?dR&nNSbhK5C1(M93U+%x}XR@U$@h?68swuV9$ZDWFN9%@b4?-y8yg|(Q zBe}lRUbiazd4sb9WSg-V@woxS%|=~}NWIq1e7}{eI&0MpPZzwozWGk-TTvhJ&N18a zGmRg-iMo~8_1Q2!jonvHy=3*zLo7n${}L1^QBFyX1wzJ$A#*PoFvOs+!Qp|<88c1r z!K4bxKH5Dxx9Cwc*C7!_|h&|aE6G~O7QR#nBQ0MARF`fs6J0hJZu>R zMeV;?hnhgMh_sW2gY}BYd-#U`7si=}Gd`l_gS_S{m2VDov<8dtwmic6y_yvv@=^i^j-LBA_8HI7rz-O~y+d^g; zhFA~nTPX3Z!IKQ64H9giJV{hD^#DwRPeE;(>E5Nfl~2a;k!x{M6HnK%ZkBcJ-Dcyj zwAqyTesuA3d^@9rW;z&cE?2chxY&Sc)CLOZhU|$op_Ia}s!j+L7;!es6m3b1uhkc9 zEMMNoYPNB%u)oVg82%L_juI95S1j;STLOrZ>H7ynNMlZEHOtxP^;1X2znjZ_(38i@ z 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 z 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 literal 0 HcmV?d00001 diff --git a/units/unit9-sim_files/figure-pdf/unnamed-chunk-11-1.pdf b/units/unit9-sim_files/figure-pdf/unnamed-chunk-11-1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f14c661dc7c2278df461473a2bc36df24e6b3635 GIT binary patch literal 6143 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 literal 0 HcmV?d00001 diff --git a/units/unit9-sim_files/figure-pdf/unnamed-chunk-2-1.pdf b/units/unit9-sim_files/figure-pdf/unnamed-chunk-2-1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dd22b4cddde0d88a8c64055a9cb4ff35fb9dd6c0 GIT binary patch literal 9033 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 b<+g#ZVsmIL4%aNncp~`c%qsn@RK))PB5^-~ literal 0 HcmV?d00001 diff --git a/units/unit9-sim_files/figure-pdf/unnamed-chunk-4-3.pdf b/units/unit9-sim_files/figure-pdf/unnamed-chunk-4-3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9d979e94952e1f0ac6d32627c607998696759a41 GIT binary patch literal 15790 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 Q09^uTMTLtug0E6`Uga7~l literal 0 HcmV?d00001 From d0aaf4f835b41287a97622a072791bcbbea71a0c Mon Sep 17 00:00:00 2001 From: Christopher Paciorek Date: Thu, 26 Oct 2023 08:34:52 -0700 Subject: [PATCH 08/17] rework RNG in unit 9 --- .../units/unit9-sim/execute-results/html.json | 4 +- .../units/unit9-sim/execute-results/tex.json | 4 +- .../figure-html/unnamed-chunk-2-1.png | Bin 32379 -> 26141 bytes .../figure-html/unnamed-chunk-4-3.png | Bin 230924 -> 228748 bytes .../figure-pdf/unnamed-chunk-2-1.pdf | Bin 9007 -> 9306 bytes .../figure-pdf/unnamed-chunk-4-3.pdf | Bin 15754 -> 14647 bytes publish.md | 2 + units/unit9-sim.qmd | 172 ++++++++++++------ .../figure-html/unnamed-chunk-11-1.png | Bin 30386 -> 0 bytes .../figure-pdf/unnamed-chunk-11-1.pdf | Bin 6143 -> 0 bytes 10 files changed, 124 insertions(+), 58 deletions(-) delete mode 100644 units/unit9-sim_files/figure-html/unnamed-chunk-11-1.png delete mode 100644 units/unit9-sim_files/figure-pdf/unnamed-chunk-11-1.pdf diff --git a/_freeze/units/unit9-sim/execute-results/html.json b/_freeze/units/unit9-sim/execute-results/html.json index ee315a3..9d29b60 100644 --- a/_freeze/units/unit9-sim/execute-results/html.json +++ b/_freeze/units/unit9-sim/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "73dd2ece761033d701277fa08bc75ad5", + "hash": "1360e4a939e0518dd97d256a882c8c9a", "result": { - "markdown": "---\ntitle: \"Simulation\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-17\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\n---\n\n::: {.cell}\n\n:::\n\n\n\n[PDF](./unit9-sim.pdf){.btn .btn-primary}\n\n\nReferences:\n\n- Gentle: Computational Statistics\n- Monahan: Numerical Methods of Statistics\n\nMany (most?) statistical papers include a simulation (i.e., Monte Carlo)\nstudy. Many papers on machine learning methods also include a simulation\nstudy. The basic idea is that closed-form mathematical analysis of the properties of\na statistical or machine learning method/model is often hard to do. Even\nif possible, it usually involves approximations or simplifications. A\ncanonical situation in statistics is that we have an asymptotic result\nand we want to know what happens in finite samples, but often we do not\neven have the asymptotic result. Instead, we can estimate mathematical\nexpressions using random numbers. So we design a simulation study to\nevaluate the method/model or compare multiple methods. The result is\nthat the researcher carries out an experiment (on the computer, sometimes called *in silico*), generally varying\ndifferent factors to see what has an effect on the outcome of interest.\n\nThe basic strategy generally involves simulating data and then using the\nmethod(s) on the simulated data, summarizing the results to\nassess/compare the method(s).\n\nMost simulation studies aim to approximate an integral, generally an\nexpected value (mean, bias, variance, MSE, probability, etc.). In low\ndimensions, methods such as Gaussian quadrature are best for estimating\nan integral but these methods don't scale well, so in higher dimensions (e.g., the usual situation with $n$ observations) we\noften use Monte Carlo techniques.\n\nTo be more concrete:\n\n- If we have a *method for estimating a model parameter* (including\n estimating uncertainty), such as a regression coefficient, what properties do\n we want the method to have and what criteria could we use?\n\n- If we have a *prediction method* (including prediction uncertainty),\n what properties do we want the method to have and what criteria\n could we use?\n\n- If we have a *method for doing a hypothesis test*, what criteria\n would we use to assess the hypothesis test? What properties do we\n want the test to have?\n\n- If we have a *method for finding a confidence interval or a prediction interval*, what\n criteria would we use to assess the interval?\n\n\n# 1. Monte Carlo considerations\n\n## Motivating example\n\nLet's consider linear regression, with observations\n$Y=(y_{1},y_{2},\\ldots,y_{n})$ and an $n\\times p$ matrix of predictors/covariates/features/variables\n$X$, where\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. If we assume that we have\n$EY=X\\beta$ and $\\mbox{Var}(Y)=\\sigma^{2}I$, then we can determine\nanalytically that we have $$\\begin{aligned}\nE\\hat{\\beta} & = & \\beta\\\\\n\\mbox{Var}(\\hat{\\beta})=E((\\hat{\\beta}-E\\hat{\\beta})^{2}) & = & \\sigma^{2}(X^{\\top}X)^{-1}\\\\\n\\mbox{MSPE}(Y^{*})=E(Y^{*}-\\hat{Y})^{2}) & = & \\sigma^{2}(1+X^{*\\top}(X^{\\top}X)^{-1}X^{*}).\\end{aligned}$$\nwhere $Y^{*}$is some new observation we'd like to predict given $X^{*}$.\n\nBut suppose that we're interested in the properties of standard regression\nestimation when in reality the mean is not linear in $X$ or the\nproperties of the errors are more complicated than having independent\nhomoscedastic errors. (This is always the case, but the issue is how far\nfrom the truth the standard assumptions are.) Or suppose we have a modified procedure to produce\n$\\hat{\\beta}$, such as a procedure that is robust to outliers. In those\ncases, we cannot compute the expectations above analytically.\n\nInstead we decide to use a Monte Carlo estimate. To keep the notation\nmore simple, let's just consider one element of the vector $\\beta$\n(i.e., one of the regression coefficients) and continue to call that\n$\\beta$. If we randomly generate $m$ different datasets from some\ndistribution $f$, and $\\hat{\\beta}_{i}$ is the estimated coefficient\nbased on the $i$th dataset: $Y_{i}=(y_{i1},y_{i2},\\ldots,y_{in})$, then\nwe can estimate $E\\hat{\\beta}$ under that distribution $f$ as\n$$\\hat{E}(\\hat{\\beta})=\\bar{\\hat{\\beta}}=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}$$\nOr to estimate the variance, we have\n$$\\widehat{\\mbox{Var}}(\\hat{\\beta})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-\\bar{\\hat{\\beta}})^{2}.$$\nIn evaluating the performance of regression under non-standard\nconditions or the performance of our robust regression procedure, what\ndecisions do we have to make to be able to carry out our Monte Carlo\nprocedure?\n\nNext let's think about Monte Carlo methods in general.\n\n## Monte Carlo (MC) basics\n\n### Monte Carlo overview\n\nThe basic idea is that we often want to estimate\n$\\phi\\equiv E_{f}(h(Y))$ for $Y\\sim f$. Note that if $h$ is an indicator\nfunction, this includes estimation of probabilities, e.g., for a scalar\n$Y$, we have\n$p=P(Y\\leq y)=F(y)=\\int_{-\\infty}^{y}f(t)dt=\\int I(t\\leq y)f(t)dt=E_{f}(I(Y\\leq y))$.\nWe would estimate variances or MSEs by having $h$ involve squared terms.\n\nWe get an MC estimate of $\\phi$ based on an iid sample of a large number\nof values of $Y$ from $f$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i}),$$ which is justified by\nthe Law of Large Numbers:\n$$\\lim_{m\\to\\infty}\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=E_{f}h(Y).$$\n\nNote that in most simulation studies, $Y$ is an entire dataset (predictors/covariates), and the \"iid\nsample\" means generating $m$ different datasets from $f$, i.e.,\n$Y_{i}\\in\\{Y_{1},\\ldots,Y_{m}\\}$ not $m$ different scalar values. If the\ndataset has $n$ observations, then $Y_{i}=(Y_{i1},\\ldots,Y_{in})$.\n\n#### Back to the regression example\n\nLet's relate that back to our regression example. In that particular\ncase, if we're interested in whether the regression estimator is biased,\nwe want to know: $$\\phi=E\\hat{\\beta},$$ where $h(Y) = \\hat{\\beta}(Y)$. We can use the Monte Carlo\nestimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}=\\widehat{E(\\hat{\\beta})}.$$\n\nIf we are interested in the variance of the regression estimator, we have\n\n$$\\phi=\\mbox{Var}(\\hat{\\beta})=E_{f}((\\hat{\\beta}-E\\hat{\\beta})^{2})$$\nand we can use the Monte Carlo estimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-E\\hat{\\beta})^{2}=\\widehat{\\mbox{Var}(\\hat{\\beta)}}$$\nwhere $$h(Y)=(\\hat{\\beta}-E\\hat{\\beta})^{2}.$$\n\nFinally note that we also need to use the Monte Carlo estimate of\n$E\\hat{\\beta}$ in the Monte Carlo estimation of the variance.\n\nWe might also be interested in the coverage of a confidence interval. In\nthat case we have $$h(Y)=1_{\\beta\\in CI(Y)}$$ and we can estimate the\ncoverage as\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}1_{\\beta\\in CI(y_{i})}.$$\nOf course we want that $\\hat{\\phi}\\approx1-\\alpha$ for a $100(1-\\alpha)$\nconfidence interval. In the standard case of a 95% interval we want\n$\\hat{\\phi}\\approx0.95$.\n\n### Simulation uncertainty (i.e., Monte Carlo uncertainty)\n\nSince $\\hat{\\phi}$ is simply an average of $m$ identically-distributed\nvalues, $h(Y_{1}),\\ldots,h(Y_{m})$, the simulation variance of\n$\\hat{\\phi}$ is $\\mbox{Var}(\\hat{\\phi})=\\sigma^{2}/m$, with\n$\\sigma^{2}=\\mbox{Var}(h(Y))$. An estimator of\n$\\sigma^{2}=E_{f}((h(Y)-\\phi)^{2})$ is $$\\begin{aligned}\n\\hat{\\sigma}^{2} & = & \\frac{1}{m-1}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}\\end{aligned}$$\nSo our MC simulation error is based on\n$$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\frac{\\hat{\\sigma}^{2}}{m}=\\frac{1}{m(m-1)}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}.$$\nNote that this is particularly confusing if we have\n$\\hat{\\phi}=\\widehat{\\mbox{Var}(\\hat{\\beta})}$ because then we have\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$!\n\nThe simulation variance is $O(\\frac{1}{m})$ because we have $m^{2}$ in\nthe denominator and a sum over $m$ terms in the numerator.\n\nNote that in the simulation setting, the randomness in the system is\nvery well-defined (as it is in survey sampling, but unlike in most other\napplications of statistics), because it comes from the RNG that we\nperform as part of our attempt to estimate $\\phi$. Happily, we are in\ncontrol of $m$, so in principle we can reduce the simulation error to as\nlittle as we desire. Unhappily, as usual, the simulation standard error goes down\nwith the square root of $m$.\n\n> **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([5., 9., 1., 4., 2., 6., 4., 4., 5., 3., 3., 2., 2., 4., 5., 8., 1.,\n 3., 2., 6., 4., 3., 5., 5., 4.]), array([0.00489673, 0.04443965, 0.08398257, 0.12352549, 0.16306841,\n 0.20261133, 0.24215425, 0.28169717, 0.32124009, 0.36078301,\n 0.40032593, 0.43986885, 0.47941177, 0.51895469, 0.55849761,\n 0.59804053, 0.63758345, 0.67712637, 0.71666929, 0.75621221,\n 0.79575513, 0.83529805, 0.87484097, 0.91438389, 0.95392681,\n 0.99346973]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-html/unnamed-chunk-4-3.png){width=960}\n:::\n:::\n\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0 **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([5., 5., 5., 5., 3., 3., 6., 4., 5., 2., 3., 6., 4., 3., 8., 6., 2.,\n 2., 3., 4., 2., 3., 6., 0., 5.]), array([0.00250736, 0.04226924, 0.08203112, 0.12179301, 0.16155489,\n 0.20131677, 0.24107866, 0.28084054, 0.32060242, 0.36036431,\n 0.40012619, 0.43988807, 0.47964995, 0.51941184, 0.55917372,\n 0.5989356 , 0.63869749, 0.67845937, 0.71822125, 0.75798314,\n 0.79774502, 0.8375069 , 0.87726879, 0.91703067, 0.95679255,\n 0.99655443]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-html/unnamed-chunk-4-3.png){width=960}\n:::\n:::\n\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n\n### PCG generators\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here.\n\n### Mersenne Twister\n\nA commonly used generator (including in both R and Python) is the Mersenne Twister.\nIt's the default in R and \"sort of\" the default in numpy (see next section for what I mean by \"sort of\").\n\nThe Mersenne Twister has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. (But note that O'Neal criticizes it in\n[her technical report](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf).) Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The state (sometimes also called the seed) for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]` in R and (I think) `np.random.get_state()[2]` in Python.\n\nThe Mersenne twister is in the class of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy provides access to the Mersenne Twister via the `MT19937` generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n### The period versus the number of unique values generated\n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThe result is that the generators generate fewer unique values than their periods.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$.\nWhy not? Bbecause the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n### The seed and the state\n\nSetting the seed picks a position in the periodic sequence of the RNG,\ni.e., in the state of the RNG. The state can be a single number or something\nmuch more complicated. As mentioned above, the state for the Mersenne Twister\nis a set of 624 32-bit integers plus a position in the set. For the PCG-64\nin numpy, the state is two numbers -- the actual state and the increment (`c` above).\nThis means that when the user passes a single number as the seed, there\nneeds to be a procedure that deterministically sets the state based on\nthat single number seed. The details of this are not usually well-documented\nor viewable by the user.\n\nIdeally, nearby seeds generally should not correspond to getting sequences from\nthe RNG stream that are closer to each other than far away seeds.\nAccording to Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nWhen one invokes a RNG without a seed, RNG implementations generally have a method for\nchoosing a seed (often based on the system clock). The numpy documentation\nsays that it \"mixes sources of entropy in a reproducible way\" to do this.\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\n#### Additional notes\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\n### Choosing a generator\n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nHowever, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis tricky.\n\nI think that this text from `help(np.random)` explains what is going on:\n\n```\n Legacy\n ------\n \n For backwards compatibility with previous versions of numpy before 1.17, the\n various aliases to the global `RandomState` methods are left alone and do not\n use the new `Generator` API.\n```\n\nWe can change to a specific RNG using syntax (the `Generator` API) like this:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.Generator(np.random.MT19937(seed = 1)) # Mersenne Twister\nrng = np.random.Generator(np.random.PCG64(seed = 1)) # PCG-64\n```\n:::\n\n\nbut below note that there is a simpler way to change to the PCG-64.\n\nThen to use that generator when doing operations that generate random numbers, we need\nto use methods accessed via the generator:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng.random.normal(size = 3) # Now generate based on chosen generator.\n## np.random.normal(size = 3) # This will NOT use the chosen generator.\n```\n:::\n\n\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`).\n\n### Using the Mersenne Twister\n\n\nIf we simply start using numpy or scipy to generate random numbers,\nwe'll be using the Mersenne Twister. I believe this is what the\ndocumentation mentioned above means by \"aliases to the global `RandomState` methods\".\n\nWe get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nIf we look at `saved_state`, we can confirm it actually corresponds to the Mersenne\nTwister.\n\n### Using PCG64\n\nTo use the PCG-64, we need to explicitly create and\nmake use of the `Generator` object (`rng` here), which is the new numpy\napproach to handling RNG.\n\nWe set the seed when setting up the generator via `np.random.default_rng(seed)`\n(or `np.random.Generator(np.random.PCG64(seed = 1))`).\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(seed = 1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nrng = np.random.default_rng(seed = 1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n\n`saved_state` contains the actual state and the value of `c`, the increment.\n\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give reasonable set of\npseudo-random values. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. Numpy now provides some nice functionality\nfor parallel RNG, with more details given in the [SCF parallelization tutorial](https://berkeley-scf.github.io/tutorial-parallelization/parallel-python#5-random-number-generation-rng-in-parallel).\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe `mvtnorm` package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0 **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([6., 3., 7., 2., 4., 4., 7., 3., 3., 3., 4., 2., 2., 7., 5., 3., 2.,\n 2., 7., 6., 5., 3., 2., 4., 4.]), array([0.00987381, 0.04901322, 0.08815264, 0.12729206, 0.16643148,\n 0.2055709 , 0.24471031, 0.28384973, 0.32298915, 0.36212857,\n 0.40126798, 0.4404074 , 0.47954682, 0.51868624, 0.55782566,\n 0.59696507, 0.63610449, 0.67524391, 0.71438333, 0.75352274,\n 0.79266216, 0.83180158, 0.870941 , 0.91008042, 0.94921983,\n 0.98835925]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-pdf/unnamed-chunk-4-3.pdf){fig-pos='H'}\n:::\n:::\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n### Modern generators (PCG and Mersenne Twister)\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. \n\nBy default R uses something called the Mersenne twister, which is in the\nclass of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy also provides access to the Mersenne Twister via the MT19937 generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n#### Additional notes\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\nWhen one invokes a RNG without a seed, they generally have a method for\nchoosing a seed, often based on the system clock.\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\nWe can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister).\nWe can set the seed with `np.random.seed()` or with `np.random.default_rng()`. \n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nStrangely, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis unclear.\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`), which is\nconsidered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The seed for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]`.\n\nFor the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python\nor `set.seed()` in R, which then\nsets as many actual seeds as required for the Mersenne Twister. Here I'll\nrefer to the single integer passed in as *the* seed. Ideally,\nnearby seeds generally should not correspond to getting sequences from\nthe stream that are closer to each other than far away seeds. According\nto Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nSo we get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nIf we look at `saved_state`, we see it actually corresponds to the Mersenne\nTwister.\n\nTo do the equivalent with the PCG-64:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n`saved_state` contains the actual state and the value of `c`, the increment. \n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give a reasonable set of\nvalues. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. More details on parallel RNG\nare given in Unit 6.\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe *mvtnorm* package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0 **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([7., 4., 1., 5., 5., 5., 2., 6., 4., 2., 3., 5., 6., 1., 9., 7., 2.,\n 4., 1., 2., 4., 5., 1., 4., 5.]), array([0.02241438, 0.06135736, 0.10030034, 0.13924332, 0.17818631,\n 0.21712929, 0.25607227, 0.29501525, 0.33395824, 0.37290122,\n 0.4118442 , 0.45078718, 0.48973016, 0.52867315, 0.56761613,\n 0.60655911, 0.64550209, 0.68444508, 0.72338806, 0.76233104,\n 0.80127402, 0.840217 , 0.87915999, 0.91810297, 0.95704595,\n 0.99598893]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-pdf/unnamed-chunk-4-3.pdf){fig-pos='H'}\n:::\n:::\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n### PCG generators\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here.\n\n### Mersenne Twister\n\nA commonly used generator (including in both R and Python) is the Mersenne Twister.\nIt's the default in R and \"sort of\" the default in numpy (see next section for what I mean by \"sort of\").\n\nThe Mersenne Twister has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. (But note that O'Neal criticizes it in\n[her technical report](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf).) Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The state (sometimes also called the seed) for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]` in R and (I think) `np.random.get_state()[2]` in Python.\n\nThe Mersenne twister is in the class of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy provides access to the Mersenne Twister via the `MT19937` generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n### The period versus the number of unique values generated\n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThe result is that the generators generate fewer unique values than their periods.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$.\nWhy not? Bbecause the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n### The seed and the state\n\nSetting the seed picks a position in the periodic sequence of the RNG,\ni.e., in the state of the RNG. The state can be a single number or something\nmuch more complicated. As mentioned above, the state for the Mersenne Twister\nis a set of 624 32-bit integers plus a position in the set. For the PCG-64\nin numpy, the state is two numbers -- the actual state and the increment (`c` above).\nThis means that when the user passes a single number as the seed, there\nneeds to be a procedure that deterministically sets the state based on\nthat single number seed. The details of this are not usually well-documented\nor viewable by the user.\n\nIdeally, nearby seeds generally should not correspond to getting sequences from\nthe RNG stream that are closer to each other than far away seeds.\nAccording to Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nWhen one invokes a RNG without a seed, RNG implementations generally have a method for\nchoosing a seed (often based on the system clock). The numpy documentation\nsays that it \"mixes sources of entropy in a reproducible way\" to do this.\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\n#### Additional notes\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\n### Choosing a generator\n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nHowever, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis tricky.\n\nI think that this text from `help(np.random)` explains what is going on:\n\n```\n Legacy\n ------\n \n For backwards compatibility with previous versions of numpy before 1.17, the\n various aliases to the global `RandomState` methods are left alone and do not\n use the new `Generator` API.\n```\n\nWe can change to a specific RNG using syntax (the `Generator` API) like this:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.Generator(np.random.MT19937(seed = 1)) # Mersenne Twister\nrng = np.random.Generator(np.random.PCG64(seed = 1)) # PCG-64\n```\n:::\n\nbut below note that there is a simpler way to change to the PCG-64.\n\nThen to use that generator when doing operations that generate random numbers, we need\nto use methods accessed via the generator:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng.random.normal(size = 3) # Now generate based on chosen generator.\n## np.random.normal(size = 3) # This will NOT use the chosen generator.\n```\n:::\n\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`).\n\n### Using the Mersenne Twister\n\n\nIf we simply start using numpy or scipy to generate random numbers,\nwe'll be using the Mersenne Twister. I believe this is what the\ndocumentation mentioned above means by \"aliases to the global `RandomState` methods\".\n\nWe get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nIf we look at `saved_state`, we can confirm it actually corresponds to the Mersenne\nTwister.\n\n### Using PCG64\n\nTo use the PCG-64, we need to explicitly create and\nmake use of the `Generator` object (`rng` here), which is the new numpy\napproach to handling RNG.\n\nWe set the seed when setting up the generator via `np.random.default_rng(seed)`\n(or `np.random.Generator(np.random.PCG64(seed = 1))`).\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(seed = 1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nrng = np.random.default_rng(seed = 1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n`saved_state` contains the actual state and the value of `c`, the increment.\n\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give reasonable set of\npseudo-random values. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. Numpy now provides some nice functionality\nfor parallel RNG, with more details given in the [SCF parallelization tutorial](https://berkeley-scf.github.io/tutorial-parallelization/parallel-python#5-random-number-generation-rng-in-parallel).\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe `mvtnorm` package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0%Omh 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 avd3FXZydfH4MK{+U=JDpn)S literal 32379 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
    `nD)h^ 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 z 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 Wp<&)3VcT}u5{Uw-sU38%2K^655W6G* delta 3070 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 Ks-84I1^6GY(pRhi diff --git a/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-4-3.pdf b/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-4-3.pdf index 98efcd585820933011fb3be3b459bb1935f389cc..c547c00723fc77a94eedcf4ec5deeadfefc082b8 100644 GIT binary patch delta 6293 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 DgYENc delta 7229 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 diff --git a/publish.md b/publish.md index ea554f8..cc8778c 100644 --- a/publish.md +++ b/publish.md @@ -14,6 +14,8 @@ To set up the website for a new course/year, one needs to run `quarto publish` f Notes: +2023-10-25: Today (and on some past occasions), figures don't show up in the html because the relevant png files are not committed/being deleted from `units/unitX_files`. Manually adding to `gh-pages` works for a given commit but then later render/publish causes a `git rm` of the files. I think what may be the solution is to make sure not to do `git commit -am` if a `git rm` of the png files is staged. Instead just use `git add` on the various files and `git commit -m`. May also need to `git restore` the files to be deleted so that later `git commit -am'` doesn't cause deletion. + 2023-09-07: GHA can fail with messages about `nbformat`. Can often fix by re-rendering the problematic qmd. I think this is happening when commits are made to a qmd without rendering that updates the freeze files. 2023-08-29: when using `knitr` engine with `unit3-bash.qmd` (so that one can work with bash chunks), some GHA runs are complaining about missing `rmarkdown`. But then it sometimes works. Trying to install `rmarkdown` leads to a permission issue in the system directory that the R package is being installed into. If try to use `jupyter` engine with bash chunks, you probably need a Jupyter bash kernel, but I am still investigating. diff --git a/units/unit9-sim.qmd b/units/unit9-sim.qmd index f8072c5..0d9fc08 100644 --- a/units/unit9-sim.qmd +++ b/units/unit9-sim.qmd @@ -609,7 +609,7 @@ xyz[10, ] .Random.seed[2:4] ``` -### Modern generators (PCG and Mersenne Twister) +### PCG generators Somewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators. @@ -621,10 +621,27 @@ The idea of the PCG approach goes like this: Instead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above). -O'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. +O'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here. -By default R uses something called the Mersenne twister, which is in the -class of generalized feedback shift registers (GFSR). The basic idea of +### Mersenne Twister + +A commonly used generator (including in both R and Python) is the Mersenne Twister. +It's the default in R and "sort of" the default in numpy (see next section for what I mean by "sort of"). + +The Mersenne Twister has some theoretical support, +has performed reasonably on standard tests of pseudorandom numbers and +has been used without evidence of serious failure. (But note that O'Neal criticizes it in +[her technical report](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf).) Plus it's fast +(because bitwise operations are fast). The +particular Mersenne twister used has a periodicity of +$2^{19937}-1\approx10^{6000}$. Practically speaking this means that if +we generated one random uniform per nanosecond for 10 billion years, +then we would generate $10^{25}$ numbers, well short of the period. So +we don't need to worry about the periodicity! The state (sometimes also called the seed) for the Mersenne +twister is a set of 624 32-bit integers plus a position in the set, +where the position is `.Random.seed[2]` in R and (I think) `np.random.get_state()[2]` in Python. + +The Mersenne twister is in the class of generalized feedback shift registers (GFSR). The basic idea of a GFSR is to come up with a deterministic generator of bits (i.e., a way to generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\ldots$. The pseudo-random numbers are then determined as sequential subsequences of @@ -634,17 +651,51 @@ is generated by taking $B_{i}$ to be the *exclusive or* \[i.e., 0+0 = 0; 0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\] summation of two previous bits further back in the sequence where the lengths of the lags are carefully chosen. -numpy also provides access to the Mersenne Twister via the MT19937 generator; +numpy provides access to the Mersenne Twister via the `MT19937` generator; more on this below. It looks like PCG-64 only became available as of numpy version 1.17. -#### Additional notes +### The period versus the number of unique values generated + +The output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits. +The result is that the generators generate fewer unique values than their periods. +This means you could get duplicated values in long runs, but this does not violate the +comment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$. +Why not? Bbecause the two values after the two +duplicated numbers will not be duplicates of each other -- as noted previously, there is +a distinction between the output presented to the user and the state of +the RNG algorithm. + +### The seed and the state + +Setting the seed picks a position in the periodic sequence of the RNG, +i.e., in the state of the RNG. The state can be a single number or something +much more complicated. As mentioned above, the state for the Mersenne Twister +is a set of 624 32-bit integers plus a position in the set. For the PCG-64 +in numpy, the state is two numbers -- the actual state and the increment (`c` above). +This means that when the user passes a single number as the seed, there +needs to be a procedure that deterministically sets the state based on +that single number seed. The details of this are not usually well-documented +or viewable by the user. + +Ideally, nearby seeds generally should not correspond to getting sequences from +the RNG stream that are closer to each other than far away seeds. +According to Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer, +$i\in\{0,\ldots,1023\}$ , and each of these 1024 values produces +positions in the RNG sequence that are "far away" from each other. I +don't see any mention of this in the R documentation for `set.seed()` +and furthermore, you can pass integers larger than 1023 to `set.seed()`, +so I'm not sure how much to trust Gentle's claim. More on generating +parallel streams of random numbers below. + +When one invokes a RNG without a seed, RNG implementations generally have a method for +choosing a seed (often based on the system clock). The numpy documentation +says that it "mixes sources of entropy in a reproducible way" to do this. Generators should give you the same sequence of random numbers, starting at a given seed, whether you ask for a bunch of numbers at once, or sequentially ask for individual numbers. -When one invokes a RNG without a seed, they generally have a method for -choosing a seed, often based on the system clock. +#### Additional notes There have been some attempts to generate truly random numbers based on physical randomness. One that is based on quantum physics is @@ -653,47 +704,57 @@ Another approach is based on lava lamps! ## RNG in Python -We can change the RNG for numpy using `np.random.` (e.g., `np.random.MT19937` for the Mersenne Twister). -We can set the seed with `np.random.seed()` or with `np.random.default_rng()`. +### Choosing a generator In numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports advancing an arbitrary number of steps, as well as $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two 128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*). -Strangely, while the *default* is PCG-64, simply +However, while the *default* is PCG-64, simply using the functions available via `np.random` to generate random numbers seems to actually use the Mersenne Twister, so the meaning of *default* -is unclear. +is tricky. -In R, the default RNG is the Mersenne twister (`?RNGkind`), which is -considered to be state-of-the-art (by some; O'Neal criticizes it). It has some theoretical support, -has performed reasonably on standard tests of pseudorandom numbers and -has been used without evidence of serious failure. Plus it's fast -(because bitwise operations are fast). The -particular Mersenne twister used has a periodicity of -$2^{19937}-1\approx10^{6000}$. Practically speaking this means that if -we generated one random uniform per nanosecond for 10 billion years, -then we would generate $10^{25}$ numbers, well short of the period. So -we don't need to worry about the periodicity! The seed for the Mersenne -twister is a set of 624 32-bit integers plus a position in the set, -where the position is `.Random.seed[2]`. - -For the Mersenne Twister, we can set the seed by passing an integer to `np.random.seed()` in Python -or `set.seed()` in R, which then -sets as many actual seeds as required for the Mersenne Twister. Here I'll -refer to the single integer passed in as *the* seed. Ideally, -nearby seeds generally should not correspond to getting sequences from -the stream that are closer to each other than far away seeds. According -to Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer, -$i\in\{0,\ldots,1023\}$ , and each of these 1024 values produces -positions in the RNG sequence that are "far away" from each other. I -don't see any mention of this in the R documentation for `set.seed()` -and furthermore, you can pass integers larger than 1023 to `set.seed()`, -so I'm not sure how much to trust Gentle's claim. More on generating -parallel streams of random numbers below. +I think that this text from `help(np.random)` explains what is going on: + +``` + Legacy + ------ + + For backwards compatibility with previous versions of numpy before 1.17, the + various aliases to the global `RandomState` methods are left alone and do not + use the new `Generator` API. +``` + +We can change to a specific RNG using syntax (the `Generator` API) like this: + +```{python} +#| eval: false +rng = np.random.Generator(np.random.MT19937(seed = 1)) # Mersenne Twister +rng = np.random.Generator(np.random.PCG64(seed = 1)) # PCG-64 +``` +but below note that there is a simpler way to change to the PCG-64. + +Then to use that generator when doing operations that generate random numbers, we need +to use methods accessed via the generator: -So we get replicability by setting the seed to a specific value at the +```{python} +#| eval: false +rng.random.normal(size = 3) # Now generate based on chosen generator. +## np.random.normal(size = 3) # This will NOT use the chosen generator. +``` + +In R, the default RNG is the Mersenne twister (`?RNGkind`). + +### Using the Mersenne Twister + + +If we simply start using numpy or scipy to generate random numbers, +we'll be using the Mersenne Twister. I believe this is what the +documentation mentioned above means by "aliases to the global `RandomState` methods". + +We get replicability by setting the seed to a specific value at the beginning of our simulation. We can then set the seed to that same value when we want to replicate the simulation. @@ -725,13 +786,22 @@ np.random.set_state(saved_state) np.random.normal(size = 5) ``` -If we look at `saved_state`, we see it actually corresponds to the Mersenne +If we look at `saved_state`, we can confirm it actually corresponds to the Mersenne Twister. -To do the equivalent with the PCG-64: +### Using PCG64 + +To use the PCG-64, we need to explicitly create and +make use of the `Generator` object (`rng` here), which is the new numpy +approach to handling RNG. + +We set the seed when setting up the generator via `np.random.default_rng(seed)` +(or `np.random.Generator(np.random.PCG64(seed = 1))`). ```{python} -rng = np.random.default_rng(1) +rng = np.random.default_rng(seed = 1) +rng.normal(size = 5) +rng = np.random.default_rng(seed = 1) rng.normal(size = 5) saved_state = rng.bit_generator.state rng.normal(size = 5) @@ -744,25 +814,19 @@ saved_state['state']['state'] # actual state saved_state['state']['inc'] # increment ('c') ``` -`saved_state` contains the actual state and the value of `c`, the increment. +`saved_state` contains the actual state and the value of `c`, the increment. -The output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits. -This means you could get duplicated values in long runs, but this does not violate the -comment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$, because the two values after the two -duplicated numbers will not be duplicates of each other -- as noted previously, there is -a distinction between the output presented to the user and the state of -the RNG algorithm. ## RNG in parallel -We can generally rely on the RNG in Python and R to give a reasonable set of -values. One time when we want to think harder is when doing work with +We can generally rely on the RNG in Python and R to give reasonable set of +pseudo-random values. One time when we want to think harder is when doing work with RNG in parallel on multiple processors. The worst thing that could happen is that one sets things up in such a way that every process is using the same sequence of random numbers. This could happen if you mistakenly set the same seed in each process, e.g., using -`np.random.seed(1)` on every process. More details on parallel RNG -are given in Unit 6. +`np.random.seed(1)` on every process. Numpy now provides some nice functionality +for parallel RNG, with more details given in the [SCF parallelization tutorial](https://berkeley-scf.github.io/tutorial-parallelization/parallel-python#5-random-number-generation-rng-in-parallel). # 5. Generating random variables @@ -776,7 +840,7 @@ two gamma RVs. ## Multivariate distributions -The *mvtnorm* package supplies code for working with the density and CDF +The `mvtnorm` package supplies code for working with the density and CDF of multivariate normal and t distributions. To generate a multivariate normal, in Unit 10, we'll see the standard diff --git a/units/unit9-sim_files/figure-html/unnamed-chunk-11-1.png b/units/unit9-sim_files/figure-html/unnamed-chunk-11-1.png deleted file mode 100644 index 0fdcae23311954dc32f21b40f3da2722aac5ff2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30386 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 z 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 From d3bee90b472338fb6e0a9cb598fe435520986b88 Mon Sep 17 00:00:00 2001 From: Christopher Paciorek Date: Thu, 26 Oct 2023 09:00:42 -0700 Subject: [PATCH 09/17] more monkeying with unit 9 files --- .../unit10-linalg/execute-results/html.json | 4 ++-- .../unit10-linalg/execute-results/tex.json | 4 ++-- .../units/unit9-sim/execute-results/html.json | 4 ++-- .../units/unit9-sim/execute-results/tex.json | 4 ++-- .../figure-html/unnamed-chunk-2-1.png | Bin 26141 -> 31984 bytes .../figure-html/unnamed-chunk-4-3.png | Bin 228748 -> 231099 bytes .../figure-pdf/unnamed-chunk-2-1.pdf | Bin 9306 -> 9409 bytes .../figure-pdf/unnamed-chunk-4-3.pdf | Bin 14647 -> 15777 bytes units/unit10-linalg.qmd | 7 +------ units/unit9-sim.qmd | 11 ++++++----- 10 files changed, 15 insertions(+), 19 deletions(-) diff --git a/_freeze/units/unit10-linalg/execute-results/html.json b/_freeze/units/unit10-linalg/execute-results/html.json index 68206d1..11dd2ac 100644 --- a/_freeze/units/unit10-linalg/execute-results/html.json +++ b/_freeze/units/unit10-linalg/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "0898502e36877c05b5b0f84a868d5a42", + "hash": "85895c476ef2aa6db9939ce3c30a8407", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n::: {.cell}\n\n:::\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $z = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-2.220446049250313e-16\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.881784197001252e-16\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/units/unit10-linalg/execute-results/tex.json b/_freeze/units/unit10-linalg/execute-results/tex.json index 966bac9..2daf253 100644 --- a/_freeze/units/unit10-linalg/execute-results/tex.json +++ b/_freeze/units/unit10-linalg/execute-results/tex.json @@ -1,7 +1,7 @@ { - "hash": "0898502e36877c05b5b0f84a868d5a42", + "hash": "85895c476ef2aa6db9939ce3c30a8407", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n::: {.cell}\n\n:::\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $z = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n5.551115123125783e-16\n```\n:::\n:::\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-8.881784197001252e-16\n```\n:::\n:::\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/units/unit9-sim/execute-results/html.json b/_freeze/units/unit9-sim/execute-results/html.json index 9d29b60..f5a9ab3 100644 --- a/_freeze/units/unit9-sim/execute-results/html.json +++ b/_freeze/units/unit9-sim/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "1360e4a939e0518dd97d256a882c8c9a", + "hash": "7728f8fb10a624f11bd93a3d333f1114", "result": { - "markdown": "---\ntitle: \"Simulation\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-17\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\n---\n\n::: {.cell}\n\n:::\n\n\n\n[PDF](./unit9-sim.pdf){.btn .btn-primary}\n\n\nReferences:\n\n- Gentle: Computational Statistics\n- Monahan: Numerical Methods of Statistics\n\nMany (most?) statistical papers include a simulation (i.e., Monte Carlo)\nstudy. Many papers on machine learning methods also include a simulation\nstudy. The basic idea is that closed-form mathematical analysis of the properties of\na statistical or machine learning method/model is often hard to do. Even\nif possible, it usually involves approximations or simplifications. A\ncanonical situation in statistics is that we have an asymptotic result\nand we want to know what happens in finite samples, but often we do not\neven have the asymptotic result. Instead, we can estimate mathematical\nexpressions using random numbers. So we design a simulation study to\nevaluate the method/model or compare multiple methods. The result is\nthat the researcher carries out an experiment (on the computer, sometimes called *in silico*), generally varying\ndifferent factors to see what has an effect on the outcome of interest.\n\nThe basic strategy generally involves simulating data and then using the\nmethod(s) on the simulated data, summarizing the results to\nassess/compare the method(s).\n\nMost simulation studies aim to approximate an integral, generally an\nexpected value (mean, bias, variance, MSE, probability, etc.). In low\ndimensions, methods such as Gaussian quadrature are best for estimating\nan integral but these methods don't scale well, so in higher dimensions (e.g., the usual situation with $n$ observations) we\noften use Monte Carlo techniques.\n\nTo be more concrete:\n\n- If we have a *method for estimating a model parameter* (including\n estimating uncertainty), such as a regression coefficient, what properties do\n we want the method to have and what criteria could we use?\n\n- If we have a *prediction method* (including prediction uncertainty),\n what properties do we want the method to have and what criteria\n could we use?\n\n- If we have a *method for doing a hypothesis test*, what criteria\n would we use to assess the hypothesis test? What properties do we\n want the test to have?\n\n- If we have a *method for finding a confidence interval or a prediction interval*, what\n criteria would we use to assess the interval?\n\n\n# 1. Monte Carlo considerations\n\n## Motivating example\n\nLet's consider linear regression, with observations\n$Y=(y_{1},y_{2},\\ldots,y_{n})$ and an $n\\times p$ matrix of predictors/covariates/features/variables\n$X$, where\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. If we assume that we have\n$EY=X\\beta$ and $\\mbox{Var}(Y)=\\sigma^{2}I$, then we can determine\nanalytically that we have $$\\begin{aligned}\nE\\hat{\\beta} & = & \\beta\\\\\n\\mbox{Var}(\\hat{\\beta})=E((\\hat{\\beta}-E\\hat{\\beta})^{2}) & = & \\sigma^{2}(X^{\\top}X)^{-1}\\\\\n\\mbox{MSPE}(Y^{*})=E(Y^{*}-\\hat{Y})^{2}) & = & \\sigma^{2}(1+X^{*\\top}(X^{\\top}X)^{-1}X^{*}).\\end{aligned}$$\nwhere $Y^{*}$is some new observation we'd like to predict given $X^{*}$.\n\nBut suppose that we're interested in the properties of standard regression\nestimation when in reality the mean is not linear in $X$ or the\nproperties of the errors are more complicated than having independent\nhomoscedastic errors. (This is always the case, but the issue is how far\nfrom the truth the standard assumptions are.) Or suppose we have a modified procedure to produce\n$\\hat{\\beta}$, such as a procedure that is robust to outliers. In those\ncases, we cannot compute the expectations above analytically.\n\nInstead we decide to use a Monte Carlo estimate. To keep the notation\nmore simple, let's just consider one element of the vector $\\beta$\n(i.e., one of the regression coefficients) and continue to call that\n$\\beta$. If we randomly generate $m$ different datasets from some\ndistribution $f$, and $\\hat{\\beta}_{i}$ is the estimated coefficient\nbased on the $i$th dataset: $Y_{i}=(y_{i1},y_{i2},\\ldots,y_{in})$, then\nwe can estimate $E\\hat{\\beta}$ under that distribution $f$ as\n$$\\hat{E}(\\hat{\\beta})=\\bar{\\hat{\\beta}}=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}$$\nOr to estimate the variance, we have\n$$\\widehat{\\mbox{Var}}(\\hat{\\beta})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-\\bar{\\hat{\\beta}})^{2}.$$\nIn evaluating the performance of regression under non-standard\nconditions or the performance of our robust regression procedure, what\ndecisions do we have to make to be able to carry out our Monte Carlo\nprocedure?\n\nNext let's think about Monte Carlo methods in general.\n\n## Monte Carlo (MC) basics\n\n### Monte Carlo overview\n\nThe basic idea is that we often want to estimate\n$\\phi\\equiv E_{f}(h(Y))$ for $Y\\sim f$. Note that if $h$ is an indicator\nfunction, this includes estimation of probabilities, e.g., for a scalar\n$Y$, we have\n$p=P(Y\\leq y)=F(y)=\\int_{-\\infty}^{y}f(t)dt=\\int I(t\\leq y)f(t)dt=E_{f}(I(Y\\leq y))$.\nWe would estimate variances or MSEs by having $h$ involve squared terms.\n\nWe get an MC estimate of $\\phi$ based on an iid sample of a large number\nof values of $Y$ from $f$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i}),$$ which is justified by\nthe Law of Large Numbers:\n$$\\lim_{m\\to\\infty}\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=E_{f}h(Y).$$\n\nNote that in most simulation studies, $Y$ is an entire dataset (predictors/covariates), and the \"iid\nsample\" means generating $m$ different datasets from $f$, i.e.,\n$Y_{i}\\in\\{Y_{1},\\ldots,Y_{m}\\}$ not $m$ different scalar values. If the\ndataset has $n$ observations, then $Y_{i}=(Y_{i1},\\ldots,Y_{in})$.\n\n#### Back to the regression example\n\nLet's relate that back to our regression example. In that particular\ncase, if we're interested in whether the regression estimator is biased,\nwe want to know: $$\\phi=E\\hat{\\beta},$$ where $h(Y) = \\hat{\\beta}(Y)$. We can use the Monte Carlo\nestimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}\\hat{\\beta}_{i}=\\widehat{E(\\hat{\\beta})}.$$\n\nIf we are interested in the variance of the regression estimator, we have\n\n$$\\phi=\\mbox{Var}(\\hat{\\beta})=E_{f}((\\hat{\\beta}-E\\hat{\\beta})^{2})$$\nand we can use the Monte Carlo estimate of $\\phi$:\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}h(Y_{i})=\\frac{1}{m}\\sum_{i=1}^{m}(\\hat{\\beta}_{i}-E\\hat{\\beta})^{2}=\\widehat{\\mbox{Var}(\\hat{\\beta)}}$$\nwhere $$h(Y)=(\\hat{\\beta}-E\\hat{\\beta})^{2}.$$\n\nFinally note that we also need to use the Monte Carlo estimate of\n$E\\hat{\\beta}$ in the Monte Carlo estimation of the variance.\n\nWe might also be interested in the coverage of a confidence interval. In\nthat case we have $$h(Y)=1_{\\beta\\in CI(Y)}$$ and we can estimate the\ncoverage as\n$$\\hat{\\phi}=\\frac{1}{m}\\sum_{i=1}^{m}1_{\\beta\\in CI(y_{i})}.$$\nOf course we want that $\\hat{\\phi}\\approx1-\\alpha$ for a $100(1-\\alpha)$\nconfidence interval. In the standard case of a 95% interval we want\n$\\hat{\\phi}\\approx0.95$.\n\n### Simulation uncertainty (i.e., Monte Carlo uncertainty)\n\nSince $\\hat{\\phi}$ is simply an average of $m$ identically-distributed\nvalues, $h(Y_{1}),\\ldots,h(Y_{m})$, the simulation variance of\n$\\hat{\\phi}$ is $\\mbox{Var}(\\hat{\\phi})=\\sigma^{2}/m$, with\n$\\sigma^{2}=\\mbox{Var}(h(Y))$. An estimator of\n$\\sigma^{2}=E_{f}((h(Y)-\\phi)^{2})$ is $$\\begin{aligned}\n\\hat{\\sigma}^{2} & = & \\frac{1}{m-1}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}\\end{aligned}$$\nSo our MC simulation error is based on\n$$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\frac{\\hat{\\sigma}^{2}}{m}=\\frac{1}{m(m-1)}\\sum_{i=1}^{m}(h(Y_{i})-\\hat{\\phi})^{2}.$$\nNote that this is particularly confusing if we have\n$\\hat{\\phi}=\\widehat{\\mbox{Var}(\\hat{\\beta})}$ because then we have\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})=\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$!\n\nThe simulation variance is $O(\\frac{1}{m})$ because we have $m^{2}$ in\nthe denominator and a sum over $m$ terms in the numerator.\n\nNote that in the simulation setting, the randomness in the system is\nvery well-defined (as it is in survey sampling, but unlike in most other\napplications of statistics), because it comes from the RNG that we\nperform as part of our attempt to estimate $\\phi$. Happily, we are in\ncontrol of $m$, so in principle we can reduce the simulation error to as\nlittle as we desire. Unhappily, as usual, the simulation standard error goes down\nwith the square root of $m$.\n\n> **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([5., 5., 5., 5., 3., 3., 6., 4., 5., 2., 3., 6., 4., 3., 8., 6., 2.,\n 2., 3., 4., 2., 3., 6., 0., 5.]), array([0.00250736, 0.04226924, 0.08203112, 0.12179301, 0.16155489,\n 0.20131677, 0.24107866, 0.28084054, 0.32060242, 0.36036431,\n 0.40012619, 0.43988807, 0.47964995, 0.51941184, 0.55917372,\n 0.5989356 , 0.63869749, 0.67845937, 0.71822125, 0.75798314,\n 0.79774502, 0.8375069 , 0.87726879, 0.91703067, 0.95679255,\n 0.99655443]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-html/unnamed-chunk-4-3.png){width=960}\n:::\n:::\n\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n\n### PCG generators\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here.\n\n### Mersenne Twister\n\nA commonly used generator (including in both R and Python) is the Mersenne Twister.\nIt's the default in R and \"sort of\" the default in numpy (see next section for what I mean by \"sort of\").\n\nThe Mersenne Twister has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. (But note that O'Neal criticizes it in\n[her technical report](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf).) Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The state (sometimes also called the seed) for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]` in R and (I think) `np.random.get_state()[2]` in Python.\n\nThe Mersenne twister is in the class of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy provides access to the Mersenne Twister via the `MT19937` generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n### The period versus the number of unique values generated\n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThe result is that the generators generate fewer unique values than their periods.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$.\nWhy not? Bbecause the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n### The seed and the state\n\nSetting the seed picks a position in the periodic sequence of the RNG,\ni.e., in the state of the RNG. The state can be a single number or something\nmuch more complicated. As mentioned above, the state for the Mersenne Twister\nis a set of 624 32-bit integers plus a position in the set. For the PCG-64\nin numpy, the state is two numbers -- the actual state and the increment (`c` above).\nThis means that when the user passes a single number as the seed, there\nneeds to be a procedure that deterministically sets the state based on\nthat single number seed. The details of this are not usually well-documented\nor viewable by the user.\n\nIdeally, nearby seeds generally should not correspond to getting sequences from\nthe RNG stream that are closer to each other than far away seeds.\nAccording to Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nWhen one invokes a RNG without a seed, RNG implementations generally have a method for\nchoosing a seed (often based on the system clock). The numpy documentation\nsays that it \"mixes sources of entropy in a reproducible way\" to do this.\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\n#### Additional notes\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\n### Choosing a generator\n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nHowever, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis tricky.\n\nI think that this text from `help(np.random)` explains what is going on:\n\n```\n Legacy\n ------\n \n For backwards compatibility with previous versions of numpy before 1.17, the\n various aliases to the global `RandomState` methods are left alone and do not\n use the new `Generator` API.\n```\n\nWe can change to a specific RNG using syntax (the `Generator` API) like this:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.Generator(np.random.MT19937(seed = 1)) # Mersenne Twister\nrng = np.random.Generator(np.random.PCG64(seed = 1)) # PCG-64\n```\n:::\n\n\nbut below note that there is a simpler way to change to the PCG-64.\n\nThen to use that generator when doing operations that generate random numbers, we need\nto use methods accessed via the generator:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng.random.normal(size = 3) # Now generate based on chosen generator.\n## np.random.normal(size = 3) # This will NOT use the chosen generator.\n```\n:::\n\n\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`).\n\n### Using the Mersenne Twister\n\n\nIf we simply start using numpy or scipy to generate random numbers,\nwe'll be using the Mersenne Twister. I believe this is what the\ndocumentation mentioned above means by \"aliases to the global `RandomState` methods\".\n\nWe get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nIf we look at `saved_state`, we can confirm it actually corresponds to the Mersenne\nTwister.\n\n### Using PCG64\n\nTo use the PCG-64, we need to explicitly create and\nmake use of the `Generator` object (`rng` here), which is the new numpy\napproach to handling RNG.\n\nWe set the seed when setting up the generator via `np.random.default_rng(seed)`\n(or `np.random.Generator(np.random.PCG64(seed = 1))`).\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(seed = 1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nrng = np.random.default_rng(seed = 1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n\n`saved_state` contains the actual state and the value of `c`, the increment.\n\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give reasonable set of\npseudo-random values. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. Numpy now provides some nice functionality\nfor parallel RNG, with more details given in the [SCF parallelization tutorial](https://berkeley-scf.github.io/tutorial-parallelization/parallel-python#5-random-number-generation-rng-in-parallel).\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe `mvtnorm` package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0 **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\hat{E}(\\hat{\\beta})-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}}(\\hat{\\beta}))$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}}(Y^{*}))$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([3., 5., 7., 2., 4., 3., 7., 5., 3., 5., 5., 5., 1., 4., 4., 4., 5.,\n 3., 8., 0., 4., 2., 1., 2., 8.]), array([0.0049552 , 0.04468369, 0.08441218, 0.12414066, 0.16386915,\n 0.20359764, 0.24332612, 0.28305461, 0.3227831 , 0.36251159,\n 0.40224007, 0.44196856, 0.48169705, 0.52142553, 0.56115402,\n 0.60088251, 0.640611 , 0.68033948, 0.72006797, 0.75979646,\n 0.79952494, 0.83925343, 0.87898192, 0.91871041, 0.95843889,\n 0.99816738]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-html/unnamed-chunk-4-3.png){width=960}\n:::\n:::\n\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n\n### PCG generators\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here.\n\n### Mersenne Twister\n\nA commonly used generator (including in both R and Python) is the Mersenne Twister.\nIt's the default in R and \"sort of\" the default in numpy (see next section for what I mean by \"sort of\").\n\nThe Mersenne Twister has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. (But note that O'Neal criticizes it in\n[her technical report](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf).) Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The state (sometimes also called the seed) for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]` in R and (I think) `np.random.get_state()[2]` in Python.\n\nThe Mersenne twister is in the class of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy provides access to the Mersenne Twister via the `MT19937` generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n### The period versus the number of unique values generated\n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThe result is that the generators generate fewer unique values than their periods.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$.\nWhy not? Because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n### The seed and the state\n\nSetting the seed picks a position in the periodic sequence of the RNG,\ni.e., in the state of the RNG. The state can be a single number or something\nmuch more complicated. As mentioned above, the state for the Mersenne Twister\nis a set of 624 32-bit integers plus a position in the set. For the PCG-64\nin numpy, the state is two numbers -- the actual state and the increment (`c` above).\nThis means that when the user passes a single number as the seed, there\nneeds to be a procedure that deterministically sets the state based on\nthat single number seed. The details of this are not usually well-documented\nor viewable by the user.\n\nIdeally, nearby seeds generally should not correspond to getting sequences from\nthe RNG stream that are closer to each other than far away seeds.\nAccording to Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nWhen one invokes a RNG without a seed, RNG implementations generally have a method for\nchoosing a seed (often based on the system clock). The numpy documentation\nsays that it \"mixes sources of entropy in a reproducible way\" to do this.\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\n#### Additional notes\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\n### Choosing a generator\n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nHowever, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis tricky.\n\nI think that this text from `help(np.random)` explains what is going on:\n\n```\n Legacy\n ------\n \n For backwards compatibility with previous versions of numpy before 1.17, the\n various aliases to the global `RandomState` methods are left alone and do not\n use the new `Generator` API.\n```\n\nWe can change to a specific RNG using syntax (the `Generator` API) like this:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.Generator(np.random.MT19937(seed = 1)) # Mersenne Twister\nrng = np.random.Generator(np.random.PCG64(seed = 1)) # PCG-64\n```\n:::\n\n\nbut below note that there is a simpler way to change to the PCG-64.\n\nThen to use that generator when doing operations that generate random numbers, we need\nto use methods accessed via the `Generator` object (`rng` here):\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng.random.normal(size = 3) # Now generate based on chosen generator.\n## np.random.normal(size = 3) # This will NOT use the chosen generator.\n```\n:::\n\n\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`).\n\n### Using the Mersenne Twister\n\n\nIf we simply start using numpy or scipy to generate random numbers,\nwe'll be using the Mersenne Twister. I believe this is what the\ndocumentation mentioned above means by \"aliases to the global `RandomState` methods\".\n\nWe get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\n\nIf we look at `saved_state`, we can confirm it actually corresponds to the Mersenne\nTwister.\n\n### Using PCG64\n\nTo use the PCG-64, we need to explicitly create and\nmake use of the `Generator` object (`rng` here), which is the new numpy\napproach to handling RNG.\n\nWe set the seed when setting up the generator via `np.random.default_rng(seed)`\n(or `np.random.Generator(np.random.PCG64(seed = 1))`).\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(seed = 1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nrng = np.random.default_rng(seed = 1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n\n`saved_state` contains the actual state and the value of `c`, the increment.\n\nQuestion: how many bits does `saved_state['state']['state']` correspond to?\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give reasonable set of\npseudo-random values. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. Numpy now provides some nice functionality\nfor parallel RNG, with more details given in the [SCF parallelization tutorial](https://berkeley-scf.github.io/tutorial-parallelization/parallel-python#5-random-number-generation-rng-in-parallel).\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe `mvtnorm` package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0 **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\widehat{E(\\hat{\\beta})}-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}(\\hat{\\beta})})$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}(Y^{*})})$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([7., 4., 1., 5., 5., 5., 2., 6., 4., 2., 3., 5., 6., 1., 9., 7., 2.,\n 4., 1., 2., 4., 5., 1., 4., 5.]), array([0.02241438, 0.06135736, 0.10030034, 0.13924332, 0.17818631,\n 0.21712929, 0.25607227, 0.29501525, 0.33395824, 0.37290122,\n 0.4118442 , 0.45078718, 0.48973016, 0.52867315, 0.56761613,\n 0.60655911, 0.64550209, 0.68444508, 0.72338806, 0.76233104,\n 0.80127402, 0.840217 , 0.87915999, 0.91810297, 0.95704595,\n 0.99598893]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-pdf/unnamed-chunk-4-3.pdf){fig-pos='H'}\n:::\n:::\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n### PCG generators\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here.\n\n### Mersenne Twister\n\nA commonly used generator (including in both R and Python) is the Mersenne Twister.\nIt's the default in R and \"sort of\" the default in numpy (see next section for what I mean by \"sort of\").\n\nThe Mersenne Twister has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. (But note that O'Neal criticizes it in\n[her technical report](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf).) Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The state (sometimes also called the seed) for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]` in R and (I think) `np.random.get_state()[2]` in Python.\n\nThe Mersenne twister is in the class of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy provides access to the Mersenne Twister via the `MT19937` generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n### The period versus the number of unique values generated\n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThe result is that the generators generate fewer unique values than their periods.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$.\nWhy not? Bbecause the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n### The seed and the state\n\nSetting the seed picks a position in the periodic sequence of the RNG,\ni.e., in the state of the RNG. The state can be a single number or something\nmuch more complicated. As mentioned above, the state for the Mersenne Twister\nis a set of 624 32-bit integers plus a position in the set. For the PCG-64\nin numpy, the state is two numbers -- the actual state and the increment (`c` above).\nThis means that when the user passes a single number as the seed, there\nneeds to be a procedure that deterministically sets the state based on\nthat single number seed. The details of this are not usually well-documented\nor viewable by the user.\n\nIdeally, nearby seeds generally should not correspond to getting sequences from\nthe RNG stream that are closer to each other than far away seeds.\nAccording to Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nWhen one invokes a RNG without a seed, RNG implementations generally have a method for\nchoosing a seed (often based on the system clock). The numpy documentation\nsays that it \"mixes sources of entropy in a reproducible way\" to do this.\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\n#### Additional notes\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\n### Choosing a generator\n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nHowever, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis tricky.\n\nI think that this text from `help(np.random)` explains what is going on:\n\n```\n Legacy\n ------\n \n For backwards compatibility with previous versions of numpy before 1.17, the\n various aliases to the global `RandomState` methods are left alone and do not\n use the new `Generator` API.\n```\n\nWe can change to a specific RNG using syntax (the `Generator` API) like this:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.Generator(np.random.MT19937(seed = 1)) # Mersenne Twister\nrng = np.random.Generator(np.random.PCG64(seed = 1)) # PCG-64\n```\n:::\n\nbut below note that there is a simpler way to change to the PCG-64.\n\nThen to use that generator when doing operations that generate random numbers, we need\nto use methods accessed via the generator:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng.random.normal(size = 3) # Now generate based on chosen generator.\n## np.random.normal(size = 3) # This will NOT use the chosen generator.\n```\n:::\n\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`).\n\n### Using the Mersenne Twister\n\n\nIf we simply start using numpy or scipy to generate random numbers,\nwe'll be using the Mersenne Twister. I believe this is what the\ndocumentation mentioned above means by \"aliases to the global `RandomState` methods\".\n\nWe get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nIf we look at `saved_state`, we can confirm it actually corresponds to the Mersenne\nTwister.\n\n### Using PCG64\n\nTo use the PCG-64, we need to explicitly create and\nmake use of the `Generator` object (`rng` here), which is the new numpy\napproach to handling RNG.\n\nWe set the seed when setting up the generator via `np.random.default_rng(seed)`\n(or `np.random.Generator(np.random.PCG64(seed = 1))`).\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(seed = 1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nrng = np.random.default_rng(seed = 1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n`saved_state` contains the actual state and the value of `c`, the increment.\n\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give reasonable set of\npseudo-random values. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. Numpy now provides some nice functionality\nfor parallel RNG, with more details given in the [SCF parallelization tutorial](https://berkeley-scf.github.io/tutorial-parallelization/parallel-python#5-random-number-generation-rng-in-parallel).\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe `mvtnorm` package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0 **Important**: This is the uncertainty in our simulation-based estimate\nof some quantity (expectation) of interest. It is NOT the statistical uncertainty in a problem.\n\n#### Back to the regression example\n\nSome examples of simulation variances we might be interested in in the\nregression example include:\n\n- Uncertainty in our estimate of bias:\n $\\widehat{\\mbox{Var}}(\\hat{E}(\\hat{\\beta})-\\beta)$.\n\n- Uncertainty in the estimated variance of the estimated coefficient:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{Var}}(\\hat{\\beta}))$.\n\n- Uncertainty in the estimated mean square prediction error:\n $\\widehat{\\mbox{Var}}(\\widehat{\\mbox{MSPE}}(Y^{*}))$.\n\nIn all cases we have to estimate the simulation variance, hence the\n$\\widehat{\\mbox{Var}}()$ notation.\n\n### Final notes\n\nSometimes the $Y_{i}$ are generated in a dependent fashion (e.g.,\nsequential MC or MCMC), in which case this variance estimator,\n$\\widehat{\\mbox{Var}}(\\hat{\\phi})$ does not hold because the samples are\nnot IID, but the estimator $\\hat{\\phi}$ is still a valid, unbiased\nestimator of $\\phi$.\n\n## Variance reduction (optional)\n\nThere are some tools for variance reduction in MC settings. One is\nimportance sampling (see Section 3). Others are the use of control\nvariates and antithetic sampling. I haven't personally run across these\nlatter in practice, so I'm not sure how widely used they are and won't\ngo into them here.\n\nIn some cases we can set up natural strata, for which we know the\nprobability of being in each stratum. Then we would estimate $\\mu$ for\neach stratum and combine the estimates based on the probabilities. The\nintuition is that we remove the variability in sampling amongst the\nstrata from our simulation.\n\nAnother strategy that comes up in MCMC contexts is\n*Rao-Blackwellization*. Suppose we want to know $E(h(X))$ where\n$X=\\{X_{1},X_{2}\\}$. Iterated expectation tells us that\n$E(h(X))=E(E(h(X)|X_{2})$. If we can compute\n$E(h(X)|X_{2})=\\int h(x_{1},x_{2})f(x_{1}|x_{2})dx_{1}$ then we should\navoid introducing stochasticity related to the $X_{1}$ draw (since we\ncan analytically integrate over that) and only average over\nstochasticity from the $X_{2}$ draw by estimating\n$E_{X_{2}}(E(h(X)|X_{2})$. The estimator is\n$$\\hat{\\mu}_{RB}=\\frac{1}{m}\\sum_{i=1}^{m}E(h(X)|X_{2,i})$$ where we\neither draw from the marginal distribution of $X_{2}$, or equivalently,\ndraw $X$, but only use $X_{2}$. Our MC estimator averages over the\nsimulated values of $X_{2}$. This is called Rao-Blackwellization because\nit relates to the idea of conditioning on a sufficient statistic. It has\nlower variance because the variance of each term in the sum of the\nRao-Blackwellized estimator is $\\mbox{Var}(E(h(X)|X_{2})$, which is less\nthan the variance in the usual MC estimator, $\\mbox{Var}(h(X))$, based\non the usual iterated variance formula:\n$V(X)=E(V(X|Y))+V(E(X|Y))\\Rightarrow V(E(X|Y)))\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.subplot(2, 2, 4)\nplt.hist(uFromNP, bins=25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(array([5., 2., 3., 1., 6., 5., 3., 3., 3., 2., 6., 3., 5., 7., 4., 3., 3.,\n 4., 3., 5., 6., 4., 3., 5., 6.]), array([0.03311289, 0.07157103, 0.11002917, 0.14848731, 0.18694544,\n 0.22540358, 0.26386172, 0.30231986, 0.340778 , 0.37923614,\n 0.41769427, 0.45615241, 0.49461055, 0.53306869, 0.57152683,\n 0.60998496, 0.6484431 , 0.68690124, 0.72535938, 0.76381752,\n 0.80227565, 0.84073379, 0.87919193, 0.91765007, 0.95610821,\n 0.99456635]), )\n```\n:::\n\n```{.python .cell-code}\nplt.xlabel(\"Value\"); plt.ylabel(\"Frequency\")\n\nplt.tight_layout()\nplt.show()\n```\n\n::: {.cell-output-display}\n![](unit9-sim_files/figure-pdf/unnamed-chunk-4-3.pdf){fig-pos='H'}\n:::\n:::\n\n\nA wide variety of different RNG have been proposed. Many have turned out\nto have substantial defects based on tests designed to assess if the\nbehavior of the RNG mimics true randomness. Some of the behavior we want\nto ensure is uniformity of each individual random deviate, independence\nof sequences of deviates, and multivariate uniformity of subsequences.\nOne test of a RNG that many RNGs don't perform well on is to assess the\nproperties of $k$-tuples - subsequences of length $k$, which should be\nindependently distributed in the $k$-dimensional unit hypercube.\nUnfortunately, linear congruential methods produce values that lie on a\nsimple lattice in $k$-space, i.e., the points are not selected from\n$q^{k}$ uniformly spaced points, where $q$ is the the number of unique\nvalues. Instead, points often lie on parallel lines in the hypercube.\n\nCombining generators can yield better generators. The Wichmann-Hill is\nan option in R and is a combination of three linear congruential\ngenerators with $a=\\{171,172,170\\}$, $m=\\{30269,30307,30323\\}$, and\n$u_{i}=(x_{i}/30269+y_{i}/30307+z_{i}/30323)\\mbox{mod}\\,1$ where $x$,\n$y$, and $z$ are generated from the three individual generators. Let's\nmimic the Wichmann-Hill manually:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nRNGkind(\"Wichmann-Hill\")\nset.seed(1)\nsaveSeed <- .Random.seed\nuFromR <- runif(10)\na <- c(171, 172, 170)\nm <- c(30269, 30307, 30323)\nxyz <- matrix(NA, nr = 10, nc = 3)\nxyz[1, ] <- (a * saveSeed[2:4]) %% m\nfor( i in 2:10)\n\txyz[i, ] <- (a * xyz[i-1, ]) %% m\nfor(i in 1:10)\n\tprint(c(uFromR[i],sum(xyz[i, ]/m)%%1))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1297134 0.1297134\n[1] 0.9822407 0.9822407\n[1] 0.8267184 0.8267184\n[1] 0.242355 0.242355\n[1] 0.8568853 0.8568853\n[1] 0.8408788 0.8408788\n[1] 0.3421633 0.3421633\n[1] 0.7062672 0.7062672\n[1] 0.6212432 0.6212432\n[1] 0.6537663 0.6537663\n```\n:::\n\n```{.r .cell-code}\n## we should be able to recover the current value of the seed\nxyz[10, ]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n\n```{.r .cell-code}\n.Random.seed[2:4]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 24279 14851 10966\n```\n:::\n:::\n\n\n### PCG generators\n\nSomewhat recently [O'Neal (2014) proposed a new approach](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf) to using the linear congruential generator in a way that gives much better performance than the basic versions of such generators described above. This approach is now the default random number generator in numpy (see `numpy.random.default_rng()`), called the [PCG-64 generator](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64). 'PCG' stands for permutation congruential generator and encompasses a family of such generators.\n\nThe idea of the PCG approach goes like this:\n\n - Linear congruential generators (LCG) are simple and fast, but for small values of $m$ don't perform all that well statistically, in particular having values on a lattice as discussed above.\n - Using a large value of $m$ can actually give good statistical performance.\n - Applying a technique called *permutation functions* to the state of the LCG in order to produce the output at each step (the random value returned to the user) can improve the statistical performance even further.\n\nInstead of using relatively small values of $m$ seen above, in the PCG approach one uses $m=2^k$, for 'large enough' $k$, usually 64 or 128. It turns out that if $m=2^k$ then the period of the $b$th bit of the state is $2^b$ where $b=1$ is the right-most bit. Small periods are of course bad for RNG, so the bits with small period cause the LCG to not perform well. Thankfully, one simple fix is simply to discard some number of the right-most bits (this is one form of *bit shift*). Note that if one does this, the output of the RNG is based on a subset of the bits, which means that the number of unique values that can be generated is smaller than the period. This is not a problem given we start with a state with a large number of bits (64 or 128 as mentioned above).\n\nO'Neal then goes further; instead of simply discarding bits, she proposes to either shift bits by a random amount or rotate bits by a random amount, where the random amount is determined by a small number of the initial bits. This improves the statistical performance of the generator. The choice of how to do this gives the various members of the PCG family of generators. The details are fairly complicated (the PCG paper is 50-odd pages) and not important for our purposes here.\n\n### Mersenne Twister\n\nA commonly used generator (including in both R and Python) is the Mersenne Twister.\nIt's the default in R and \"sort of\" the default in numpy (see next section for what I mean by \"sort of\").\n\nThe Mersenne Twister has some theoretical support,\nhas performed reasonably on standard tests of pseudorandom numbers and\nhas been used without evidence of serious failure. (But note that O'Neal criticizes it in\n[her technical report](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf).) Plus it's fast\n(because bitwise operations are fast). The\nparticular Mersenne twister used has a periodicity of\n$2^{19937}-1\\approx10^{6000}$. Practically speaking this means that if\nwe generated one random uniform per nanosecond for 10 billion years,\nthen we would generate $10^{25}$ numbers, well short of the period. So\nwe don't need to worry about the periodicity! The state (sometimes also called the seed) for the Mersenne\ntwister is a set of 624 32-bit integers plus a position in the set,\nwhere the position is `.Random.seed[2]` in R and (I think) `np.random.get_state()[2]` in Python.\n\nThe Mersenne twister is in the class of generalized feedback shift registers (GFSR). The basic idea of\na GFSR is to come up with a deterministic generator of bits (i.e., a way\nto generate sequences of 0s and 1s), $B_{i}$, $i=1,2,3,\\ldots$. The\npseudo-random numbers are then determined as sequential subsequences of\nlength $L$ from $\\{B_{i}\\}$, considered as a base-2 number and dividing\nby $2^{L}$ to get a number in $(0,1)$. In general the sequence of bits\nis generated by taking $B_{i}$ to be the *exclusive or* \\[i.e., 0+0 = 0;\n0 + 1 = 1; 1 + 0 = 1; 1 + 1 = 0\\] summation of two previous bits further\nback in the sequence where the lengths of the lags are carefully chosen.\n\nnumpy provides access to the Mersenne Twister via the `MT19937` generator;\nmore on this below. It looks like PCG-64 only became available as of numpy version 1.17.\n\n### The period versus the number of unique values generated\n\nThe output of the PCG-64 is 64 bits while for the Mersenne Twister the output is 32 bits.\nThe result is that the generators generate fewer unique values than their periods.\nThis means you could get duplicated values in long runs, but this does not violate the\ncomment about the periodicity of PCG-64 and Mersenne-Twister being longer than $2^{64}$ and $2^{32}$.\nWhy not? Because the two values after the two\nduplicated numbers will not be duplicates of each other -- as noted previously, there is\na distinction between the output presented to the user and the state of\nthe RNG algorithm.\n\n### The seed and the state\n\nSetting the seed picks a position in the periodic sequence of the RNG,\ni.e., in the state of the RNG. The state can be a single number or something\nmuch more complicated. As mentioned above, the state for the Mersenne Twister\nis a set of 624 32-bit integers plus a position in the set. For the PCG-64\nin numpy, the state is two numbers -- the actual state and the increment (`c` above).\nThis means that when the user passes a single number as the seed, there\nneeds to be a procedure that deterministically sets the state based on\nthat single number seed. The details of this are not usually well-documented\nor viewable by the user.\n\nIdeally, nearby seeds generally should not correspond to getting sequences from\nthe RNG stream that are closer to each other than far away seeds.\nAccording to Gentle (CS, p. 327) the input to `set.seed()` in R should be an integer,\n$i\\in\\{0,\\ldots,1023\\}$ , and each of these 1024 values produces\npositions in the RNG sequence that are \"far away\" from each other. I\ndon't see any mention of this in the R documentation for `set.seed()`\nand furthermore, you can pass integers larger than 1023 to `set.seed()`,\nso I'm not sure how much to trust Gentle's claim. More on generating\nparallel streams of random numbers below.\n\nWhen one invokes a RNG without a seed, RNG implementations generally have a method for\nchoosing a seed (often based on the system clock). The numpy documentation\nsays that it \"mixes sources of entropy in a reproducible way\" to do this.\n\nGenerators should give you the same sequence of random numbers, starting\nat a given seed, whether you ask for a bunch of numbers at once, or\nsequentially ask for individual numbers.\n\n#### Additional notes\n\nThere have been some attempts to generate truly random numbers based on\nphysical randomness. One that is based on quantum physics is\n.\nAnother approach is based on lava lamps!\n\n## RNG in Python\n\n### Choosing a generator\n\nIn numpy, the *default_rng* RNG is PCG-64. It has a period of $2^{128}$ and supports\nadvancing an arbitrary number of steps, as well\nas $2^{127}$ streams (both useful for generating random numbers when parallelizing). The state of the PCG-64 RNG is represented by two\n128-bit unsigned integers, one the actual state and one the value of $c$ (the *increment*).\n\nHowever, while the *default* is PCG-64, simply\nusing the functions available via `np.random` to generate random numbers\nseems to actually use the Mersenne Twister, so the meaning of *default*\nis tricky.\n\nI think that this text from `help(np.random)` explains what is going on:\n\n```\n Legacy\n ------\n \n For backwards compatibility with previous versions of numpy before 1.17, the\n various aliases to the global `RandomState` methods are left alone and do not\n use the new `Generator` API.\n```\n\nWe can change to a specific RNG using syntax (the `Generator` API) like this:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.Generator(np.random.MT19937(seed = 1)) # Mersenne Twister\nrng = np.random.Generator(np.random.PCG64(seed = 1)) # PCG-64\n```\n:::\n\nbut below note that there is a simpler way to change to the PCG-64.\n\nThen to use that generator when doing operations that generate random numbers, we need\nto use methods accessed via the `Generator` object (`rng` here):\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng.random.normal(size = 3) # Now generate based on chosen generator.\n## np.random.normal(size = 3) # This will NOT use the chosen generator.\n```\n:::\n\n\nIn R, the default RNG is the Mersenne twister (`?RNGkind`).\n\n### Using the Mersenne Twister\n\n\nIf we simply start using numpy or scipy to generate random numbers,\nwe'll be using the Mersenne Twister. I believe this is what the\ndocumentation mentioned above means by \"aliases to the global `RandomState` methods\".\n\nWe get replicability by setting the seed to a specific value at the\nbeginning of our simulation. We can then set the seed to that same value\nwhen we want to replicate the simulation.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n:::\n\n\nWe can also save the state of the RNG and pick up where we left off. So\nthis code will pick where you had left off, ignoring what happened in\nbetween saving to `saved_state` and resetting.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.random.seed(1)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = np.random.get_state()\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nNow we'll do some arbitrary work with random numbers, and see that if we use the saved state\nwe can pick up where we left off above.\n\n::: {.cell}\n\n```{.python .cell-code}\ntmp = np.random.choice(np.arange(1, 51), size=2000, replace=True) # arbitrary work\n\n## Restore the state.\nnp.random.set_state(saved_state)\nnp.random.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.3015387 , 1.74481176, -0.7612069 , 0.3190391 , -0.24937038])\n```\n:::\n:::\n\n\nIf we look at `saved_state`, we can confirm it actually corresponds to the Mersenne\nTwister.\n\n### Using PCG64\n\nTo use the PCG-64, we need to explicitly create and\nmake use of the `Generator` object (`rng` here), which is the new numpy\napproach to handling RNG.\n\nWe set the seed when setting up the generator via `np.random.default_rng(seed)`\n(or `np.random.Generator(np.random.PCG64(seed = 1))`).\n\n\n::: {.cell}\n\n```{.python .cell-code}\nrng = np.random.default_rng(seed = 1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nrng = np.random.default_rng(seed = 1)\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.34558419, 0.82161814, 0.33043708, -1.30315723, 0.90535587])\n```\n:::\n\n```{.python .cell-code}\nsaved_state = rng.bit_generator.state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\ntmp = rng.choice(np.arange(1, 51), size=2000, replace=True)\nrng.bit_generator.state = saved_state\nrng.normal(size = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 0.44637457, -0.53695324, 0.5811181 , 0.3645724 , 0.2941325 ])\n```\n:::\n\n```{.python .cell-code}\nsaved_state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n{'bit_generator': 'PCG64', 'state': {'state': 216676376075457487203159048251690499413, 'inc': 194290289479364712180083596243593368443}, 'has_uint32': 0, 'uinteger': 0}\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['state'] # actual state\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n216676376075457487203159048251690499413\n```\n:::\n\n```{.python .cell-code}\nsaved_state['state']['inc'] # increment ('c')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n194290289479364712180083596243593368443\n```\n:::\n:::\n\n\n`saved_state` contains the actual state and the value of `c`, the increment.\n\nQuestion: how many bits does `saved_state['state']['state']` correspond to?\n\n## RNG in parallel\n\nWe can generally rely on the RNG in Python and R to give reasonable set of\npseudo-random values. One time when we want to think harder is when doing work with\nRNG in parallel on multiple processors. The worst thing that could\nhappen is that one sets things up in such a way that every process is\nusing the same sequence of random numbers. This could happen if you\nmistakenly set the same seed in each process, e.g., using\n`np.random.seed(1)` on every process. Numpy now provides some nice functionality\nfor parallel RNG, with more details given in the [SCF parallelization tutorial](https://berkeley-scf.github.io/tutorial-parallelization/parallel-python#5-random-number-generation-rng-in-parallel).\n\n# 5. Generating random variables\n\nThere are a variety of methods for generating from common distributions\n(normal, gamma, beta, Poisson, t, etc.). Since these tend to be built\ninto Python and R and presumably use good algorithms, we won't go into them. A\nvariety of statistical computing and Monte Carlo books describe the\nvarious methods. Many are built on the relationships between different\ndistributions - e.g., a beta random variable (RV) can be generated from\ntwo gamma RVs.\n\n## Multivariate distributions\n\nThe `mvtnorm` package supplies code for working with the density and CDF\nof multivariate normal and t distributions.\n\nTo generate a multivariate normal, in Unit 10, we'll see the standard\nmethod based on the Cholesky decomposition:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nL = np.linalg.cholesky(covMat) # L is lower-triangular\nx = L @ np.random.normal(size = covMat.shape[0])\n```\n:::\n\n\n\nSide note: for a singular covariance matrix we can use the Cholesky with\npivoting, setting as many rows to zero as the rank deficiency. Then when\nwe generate the multivariate normals, they respect the constraints\nimplicit in the rank deficiency. However, you'll need to reorder the\nresulting vector because of the reordering involved in the pivoted\nCholesky.\n\n## Inverse CDF\n\nMost of you know the inverse CDF method. To generate $X\\sim F$ where $F$\nis a CDF and is an invertible function, first generate\n$Z\\sim\\mathcal{U}(0,1)$, then $x=F^{-1}(z)$. For discrete CDFs, one can\nwork with a discretized version. For multivariate distributions, one can\nwork with a univariate marginal and then a sequence of univariate\nconditionals:\n$f(x_{1})f(x_{2}|x_{1})\\cdots f(x_{k}|x_{k-1},\\ldots,x_{1})$, when the\ndistribution allows this analytic decomposition.\n\n## Rejection sampling\n\nThe basic idea of rejection sampling (RS) relies on the introduction of\nan auxiliary variable, $u$. Suppose $X\\sim F$. Then we can write\n$f(x)=\\int_{0}^{f(x)}du$. Thus $f$ is the marginal density of $X$ in the\njoint density, $(X,U)\\sim\\mathcal{U}\\{(x,u):0G4N)>4;O=^Syk&Zg**kBAzYOnwz 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

    ZnlgWP5e- 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 avd3FXZydfH4MK{+U=JDpn)S diff --git a/_freeze/units/unit9-sim/figure-html/unnamed-chunk-4-3.png b/_freeze/units/unit9-sim/figure-html/unnamed-chunk-4-3.png index 46eb0be6467e5089b94dffaca6d8894a454918ba..307425145f38c478fb8ee452a3d636d7d0f037a6 100644 GIT binary patch literal 231099 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 z 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

    xZOQu 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 s~GR1ZFMfI~j!Zxz)qj8F=28O*EM@p)02U`*I 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

    G~c*>ggT@&bT?>eet&x;)Qddpv%25C4rMF^ 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

    *t6@r=)(BdIOG<*_P2GdN`WIc=wMhCw_$)?A=j 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

    Nr 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 z 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
      `nD)h^ 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
      (*=0HBG1$uCIo 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 O9Chu@vET0d%l`)%l49ck diff --git a/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-2-1.pdf b/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-2-1.pdf index efc425d9c3876c2bdbabe54fc8a3201ffb67539e..28824295afd1137f36ac31bd33efd6a1dc07752f 100644 GIT binary patch delta 4024 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 Nau9&1=q0Qc;6Eg_?AQPR delta 3902 zcmZWlc_0+}_sx=JjIkwT8$02dg&DGCNkhU6$r@s!M8$;k7<-5;BYVPFvd18@Z)wOf zmeEK=vOZ)BA;0SV{&?Sf{<@!Y?>YC}(`Go1dijVBf9Z~0H&^)1&eaKQRcdef(#88q zWwO$aU^Y!or4R*Rnx%pjK(dQEHE=bcXxgl}7ZSv1Hv4RGvAny;ywJZqYw}=yxg=wL z%#_;FXjQ(NbuGZoC7@$qS*7gG?p}3|f8W5e)cTeWnYh0HYR|T0t_NB+kjBq@*NTWjehPqsVU?fg0h3O}2c?r5za_&=EK;iyR2VSLvi zQ4;N0eM; zI~vs`_e=Rd4&0I$b@U+rqw=o$ON^B5N`YKHG`Fj8B5Er>)4-^2MOITLAwkmaS}(Q4 zXsL9-dk<2Rd)eEir!^_F=CnYFT)mAE79~%a3@|r-+P=}8^|l?=r>LPK!-A#L9L{s-DOniyzv}1-JV;7 zGfy_b1_8Tv$uODZim5^|uuS)3x~Zfu)Cm8&D@cN57lTMnF-`iqwW2K);JSRl|FT4i zth&H$2A96RVur3h`j#-+XkQxctEC+AA^t3@iIK2_Zijq?qwWsGG}XexJ~1kMks`pd zGa~sAm{DWNEf;Al7wck4)Gf0#ro-n?yRxG5pRjv9lZ{S$p1$;wg42H~uB}NMOnkU= zV6hyEdED;H?Pu8f3UPi#J+w?W_Dzw1q*lsbvq{c~c2D{?p(KIMN1L+@=Ic)GY4}ey zb`pHHAN|-Y_}%)Nt93N?THVZa1giBvve=HXmy@!L=%7yHbhRUy83-93-88ld{n%eBF~mUSo3Ug7R7Qumeczh2V?~ok|&@dtaj&6uqvT5g?~+ zk_*}fZ4tx~qsvY%j_t`YzD@qZB)oNccaf;7ZLJL<)q6Kj{%u$`hXAv2s(C_^@MF^7 zJrf#pqKiRPuRfymkQc0{2z1{hj{0~m)}@{6uAO~Zd(Y_brIyGgt*@Lrxg3Wk%(y@1L&DP&i2x4=Lf;lrfSvWq|da~Cwc8uliP##78$f!C&?Fs z9JsZvx=Y((vWsMOLLbPw@ydxfCku2e*d#01RjMzZ$31*C-9pds(^K2%bKT#_X%;?k zqUvXmRnzmtYPcP%aXE8Y9Uk|ZuI$8{;A|ELfv!t6Zf<~@F4{>W;(K8U29B~VZVb#m zTKTGPqV63*7J-jJp4G^}n&~aQqff!8S2SPUh);*cGk1#znpdhW@(Q0u3;Gk0`~sBo zZyS4&IQCDVjQ$acd=Pj2+C(**uy&PRjNc2o7E5!7#rOIdox?w_bK#})+Yyp_hV|yQ z^axoUu)1!KHl=~~VepKm>1Qr5Q=j-L@zZ>giYK4k8Z7Eq;A5YlrUoQ2+1~69NV;LJ zVZBBi)^`3zGrKkkt;FVMvr@8mb%oj|x7=M=-2_lcvp9@Utwax(N_;neBwhQ=YoTpQ zyogg-Tgcn9BPSGKV))6hgS7BycrAb$`o;Tahe^3RBzINH<2*Ujoy;~n0CL2dP}1l!lH;TX_&!;QB7 z5BpkZihB254}Q-l<^4Dxg>}zxNSG(iQ;D6RuD*vsHK|5Vi0Gx1`>lR`7eBLLR+Nhx5q z|8nr9Vx*QheLD*ZPbmgifDchi2}s%$jBFkTzvkifl>2Auu7XQN z`ngfOab-^E0=ZK%)A(RD*v$FdDdUa{3VZR~=V*tHSIasoD#3wogKzL7BWMGOJHrFU zU%m~#{L3S-R>OAc`5hwlFpCwml~J%g?qD5(#^VNkn%Nut!tagW=}eZ%++X}AzNmaz zIK!8|blXrDcJT4W-4q$6l#(?aJsXD~Rc0Sz@CD?lnZ5ZhqRY>>29~wQQnVHD0ric( zb*rFfM|VH8qzn&dAhizza zYcc0K@hFA1!TzoQHqXmI4M6N~t#s?G`F;n|>187)_bYM%`cRlD&+kY;B%zc$Z+WX!QY$R-4#u#eEqE{HyQ88@#NcUL_~%9 zONV(sGWujW5~cxIwrrt$U)a{yb@D952Oqj7BC4D!_nJ~g+T11r%NK10CIns?5UD=D zJ9Ss@yuaHR`#|w)i{aOd3-8yy(#h#MOv$(g&q!mCe40$akybV97p>TMS1HH;O zPbYq>e*X845R-cyXe*R7Q&87BRnZA@uNQe{$LtL8HmTR#Tiu%`6z$J+pk48;e=p4X zFL>`Xc(|Zi{_UXaQA`nEwB|I)6td4O{GcIf@4{~2MwhoA%)B7l{E77a12Iz<(FTqO z>iPS?T6wptf}_kGi_ApGW`bs?!_i)1t6hl3>ORaK|GtIQxe{M9pP|+AV@9ww!W}d< z%~zRgq8J0(RFUSjc?xASxxO)j+28H=eLeppVy79dR#K0qn_Wwc>50|eMG&-?wn*fm09pB{adY%8=EYyvb?qYs2XeT+ zYUa3eTUR!%t0@rEyqlRt!|NE~IdskehOqhkv+ieDVJEZOIF1zwq92FICsA2(xt5*9?>>>{ zs6I$N#f?ud0@lB~S*AFKQ!Z^=`8kAZr52_6tS0LEPhVCSeo2^%ao@ocH^y1Vgx^`u0-$TJW#A+ifl?tjs^%@Mx74S zSwT>UgNf= zb_Xl7f4q-Dwwyb=XlrBbJftPKlJrIaw&-uQh1;Zdhq5WJbO=P%xlEwp14C-WV{f(cvP`o(>yjND!dZ(hNQy_WfV}txp`r+U==u6>Bdc;pM?ro z$s6l~^(4gzTs(RHHwJ@%Az%zx>5eBB41@h!dxK%{|F3>cgJH_QegGvL7^dI_!EOb5WnXL&En$pYB0i#xHKLK{c}nc3O~j~Ab)!OV*^52?U-W(6ne}Z68SUS zKe#Y8=+7K~KKy?ofWx527Q^s@_ zJ%x9w=kvb5=jpxwn9sS-oa&r$olZmOV(QJ?s<1_2u>b6P7nojDb08{elss0!fWnfyRl(d_Zd8>DktX*x5;( zOWoP*?&{Rp%+84D@k0JJ;DqeV%fo4?ZfkSu!|Cxw!o~ij-fiU4+0@9HBi~Q+A7^#C zw*lbevjZ2AV~vEP*@%_CpUC4Xzorm)X1Z15=Ac2BO}o3B$TOx7Q>1e`QwXsdD22^Y z5l_r`G>avfb>hsuV1=*Hm~QHCwlSZoe(cpZxv7tmqFZ520EY7~?a` z(qX)9tk}3w(s8=qL-#u{yRM?Pyrf28;@?Bj0tIxQ?1d37o1weU-P<7I-^UZ9Y4P zD68TKto&wa7W+`~cwvtJr2i0bKU}6$cZ2JTea}z)Qe0*ELV@=u=oOD#ylkJYQ${)# z#8c61pe7P`)E6Yl=Q2>Kr2oM5=8}1$7k9j}{;bb-=DX^(6|3Vdv*UR!2`j@m52i$= zcaO!z;?uX9BKw2-8-s!ZOo1@ZL=OT$xr03YYl3RPKtcVw&NIk^QW~oB zjXbMjbj=TAbjaX=UMDBlhA`?0e~ zP{fOBxFwwTz{kMN)31GNHC8$-gp68JBJ-^;c``(Ox9^Hz%^UE1+uWmhnOw^-@@OoX zwBRG0nU@^$@-@3)pyH^>a!0$tVTp}~7Id>g<3|3oV5$Y(Zj$CkeTj2q@H{-5!v6l- z9y6ENXoh9)tm`_f8lu%Oxemj$-NjkmPln**?pf*ivMk!W`_${SYgu0+L=dhSIOv1V zu()^pGOZ(9Pe>V|B+HTxb8gR=`sHD24Kzk9IsUd6H#e|Tz_LQtPyg6G(Sqo9C;!f} zw3aE;)TvB*ssp32XH6ODx=8hcd%c~CMZiRaL-tWq5NB%XlWy*4(5`hZiGYa?wP;8JGduIen--nsJwGHcccTsZ zo|h3v-w-~2vYjrb#c~=sn#8>~Z%?`G0rY-5n2j8YQ8YBcb8L5 zG2S~}&Cam0fRp?j?`N6JE1yuBseWEQF2RVDYoa;ht%tk;Dm9o3MCLP%7dKnF;6MHJ zLs;gURq$|5RBea*7mHQ7#|*{9ui z8cJ_#!Cr8iB)*8AQL&J+&^kks+&t=~1?a&=C*>(QL77RlJvPfNoWsqf>yr6-j1JYrH7xT(zEsW5-xFO zF7%W!)`e^9rGoC>yTzu}{yI2+q2~2DiNVfVP4!QXmR2&{Sm}@}Y4m#1J%+dxN+zqwWuJ`*l}*n7Ta$?+ge0ZxhsW^t&J}!RC)#81b7sWUiZ{b;0MdwO!lkxHOHA%K~g=E=L zUBMhxc8WE>Tck=fZXW`QZy$@|iXD<<-e1@`_4bWFV4)2D#(qub$ZpNFBY#{%F~e{X zb>{6XDh6hgzTL@QYRtzh7mkU5-6qFLzSME-Q^zar*&U08Eh-dOM^eDZwkhsZH+pBfty*{60lS9|&e8Kvd zXd{dAnpxsYsLG`Z;y57Eg^gU;k-{#JUc$*J%vVVVRu8sU?+d0@aWR4tkCU8tcg*%x zx-3)=)=Wdlu}ic)4pB@b{60k>k?&NwFbYaMb;;`yfS4=HpR zw)lZLc=yGTmuL17nWn>^nJ7d+5~4-CLtN_}A}FQM^EZwdh9G?PH4$)A4CaAoDp_(J$TPlgkq17RY^C zgYzTWc~ROyg}wV*FF-!=Q1O{+ib4~2bhDGd%&dwZh9ws8=Kjt#J@15}X;0`4{GDG2B%BVN6GqI>UM^uL&L3st zmC09N?Fkcn*IrFub0t+lHyNB#bM9_&N6LZaUF-#bea#&AS=!wEF7`f~U)I95kO;Y% z><8Lv{%BJ9f-3c%up;T^H=WiY=VzZg)0TnXYen?Fw)c1L;a%0umALi!K5q%TNW_+v zmuBRfOC{|0&vk}R*6|?odMID}T2*ybm(%*V;FB)m6|xBoTCpMtv+Hi@8AR)C+>&f| zOk(nYBJrroPC9DtVsF%2LV~Fly-UWABI7QVq>f8b>9Mw&Un=soO%|Vrm)=C?wNZjI zEag!tyhsXT*_md`{7(Z(1A?!>>-rU3(5|IN{A44&E9wqOY>!`v?_*xYCp}i1d!n{9 zbJsbt_OWe~Nh)v8RpUVBWZ|9^R}~wCv1~N}mAi-c)XO%9V9!52wosM7Pdo&N(Ty?4 zL*S*}t5@Fd7t;HN2GjHhuL@RLXbn9MGKUZ|CL`z#ZyH(-M>-%-z5Ptd@fu4lmOp)z z?>}$-Vp%Ua+=-DW60`Sp@j4AXtj88{|12pfug6ZE?d`Chov7oUPRyCc+Z6OOShoW9 z7jgqsLY8{RdR~Fw2VG69(4n?n1SZuf&x8cNZ{@ANFE7*WQKZjhd|F3ROnHZ~gWC43 z+kmT4%AI&kJTw0&+DW7|sFbqyK!L{$YHgLmVy?_R$k7^7X65_&)1zD`p}Y>R6}9|d zu5~)uZ^e&3Sm)~Y$uE_hdVmh@c>uznOyzJTiaPJzVywXZyXL&ZKBos=uMcoOwGkKE zedzqEjaOZ@6W7xh^-45~AWS4R>35!4&9!ISoEIz2td02AOnF(Ty!Dl}Nb{$-dSx)P ze!GvA^iwWMdt-1ns*>dAJPOmEB9LS8it@EF*s?WN0uhL#a=js%Y=wum4HDiz*sxtV zVaVEZd1S~s;^Ih~j_{Ea-Wt4GLhh*%`kiO%^%1V9Go|LSkE^){&q#}!gU*!O$~=n9 z=SdnL_Id$HSy;HlIOyQ}g}4j77)PgE52}$C;aOS_rbV|wm#~sWkQL2^PZ3HS>(s_f zm-+AI$GB1v8W;VBZaNr&@sCTBQDp2V|tB*y`|t zm&6E{)&Z|RdSr0h*bD8wIXdqSeGkQ$?H(R1$J2~OZ0L*2TlaQ_lJ#cm_9-=cgf&fI zKhBjB4^*uN(&M=ABuuQjKIT+NEUMZAfw?`NI$k+DG zX;*T5Y>95@_i|swse9p>;T8J*$e>rHQKtdRfV1h-kDqxmgGLMPh*7%yy0xMGMm}s) z9M-VQ_F+Pt(mjJteU&3eaUM|xif*|~T^Z5`?^1SwiPaY!?FN0aYOFUFP=~Zq-CT!- zX89FAUN9wskKA2tw;xE3n~Fu#Wfr5cI;jds*R2tFpKS5!fmF_&A@{hGyTXa_NgpFK z$mFtC*6Q^=>;^h+6TPAF)g>4H-eg;-ZHpY@7W0yyX8@iZHY#s^JTo1w@i_am7iZAT zge!LhmUlNMw>P_;&uoC&k9M0UW1Xk`L!HfuV5YkDmXWYUYk@AAA6>Jq2VH}++w5og zT3*-)mwx07A8XmQa(g?!y^La!8z1-;o1W6z&@41}ZACS5&7sttm8OU;TJ#e-fSqtp<(IOsuN76aYeh4^Ht$(PEe&C-l#Uy{ z=1`P=qf*T?VLM9yXgyQ&H2#3*^oB}+)SL{@Y>-(llj_3 z)@&4PR)l8OSJdvU^*YdBn%P_B3JfLS;=UdC^~ZhVcnM>vYHA!L@TZ&}^c83NXfgP) z`+sXZAb6bjZE2>aRsfb6E(4s2>XT-+q+FvDd8r{!Cg2re-&5`Iuq#7OLEoqz3~sME z#x-?sIO1Ude@sf;Twq?CwFsGu@+>#44S^P?vR44E4CN-Pk^4DsiXoIH@t6`DG3KhB zMu2^Ez{9G}^Nm|v zDJ>3#qv)&Q`ApfY6>>loq98LP-rJ~3_~~70U60^SI^dw6c^gjbF+0U5L{Gd(zQh8o zfm!;N!*fMXts^8)tKhJ2C61Toohgih`u8wK z)7!SG%&>rXZ}ttluIFAdMLW+dg}r{ndLJ)k%Dwd}ojr4CbY%-e=A-p&%XJs6$IQPR zS?Rl+{TR#G?ylRa{&IFsb@KEj-ky$`7$GQ7{EDvO3SNYX6Hru<3nqqR1fsc;WB)batV};&1dd=pDK4J1o8L8HCk7yq`i(R~-rgEg3 zb=y!v_XSgTGWFJ-WJ?;Y!rE;NH1&<+$IGn#6&D1OiHtnu5S3XAQEVV3awld=?X-pp zOT)%l?Ou`4alqz>jHwBiA4Rya#5lwA7m(HSMGVkL6bgjU>LOmJXs6JAGL+4v65_)f zIY@#_QE$rWm@ZxzbVf_^?M!ERZXcVe$2{@xRoK^b)%O>T&3@y&5h39|qlmrH!9tpb z!1D2ydNi%rcpr;>QQbOeKRg2GU+w()_#LT z*p^j@2#;q2;j19Sc)lC7_zboecvE&zvG@&6BK!;J4{O9MBGLC_CA!Xy)6JWJWM+L#wnWriPb{ zwIFav6{4c=TrE08$lWa{*4idP3?6d2TbdIRd%& z`ez+Q_6RMpJx(TF*(-yrhK zkxwtQsirr~r_I~9`-nBBXOgvkFDuOd)&>q|(WGNfma0cIH!WR{?%F6Y)$xipuMc zJ+cLgSa#Rk!|e{X`jQE5ruksx8nw8f8jMb9Jo zab^xCCJ=s8TPFv?ueme9b~JY-{FpeK*g*JA%%7U!AZQpVzYGK|0O6N|2%#YOT0Su% z(&7_7tBb%d1Of?xK~(=qf2qa`5om6wF>;h_@@9A%civ5dM<|*wR@6@3KtZDqe(eArIlq! F{|}y+@{9lg delta 6264 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 Date: Thu, 26 Oct 2023 09:07:35 -0700 Subject: [PATCH 10/17] minor edits --- _freeze/units/unit10-linalg/execute-results/html.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_freeze/units/unit10-linalg/execute-results/html.json b/_freeze/units/unit10-linalg/execute-results/html.json index 11dd2ac..56a9b14 100644 --- a/_freeze/units/unit10-linalg/execute-results/html.json +++ b/_freeze/units/unit10-linalg/execute-results/html.json @@ -1,7 +1,7 @@ { "hash": "85895c476ef2aa6db9939ce3c30a8407", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.881784197001252e-16\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-8.881784197001252e-16\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" From 68b6dacecc2d2a3c1453bafc7bc4b1048a6a64f8 Mon Sep 17 00:00:00 2001 From: Christopher Paciorek Date: Mon, 30 Oct 2023 08:21:59 -0700 Subject: [PATCH 11/17] some unit10 cleanup --- .../units/unit10-linalg/execute-results/html.json | 4 ++-- .../units/unit10-linalg/execute-results/tex.json | 4 ++-- units/unit10-linalg.qmd | 15 ++++++++------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/_freeze/units/unit10-linalg/execute-results/html.json b/_freeze/units/unit10-linalg/execute-results/html.json index 56a9b14..6599607 100644 --- a/_freeze/units/unit10-linalg/execute-results/html.json +++ b/_freeze/units/unit10-linalg/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "85895c476ef2aa6db9939ce3c30a8407", + "hash": "23a0ecb8441e5340fdd20eeb8b6edc8b", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-8.881784197001252e-16\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-4.440892098500626e-16\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/units/unit10-linalg/execute-results/tex.json b/_freeze/units/unit10-linalg/execute-results/tex.json index 2daf253..4bd7945 100644 --- a/_freeze/units/unit10-linalg/execute-results/tex.json +++ b/_freeze/units/unit10-linalg/execute-results/tex.json @@ -1,7 +1,7 @@ { - "hash": "85895c476ef2aa6db9939ce3c30a8407", + "hash": "23a0ecb8441e5340fdd20eeb8b6edc8b", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-8.881784197001252e-16\n```\n:::\n:::\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-1.3322676295501878e-15\n```\n:::\n:::\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/units/unit10-linalg.qmd b/units/unit10-linalg.qmd index f77f789..1dfdeee 100644 --- a/units/unit10-linalg.qmd +++ b/units/unit10-linalg.qmd @@ -816,20 +816,21 @@ the remaining unknown in each row (each equation). How many multiplies and adds are done? Solving lower triangular systems is very similar and involves the same number of calculations. -In R, *backsolve()* solves upper triangular systems and *forwardsolve()* -solves lower triangular systems: +In Scipy, we can use `linalg.solve_triangular` to solve triangular systems. +The `trans` argument indicates whether to solve $Ax=b$ or $A^{\top}x=b$ +(so one wouldn't need to transpose before solving). ```{python} import scipy as sp np.random.seed(1) n = 20 X = np.random.normal(size = (n,n)) - ## R has the `crossprod` function, which would be more efficient ## than having to transpose, but numpy doesn't seem to have an equivalent. -X = X.T @ X +A = X.T @ X # produce a positive def. matrix + b = np.random.normal(size = n) -L = np.linalg.cholesky(X) # L is upper-triangular +L = np.linalg.cholesky(A) # L is lower-triangular U = L.T out1 = sp.linalg.solve_triangular(L, b, lower=True) @@ -858,9 +859,9 @@ X = np.random.normal(size = (n,n)) ## R has the `crossprod` function, which would be more efficient ## than having to transpose, but numpy doesn't seem to have an equivalent. -X = X.T @ X +A = X.T @ X b = np.random.normal(size = n) -L = np.linalg.cholesky(X) # L is upper-triangular +L = np.linalg.cholesky(A) # L is lower-triangular t0 = time.time() out1 = sp.linalg.solve_triangular(L, b, lower=True) From 89e6ce28c7a4cac0168876338ec84191b4d29461 Mon Sep 17 00:00:00 2001 From: Christopher Paciorek Date: Mon, 30 Oct 2023 11:41:43 -0700 Subject: [PATCH 12/17] fix ill-cond example --- .../unit10-linalg/execute-results/html.json | 4 ++-- .../unit10-linalg/execute-results/tex.json | 4 ++-- units/unit10-linalg.qmd | 20 ++++++++++++++----- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/_freeze/units/unit10-linalg/execute-results/html.json b/_freeze/units/unit10-linalg/execute-results/html.json index 6599607..e245033 100644 --- a/_freeze/units/unit10-linalg/execute-results/html.json +++ b/_freeze/units/unit10-linalg/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "23a0ecb8441e5340fdd20eeb8b6edc8b", + "hash": "87aebcf821cc381889e79574ee58478a", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-4.440892098500626e-16\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-4.440892098500626e-16\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n\ndelta_b = bPerturbed - b\ndelta_x = xPerturbed - x\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nprint(evals)\n\n## relative perturbation in x much bigger than in b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[3.02886853e+01 3.85805746e+00 1.01500484e-02 8.43107150e-01]\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_x) / norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_b) / norm2(b)\n\n## ratio of relative perturbations\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0033319453118976702\n```\n:::\n\n```{.python .cell-code}\n(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b))\n\n## ratio of largest and smallest magnitude eigenvalues\n## confusingly evals[2] is the smallest, not evals[3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2460.567236431514\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2984.092701676269\n```\n:::\n:::\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/units/unit10-linalg/execute-results/tex.json b/_freeze/units/unit10-linalg/execute-results/tex.json index 4bd7945..16fe028 100644 --- a/_freeze/units/unit10-linalg/execute-results/tex.json +++ b/_freeze/units/unit10-linalg/execute-results/tex.json @@ -1,7 +1,7 @@ { - "hash": "23a0ecb8441e5340fdd20eeb8b6edc8b", + "hash": "87aebcf821cc381889e79574ee58478a", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-1.3322676295501878e-15\n```\n:::\n:::\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n```\n:::\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nnorm2(x - xPerturbed) ## delta x\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n16.396950936073825\n```\n:::\n\n```{.python .cell-code}\nnorm2(b - bPerturbed) ## delta b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000284\n```\n:::\n\n```{.python .cell-code}\nnorm2(x - xPerturbed)/norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9.942833687618297\n```\n:::\n:::\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.3322676295501878e-15\n```\n:::\n:::\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n\ndelta_b = bPerturbed - b\ndelta_x = xPerturbed - x\n```\n:::\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nprint(evals)\n\n## relative perturbation in x much bigger than in b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[3.02886853e+01 3.85805746e+00 1.01500484e-02 8.43107150e-01]\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_x) / norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_b) / norm2(b)\n\n## ratio of relative perturbations\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0033319453118976702\n```\n:::\n\n```{.python .cell-code}\n(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b))\n\n## ratio of largest and smallest magnitude eigenvalues\n## confusingly evals[2] is the smallest, not evals[3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2460.567236431514\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2984.092701676269\n```\n:::\n:::\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/units/unit10-linalg.qmd b/units/unit10-linalg.qmd index 1dfdeee..6d64e36 100644 --- a/units/unit10-linalg.qmd +++ b/units/unit10-linalg.qmd @@ -665,6 +665,9 @@ x = np.linalg.solve(A, b) bPerturbed = np.array([32.1, 22.9, 33.1, 30.9]) xPerturbed = np.linalg.solve(A, bPerturbed) + +delta_b = bPerturbed - b +delta_x = xPerturbed - x ``` @@ -688,12 +691,19 @@ condition number helping us find an upper bound. ```{python} e = np.linalg.eig(A) evals = e[0] -norm2(x - xPerturbed) ## delta x -norm2(b - bPerturbed) ## delta b -norm2(x - xPerturbed)/norm2(x) -(evals[0]/evals[2])*norm2(b - bPerturbed)/norm2(b) -``` +print(evals) + +## relative perturbation in x much bigger than in b +norm2(delta_x) / norm2(x) +norm2(delta_b) / norm2(b) +## ratio of relative perturbations +(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b)) + +## ratio of largest and smallest magnitude eigenvalues +## confusingly evals[2] is the smallest, not evals[3] +(evals[0]/evals[2]) +``` The main use of these ideas for our purposes is in thinking about the numerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On From 714faa1a9e33f4872fd9c976bc060ae81113f401 Mon Sep 17 00:00:00 2001 From: Christopher Paciorek Date: Tue, 31 Oct 2023 18:20:28 -0700 Subject: [PATCH 13/17] minor edits to unit10 --- .../unit10-linalg/execute-results/html.json | 4 +-- .../unit10-linalg/execute-results/tex.json | 4 +-- units/unit10-linalg.qmd | 33 ++++++++++++++++++- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/_freeze/units/unit10-linalg/execute-results/html.json b/_freeze/units/unit10-linalg/execute-results/html.json index e245033..daf9b99 100644 --- a/_freeze/units/unit10-linalg/execute-results/html.json +++ b/_freeze/units/unit10-linalg/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "87aebcf821cc381889e79574ee58478a", + "hash": "7cff00b7a51d43b73dea6de7106d65c0", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-4.440892098500626e-16\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n\ndelta_b = bPerturbed - b\ndelta_x = xPerturbed - x\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nprint(evals)\n\n## relative perturbation in x much bigger than in b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[3.02886853e+01 3.85805746e+00 1.01500484e-02 8.43107150e-01]\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_x) / norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_b) / norm2(b)\n\n## ratio of relative perturbations\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0033319453118976702\n```\n:::\n\n```{.python .cell-code}\n(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b))\n\n## ratio of largest and smallest magnitude eigenvalues\n## confusingly evals[2] is the smallest, not evals[3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2460.567236431514\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2984.092701676269\n```\n:::\n:::\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2.220446049250313e-16\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n\ndelta_b = bPerturbed - b\ndelta_x = xPerturbed - x\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code below that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nprint(evals)\n\n## relative perturbation in x much bigger than in b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[3.02886853e+01 3.85805746e+00 1.01500484e-02 8.43107150e-01]\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_x) / norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_b) / norm2(b)\n\n## ratio of relative perturbations\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0033319453118976702\n```\n:::\n\n```{.python .cell-code}\n(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b))\n\n## ratio of largest and smallest magnitude eigenvalues\n## confusingly evals[2] is the smallest, not evals[3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2460.567236431514\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2984.092701676269\n```\n:::\n:::\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport statsmodels.api as sm\n\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\n\nbeta = np.array([5, .1, .0001])\ny = X1 @ beta + np.random.normal(size = len(t1))\n\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nnp.linalg.cond(np.dot(X1.T, X1)) # built-in!\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.653329826789808e+21\n```\n:::\n\n```{.python .cell-code}\nsm.OLS(y, X1).fit().params\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.19490003e+04, -1.18366839e+01, 3.08227764e-03])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\nI haven't shown the OLS results for the transformed version\nof the problem because the transformations modify the true\nparameter values, so there is a bit of arithmetic to be done,\nbut you should be able to verify that the second and third\napproaches give reasonable answers.\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/units/unit10-linalg/execute-results/tex.json b/_freeze/units/unit10-linalg/execute-results/tex.json index 16fe028..e952bfa 100644 --- a/_freeze/units/unit10-linalg/execute-results/tex.json +++ b/_freeze/units/unit10-linalg/execute-results/tex.json @@ -1,7 +1,7 @@ { - "hash": "87aebcf821cc381889e79574ee58478a", + "hash": "7cff00b7a51d43b73dea6de7106d65c0", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.3322676295501878e-15\n```\n:::\n:::\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n\ndelta_b = bPerturbed - b\ndelta_x = xPerturbed - x\n```\n:::\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code above that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nprint(evals)\n\n## relative perturbation in x much bigger than in b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[3.02886853e+01 3.85805746e+00 1.01500484e-02 8.43107150e-01]\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_x) / norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_b) / norm2(b)\n\n## ratio of relative perturbations\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0033319453118976702\n```\n:::\n\n```{.python .cell-code}\n(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b))\n\n## ratio of largest and smallest magnitude eigenvalues\n## confusingly evals[2] is the smallest, not evals[3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2460.567236431514\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2984.092701676269\n```\n:::\n:::\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n::: {.cell}\n\n```{.python .cell-code}\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.440892098500626e-16\n```\n:::\n:::\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n\ndelta_b = bPerturbed - b\ndelta_x = xPerturbed - x\n```\n:::\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code below that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nprint(evals)\n\n## relative perturbation in x much bigger than in b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[3.02886853e+01 3.85805746e+00 1.01500484e-02 8.43107150e-01]\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_x) / norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_b) / norm2(b)\n\n## ratio of relative perturbations\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0033319453118976702\n```\n:::\n\n```{.python .cell-code}\n(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b))\n\n## ratio of largest and smallest magnitude eigenvalues\n## confusingly evals[2] is the smallest, not evals[3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2460.567236431514\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2984.092701676269\n```\n:::\n:::\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport statsmodels.api as sm\n\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\n\nbeta = np.array([5, .1, .0001])\ny = X1 @ beta + np.random.normal(size = len(t1))\n\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nnp.linalg.cond(np.dot(X1.T, X1)) # built-in!\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.653329826789808e+21\n```\n:::\n\n```{.python .cell-code}\nsm.OLS(y, X1).fit().params\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.85056265e+04, 2.85759104e+01, -7.01025606e-03])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\nI haven't shown the OLS results for the transformed version\nof the problem because the transformations modify the true\nparameter values, so there is a bit of arithmetic to be done,\nbut you should be able to verify that the second and third\napproaches give reasonable answers.\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/units/unit10-linalg.qmd b/units/unit10-linalg.qmd index 6d64e36..3f34898 100644 --- a/units/unit10-linalg.qmd +++ b/units/unit10-linalg.qmd @@ -684,7 +684,7 @@ the absolute value of the largest magnitude eigenvalue of $A$ and $\|A^{-1}\|_{2}$ that of the inverse of the absolute value of the smallest magnitude eigenvalue of $A$. -We see in the code above that the large disparity in eigenvalues of $A$ +We see in the code below that the large disparity in eigenvalues of $A$ leads to an effect predictable from our inequality above, with the condition number helping us find an upper bound. @@ -744,10 +744,18 @@ that centering and scaling the matrix columns makes a huge difference on the condition number ```{python} +import statsmodels.api as sm + t1 = np.arange(1990, 2011) # naive covariate X1 = np.column_stack((np.ones(21), t1, t1 ** 2)) + +beta = np.array([5, .1, .0001]) +y = X1 @ beta + np.random.normal(size = len(t1)) + e1 = np.linalg.eig(np.dot(X1.T, X1)) np.sort(e1[0])[::-1] +np.linalg.cond(np.dot(X1.T, X1)) # built-in! +sm.OLS(y, X1).fit().params t2 = t1 - 2000 # centered X2 = np.column_stack((np.ones(21), t2, t2 ** 2)) @@ -762,6 +770,12 @@ with np.printoptions(suppress=True): np.sort(e3[0])[::-1] ``` +I haven't shown the OLS results for the transformed version +of the problem because the transformations modify the true +parameter values, so there is a bit of arithmetic to be done, +but you should be able to verify that the second and third +approaches give reasonable answers. + The basic story is that simple strategies often solve the problem, and that you should be aware of the absolute and relative magnitudes @@ -955,6 +969,23 @@ we know the matrix is non-negative definite, we just take the absolute value of $|U|$. So Gaussian elimination provides a fast stable way to find the determinant. +## When would we explicitly invert a matrix? + +In some cases (as we discussed in class) you actually need the inverse as +the output (e.g., for estimating standard errors). + +But if you are just needing the inverse to multiply it by a vector or another +matrix, you're better off +using a decomposition. Basically, one can work out that the cost of computing +the inverse and doing subsequent multiplication with it is rather more +than computing the decomposition and doing subsequent multiplications with it, +regardless of how many columns there are in the matrix you are multiplying by. + +With numpy, that may mean computing the decomposition and then +carrying out the steps to do the multiplication using the decomposition +or using `np.linalg.solve(A, B)` which, as mentioned above, uses the LU behind the scenes. +One would not do `np.linalg.inv(A) @ B`. + ## Cholesky decomposition When $A$ is p.d., we can use the Cholesky decomposition to solve a From 800be7331b18fda7c9cf1e728f607784ae9c44bf Mon Sep 17 00:00:00 2001 From: Christopher Paciorek Date: Tue, 31 Oct 2023 18:39:46 -0700 Subject: [PATCH 14/17] some edits to unit 8 --- .../unit8-numbers/execute-results/html.json | 4 ++-- .../unit8-numbers/execute-results/tex.json | 4 ++-- units/unit8-numbers.qmd | 20 ++++++++++++++++--- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/_freeze/units/unit8-numbers/execute-results/html.json b/_freeze/units/unit8-numbers/execute-results/html.json index 903a8f8..fcd8a4e 100644 --- a/_freeze/units/unit8-numbers/execute-results/html.json +++ b/_freeze/units/unit8-numbers/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "fcbb7815b811ee69c0e6b2ee8d864e88", + "hash": "d42dd640f7faf07bafa4f7c3e7d4169d", "result": { - "markdown": "---\ntitle: \"Numbers on a computer\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-12\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nengine: knitr\n---\n\n\n\n[PDF](./unit8-numbers.pdf){.btn .btn-primary}\n\n\n\n::: {.cell}\n\n:::\n\n\n\n\nReferences:\n\n- Gentle, Computational Statistics, Chapter 2.\n- [http://www.lahey.com/float.htm](http://www.lahey.com/float.htm)\n- And for more gory detail, see Monahan, Chapter 2.\n\nA quick note that, as we've already seen, Python's version of scientific\nnotation is `XeY`, which means $X\\cdot10^{Y}$.\n\nA second note is that the concepts developed here apply outside of Python,\nbut we'll illustrate the principles of computer numbers using Python.\nPython usually makes use of the *double* type (8 bytes) in C for the underlying\nrepresentation of real-valued numbers in C variables, so what we'll really be\nseeing is how such types behave in C on most modern machines.\nIt's actually a bit more complicated in that one can use real-valued numbers\nthat use something other than 8 bytes in numpy by specifying a `dtype`.\n\nThe handling of integers is even more complicated. In numpy, the default\nis 8 byte integers, but other integer dtypes are available. And in Python\nitself, integers can be arbitrarily large.\n\n# 1. Basic representations\n\nEverything in computer memory or on disk is stored in terms of bits. A\n*bit* is essentially a switch than can be either on or off. Thus\neverything is encoded as numbers in base 2, i.e., 0s and 1s. 8 bits make\nup a *byte*. As discussed in Unit 2, for information stored as plain text (ASCII), each byte is\nused to encode a single character (as previously discussed, actually only 7 of the 8 bits are\nactually used, hence there are $2^{7}=128$ ASCII characters). One way to\nrepresent a byte is to write it in hexadecimal, rather than as 8 0/1\nbits. Since there are $2^{8}=256$ possible values in a byte, we can\nrepresent it more compactly as 2 base-16 numbers, such as \"3e\" or \"a0\"\nor \"ba\". A file format is nothing more than a way of interpreting the\nbytes in a file.\n\n\nWe'll create some helper functions to all us to look\nat the underlying binary representation.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nfrom bitstring import Bits\n\ndef bits(x):\n obj = Bits(float = x, length = 64)\n return(obj.bin)\n\ndef dg(x, form = '.20f'):\n print(format(x, form))\n```\n:::\n\n\n\nNote that 'b' is encoded as one\nmore than 'a', and similarly for '0', '1', and '2'.\nWe could check these against, say, the Wikipedia\ntable that shows the [ASCII encoding](https://en.wikipedia.org/wiki/ASCII).\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nBits(bytes=b'a').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'01100001'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'b').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'01100010'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'0').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'00110000'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'1').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'00110001'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'2').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'00110010'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'@').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'01000000'\n```\n:::\n:::\n\n\n\n\nWe can think about how we'd store an integer in terms of bytes. With two\nbytes (16 bits), we could encode any value from $0,\\ldots,2^{16}-1=65535$. This is\nan *unsigned* integer representation. To store negative numbers as well,\nwe can use one bit for the sign, giving us the ability to encode\n-32767 - 32767 ($\\pm2^{15}-1$).\n\nNote that in general, rather than be stored\nsimply as the sign and then a number in base 2, integers (at least the\nnegative ones) are actually stored in different binary encoding to\nfacilitate arithmetic. \n\nHere's what a 64-bit integer representation \nthe actual bits.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.binary_repr(0, width=64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0000000000000000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(1, width=64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0000000000000000000000000000000000000000000000000000000000000001'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(2, width=64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0000000000000000000000000000000000000000000000000000000000000010'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(-1, width=64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'1111111111111111111111111111111111111111111111111111111111111111'\n```\n:::\n:::\n\n\n\nWhat do I mean about facilitating arithmetic? As an example, consider adding\nthe binary representations of -1 and 1. Nice, right?\n\n\nFinally note that the set of computer integers is not closed under\narithmetic. We get an overflow (i.e., a result that is too\nlarge to be stored as an integer of the particular length):\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\na = np.int32(3423333)\na * a # overflows\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-1756921895\n\n:1: RuntimeWarning: overflow encountered in int_scalars\n```\n:::\n\n```{.python .cell-code}\na = np.int64(3423333)\na * a # doesn't overflow if we use 64 bit int\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n11719208828889\n```\n:::\n\n```{.python .cell-code}\na = np.int64(34233332342343)\na * a\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1001093889201452977\n\n:1: RuntimeWarning: overflow encountered in long_scalars\n```\n:::\n:::\n\n\n\nThat said, if we use Python's `int` rather than numpy's integers,\nwe don't get overflow. But we do use more than 8 bytes that would be used\nby numpy.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\na = 34233332342343\na * a\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1171921043261307270950729649\n```\n:::\n\n```{.python .cell-code}\nsys.getsizeof(a)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n32\n```\n:::\n\n```{.python .cell-code}\nsys.getsizeof(a*a)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n36\n```\n:::\n:::\n\n\n\n\nIn C, one generally works with 8 byte real-valued numbers (aka *floating point* numbers or *floats*).\nHowever, many years ago, an initial standard representation used 4 bytes. Then\npeople started using 8 bytes, which became known as *double precision floating points*\nor *doubles*, whereas the 4-byte version became known as *single precision*.\nNow with GPUs, single precision is often used for speed and reduced memory use.\n\nLet's see how this plays out in terms of memory use in Python.\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = np.random.normal(size = 100000)\nsys.getsizeof(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n800112\n```\n:::\n\n```{.python .cell-code}\nx = np.array(np.random.normal(size = 100000), dtype = \"float32\")\nsys.getsizeof(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n400112\n```\n:::\n\n```{.python .cell-code}\nx = np.array(np.random.normal(size = 100000), dtype = \"float16\") \nsys.getsizeof(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n200112\n```\n:::\n:::\n\n\n\n\nWe can easily calculate the number of megabytes (MB) a vector of\nfloating points (in double precision) will use as the number of elements\ntimes 8 (bytes/double) divided by $10^{6}$ to convert from bytes to\nmegabytes. (In some cases when considering computer memory, a megabyte\nis $1,048,576=2^{20}=1024^{2}$ bytes (this is formally called a\n*mebibyte*) so slightly different than $10^{6}$ -- see [here for more\ndetails](https://en.wikipedia.org/wiki/Megabyte)).\n\nFinally, `numpy` has some helper functions that can tell us\nabout the characteristics of computer\nnumbers on the machine that Python is running.\n\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.iinfo(np.int32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\niinfo(min=-2147483648, max=2147483647, dtype=int32)\n```\n:::\n\n```{.python .cell-code}\nnp.iinfo(np.int64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\niinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(2147483647, width=32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'01111111111111111111111111111111'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(-2147483648, width=32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'10000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(2147483648, width=32) # strange\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'10000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(1, width=32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'00000000000000000000000000000001'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(-1, width=32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'11111111111111111111111111111111'\n```\n:::\n:::\n\n\n\nSo the max for a 32-bit (4-byte) integer is $2147483647=2^{31}-1$, which\nis consistent with 4 bytes. Since we have both negative and\npositive numbers, we have $2\\cdot2^{31}=2^{32}=(2^{8})^{4}$, i.e., 4\nbytes, with each byte having 8 bits.\n\n\n# 2. Floating point basics\n\n## Representing real numbers\n\n### Initial exploration\n\nReals (also called floating points) are stored on the computer as an\napproximation, albeit a very precise approximation. As an example, if we\nrepresent the distance from the earth to the sun using a double, the\nerror is around a millimeter. However, we need to be very careful if\nwe're trying to do a calculation that produces a very small (or very\nlarge number) and particularly when we want to see if numbers are equal\nto each other.\n\nIf you run the code here, the results may surprise you.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n0.3 - 0.2 == 0.1\n0.3\n0.2\n0.1 # Hmmm...\n\nnp.float64(0.3) - np.float64(0.2) == np.float64(0.1)\n\n0.75 - 0.5 == 0.25\n0.6 - 0.4 == 0.2\n## any ideas what is different about those two comparisons?\n```\n:::\n\n\n\nNext, let's consider the number of digits of accuracy\nwe have for a variety of numbers. We'll use `format` within\na handy wrapper function, `dg`, defined earlier, to view as many digits as we want:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\na = 0.3\nb = 0.2\ndg(a)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.29999999999999998890\n```\n:::\n\n```{.python .cell-code}\ndg(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000001110\n```\n:::\n\n```{.python .cell-code}\ndg(a-b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.09999999999999997780\n```\n:::\n\n```{.python .cell-code}\ndg(0.1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.10000000000000000555\n```\n:::\n\n```{.python .cell-code}\ndg(1/3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.33333333333333331483\n```\n:::\n:::\n\n\n\nSo empirically, it looks like we're accurate up to the 16th decimal place\n\nBut actually, the key is the number of digits, not decimal places.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(1234.1234)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1234.12339999999994688551\n```\n:::\n\n```{.python .cell-code}\ndg(1234.123412341234)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1234.12341234123391586763\n```\n:::\n:::\n\n\n\nNotice that we can represent the result accurately only up to 16\nsignificant digits. This suggests no need to show more than 16\nsignificant digits and no need to print out any more when writing to a\nfile (except that if the number is bigger than $10^{16}$ then we need\nextra digits to correctly show the magnitude of the number if not using\nscientific notation). And of course, often we don't need anywhere near\nthat many.\n\nLet's return to our comparison, `0.75-0.5 == 0.25`.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(0.75)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.75000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(0.50)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.50000000000000000000\n```\n:::\n:::\n\n\n\nWhat's different about the numbers 0.75 and 0.5 compared to 0.3, 0.2,\n0.1?\n\n### Machine epsilon\n\n\n*Machine epsilon* is the term used for indicating the\n(relative) accuracy of real numbers and it is defined as the smallest\nfloat, $x$, such that $1+x\\ne1$:\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n1e-16 + 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.0\n```\n:::\n\n```{.python .cell-code}\nnp.array(1e-16) + np.array(1.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.0\n```\n:::\n\n```{.python .cell-code}\n1e-15 + 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.000000000000001\n```\n:::\n\n```{.python .cell-code}\nnp.array(1e-15) + np.array(1.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.000000000000001\n```\n:::\n\n```{.python .cell-code}\n2e-16 + 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.0000000000000002\n```\n:::\n\n```{.python .cell-code}\nnp.finfo(np.float64).eps\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2.220446049250313e-16\n```\n:::\n\n```{.python .cell-code}\ndg(2e-16 + 1.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.00000000000000022204\n```\n:::\n:::\n\n::: {.cell}\n\n```{.python .cell-code}\n## What about in single precision, e.g. on a GPU?\nnp.finfo(np.float32).eps\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.1920929e-07\n```\n:::\n:::\n\n\n\n\n### Floating point representation\n\n*Floating point* refers to the decimal point (or *radix* point since we'll\nbe working with base 2 and *decimal* relates to 10). \n\nTo proceed further we need to consider scientific notation, such as in writing Avogadro's\nnumber as $+6.023\\times10^{23}$. As a\nbaseline for what is about to follow note that we can express a decimal\nnumber in the following expansion\n$$6.037=6\\times10^{0}+0\\times10^{-1}+3\\times10^{-2}+7\\times10^{-3}$$ A real number on a\ncomputer is stored in what is basically scientific notation:\n$$\\pm d_{0}.d_{1}d_{2}\\ldots d_{p}\\times b^{e}\\label{eq:floatRep}$$\nwhere $b$ is the base, $e$ is an integer and $d_{i}\\in\\{0,\\ldots,b-1\\}$.\n$e$ is called the *exponent* and $d=d_{1}d_{2}\\ldots d_{p}$ is called the *mantissa*.\n\nLet's consider the choices that the computer pioneers needed to make\nin using this system to represent numbers on a computer using base 2 ($b=2$).\nFirst, we need to choose the number of bits to represent $e$ so that we\ncan represent sufficiently large and small numbers. Second we need to\nchoose the number of bits, $p$, to allocate to \n$d=d_{1}d_{2}\\ldots d_{p}$, which determines the accuracy of any\ncomputer representation of a real.\n\nThe great thing about floating points\nis that we can represent numbers that range from incredibly small to\nvery large while maintaining good precision. The floating point *floats*\nto adjust to the size of the number. Suppose we had only three digits to\nuse and were in base 10. In floating point notation we can express\n$0.12\\times0.12=0.0144$ as\n$(1.20\\times10^{-1})\\times(1.20\\times10^{-1})=1.44\\times10^{-2}$, but if\nwe had fixed the decimal point, we'd have $0.120\\times0.120=0.014$ and\nwe'd have lost a digit of accuracy. (Furthermore, we wouldn't be able\nto represent numbers bigger than $0.99$.)\n\nMore specifically, the actual storage of a number on a computer these\ndays is generally as a double in the form:\n$$(-1)^{S}\\times1.d\\times2^{e-1023}=(-1)^{S}\\times1.d_{1}d_{2}\\ldots d_{52}\\times2^{e-1023}$$\nwhere the computer uses base 2, $b=2$, (so $d_{i}\\in\\{0,1\\}$) because\nbase-2 arithmetic is faster than base-10 arithmetic. The leading 1\nnormalizes the number; i.e., ensures there is a unique representation\nfor a given computer number. This avoids representing any number in\nmultiple ways, e.g., either\n$1=1.0\\times2^{0}=0.1\\times2^{1}=0.01\\times2^{2}$. For a double, we have\n8 bytes=64 bits. Consider our representation as ($S,d,e$) where $S$ is\nthe sign. The leading 1 is the *hidden bit* and doesn't need to be\nstored because it is always present. In general $e$ is\nrepresented using 11 bits ($2^{11}=2048$), and the subtraction takes the\nplace of having a sign bit for the exponent. (Note that in our\ndiscussion we'll just think of $e$ in terms of its base 10\nrepresentation, although it is of course represented in base 2.) This\nleaves $p=52 = 64-1-11$ bits for $d$.\n\nIn this code I force storage as a double by tacking on a decimal place, `.0`.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nbits(2.0**(-1)) # 1/2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111111100000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2.0**0) # 1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111111110000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2.0**1) # 2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100000000000000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2.0**1 + 2.0**0) # 3\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100000000001000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2.0**2) # 4\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100000000010000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(-2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'1100000000000000000000000000000000000000000000000000000000000000'\n```\n:::\n:::\n\n\n\nLet's see that we can manually work out the bit-wise representation\nof 3.25:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nbits(3.25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100000000001010000000000000000000000000000000000000000000000000'\n```\n:::\n:::\n\n\n\n**Question**: Given a fixed number of bits for a number, what is the\ntradeoff between using bits for the $d$ part vs. bits for the $e$ part?\n\nLet's consider what can be represented exactly:\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(.1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.10000000000000000555\n```\n:::\n\n```{.python .cell-code}\ndg(.5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.50000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(.25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.25000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(.26)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.26000000000000000888\n```\n:::\n\n```{.python .cell-code}\ndg(1/32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.03125000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(1/33)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.03030303030303030387\n```\n:::\n:::\n\n\n\nSo why is 0.5 stored exactly and 0.1 not stored exactly? By analogy,\nconsider the difficulty with representing 1/3 in base 10.\n\n## Overflow and underflow\n\nThe largest and smallest numbers we can represent are $2^{e_{\\max}}$ and\n$2^{e_{\\min}}$ where $e_{\\max}$ and $e_{\\min}$ are the smallest and\nlargest possible values of the exponent. Let's consider the exponent and\nwhat we can infer about the range of possible numbers. With 11 bits for\n$e$, we can represent $\\pm2^{10}=\\pm1024$ different exponent values (see\n`np.finfo(np.float64).maxexp`) (why is `np.finfo(np.float64).minexp` only\n-1022?). So the largest number we could represent is $2^{1024}$. What\nis this in base 10?\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = np.float64(10)\nx**308\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1e+308\n```\n:::\n\n```{.python .cell-code}\nx**309\n```\n\n::: {.cell-output .cell-output-stdout}\n```\ninf\n\n:1: RuntimeWarning: overflow encountered in double_scalars\n```\n:::\n\n```{.python .cell-code}\nnp.log10(2.0**1024)\n```\n\n::: {.cell-output .cell-output-error}\n```\nError: OverflowError: (34, 'Numerical result out of range')\n```\n:::\n\n```{.python .cell-code}\nnp.log10(2.0**1023)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n307.95368556425274\n```\n:::\n\n```{.python .cell-code}\nnp.finfo(np.float64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfinfo(resolution=1e-15, min=-1.7976931348623157e+308, max=1.7976931348623157e+308, dtype=float64)\n```\n:::\n:::\n\n\n\nWe could have been smarter about that calculation:\n$\\log_{10}2^{1024}=\\log_{2}2^{1024}/\\log_{2}10=1024/3.32\\approx308$. The\nresult is analogous for the smallest number, so we have that floating\npoints can range between $1\\times10^{-308}$ and $1\\times10^{308}$,\nconsistent with what numpy reports above. Producing\nsomething larger or smaller in magnitude than these values is called\noverflow and underflow respectively.\n\nLet's see what happens when we underflow in numpy. Note that there is no warning.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx**(-308)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1e-308\n```\n:::\n\n```{.python .cell-code}\nx**(-330)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0\n```\n:::\n:::\n\n\n\nSomething subtle happens for numbers like $10^{-309}$ through $10^{-323}$. They can actually be represented despite what I said above. Investigating that may be an extra credit problem on a problem set.\n\n\n## Integers or floats?\n\nValues stored as integers should overflow if they exceed the maximum integer.\n\nShould $2^{65}$ overflow?\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.log2(np.iinfo(np.int64).max)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n63.0\n```\n:::\n\n```{.python .cell-code}\nx = np.int64(2)\n# Yikes!\nx**64\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0\n```\n:::\n:::\n\n\n\nPython's `int` type doesn't overflow.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# Interesting:\nprint(2**64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18446744073709551616\n```\n:::\n\n```{.python .cell-code}\nprint(2**100)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1267650600228229401496703205376\n```\n:::\n:::\n\n\n\nOf course, doubles won't overflow until much larger values than 4- or 8-byte integers because we know they can be as big as $10^308$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = np.float64(2)\ndg(x**64, '.2f')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18446744073709551616.00\n```\n:::\n\n```{.python .cell-code}\ndg(x**100, '.2f')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1267650600228229401496703205376.00\n```\n:::\n:::\n\n\n\nHowever we need to think about\nwhat integer-valued numbers can and can't be stored exactly in our base 2 representation of floating point numbers.\nIt turns out that integer-valued numbers can be stored exactly as doubles when their absolute\nvalue is less than $2^{53}$.\n\n> *Challenge*: Why $2^{53}$? Write out what integers can be stored exactly in our base 2 representation of floating point numbers.\n\nYou can force storage as integers or doubles in a few ways.\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = 3; type(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n\n```\n:::\n\n```{.python .cell-code}\nx = np.float64(x); type(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n\n```\n:::\n\n```{.python .cell-code}\nx = 3.0; type(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n\n```\n:::\n\n```{.python .cell-code}\nx = np.float64(3); type(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n\n```\n:::\n:::\n\n\n\n## Precision\n\nConsider our representation as (*S, d, e*) where we have $p=52$ bits for\n$d$. Since we have $2^{52}\\approx0.5\\times10^{16}$, we can represent\nabout that many discrete values, which means we can accurately represent\nabout 16 digits (in base 10). The result is that floats on a computer\nare actually discrete (we have a finite number of bits), and if we get a\nnumber that is in one of the gaps (there are uncountably many reals),\nit's approximated by the nearest discrete value. The accuracy of our\nrepresentation is to within 1/2 of the gap between the two discrete\nvalues bracketing the true number. Let's consider the implications for\naccuracy in working with large and small numbers. By changing $e$ we can\nchange the magnitude of a number. So regardless of whether we have a\nvery large or small number, we have about 16 digits of accuracy, since\nthe absolute spacing depends on what value is represented by the least\nsignificant digit (the *ulp*, or *unit in the last place*) in $d$, i.e.,\nthe $p=52$nd one, or in terms of base 10, the 16th digit. Let's explore\nthis:\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# large vs. small numbers\ndg(.1234123412341234)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12341234123412339607\n```\n:::\n\n```{.python .cell-code}\ndg(1234.1234123412341234) # not accurate to 16 decimal places \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1234.12341234123414324131\n```\n:::\n\n```{.python .cell-code}\ndg(123412341234.123412341234) # only accurate to 4 places \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n123412341234.12341308593750000000\n```\n:::\n\n```{.python .cell-code}\ndg(1234123412341234.123412341234) # no places! \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1234123412341234.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(12341234123412341234) # fewer than no places! \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n12341234123412340736.00000000000000000000\n```\n:::\n:::\n\n\n\nWe can see the implications of this in the context of calculations:\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(1234567812345678.0 - 1234567812345677.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(12345678123456788888.0 - 12345678123456788887.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(12345678123456780000.0 - 12345678123456770000.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n10240.00000000000000000000\n```\n:::\n:::\n\n\n\nThe spacing of possible computer numbers that have a magnitude of about\n1 leads us to another definition of *machine epsilon* (an alternative,\nbut essentially equivalent definition to that given [previously](#machine-epsilon). \nMachine epsilon tells us also about the relative spacing of\nnumbers. First let's consider numbers of magnitude one. The difference\nbetween $1=1.00...00\\times2^{0}$ and $1.000...01\\times2^{0}$ is\n$\\epsilon=1\\times2^{-52}\\approx2.2\\times10^{-16}$. Machine epsilon gives\nthe *absolute spacing* for numbers near 1 and the *relative spacing* for\nnumbers with a different order of magnitude and therefore a different\nabsolute magnitude of the error in representing a real. The relative\nspacing at $x$ is $$\\frac{(1+\\epsilon)x-x}{x}=\\epsilon$$ since the next\nlargest number from $x$ is given by $(1+\\epsilon)x$.\n\nSuppose $x=1\\times10^{6}$. Then the absolute error in representing a\nnumber of this magnitude is $x\\epsilon\\approx2\\times10^{-10}$. (Actually\nthe error would be one-half of the spacing, but that's a minor\ndistinction.) We can see by looking at the numbers in decimal form,\nwhere we are accurate to the order $10^{-10}$ but not $10^{-11}$. This\nis equivalent to our discussion that we have only 16 digits of accuracy.\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(1000000.1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1000000.09999999997671693563\n```\n:::\n:::\n\n\n\nLet's see what arithmetic we can do exactly with integer-valued numbers stored as\ndoubles and how that relates to the absolute spacing of numbers we've\njust seen:\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n2.0**52\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4503599627370496.0\n```\n:::\n\n```{.python .cell-code}\n2.0**52+1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4503599627370497.0\n```\n:::\n\n```{.python .cell-code}\n2.0**53\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9007199254740992.0\n```\n:::\n\n```{.python .cell-code}\n2.0**53+1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9007199254740992.0\n```\n:::\n\n```{.python .cell-code}\n2.0**53+2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9007199254740994.0\n```\n:::\n\n```{.python .cell-code}\ndg(2.0**54)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18014398509481984.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(2.0**54+2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18014398509481984.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(2.0**54+4)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18014398509481988.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\nbits(2**53)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101000000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2**53+1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101000000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2**53+2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101000000000000000000000000000000000000000000000000000001'\n```\n:::\n\n```{.python .cell-code}\nbits(2**54)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101010000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2**54+2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101010000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2**54+4)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101010000000000000000000000000000000000000000000000000001'\n```\n:::\n:::\n\n\n\nThe absolute spacing is $x\\epsilon$, so we have spacings of\n$2^{52}\\times2^{-52}=1$, $2^{53}\\times2^{-52}=2$,\n$2^{54}\\times2^{-52}=4$ for numbers of magnitude $2^{52}$, $2^{53}$, and\n$2^{54}$, respectively.\n\nWith a bit more work (e.g., using Mathematica), one can demonstrate that\ndoubles in Python in general are represented as the nearest number that can\nstored with the 64-bit structure we have discussed and that the spacing\nis as we have discussed. The results below show the spacing that\nresults, in base 10, for numbers around 0.1. The numbers Python reports are\nspaced in increments of individual bits in the base 2 representation.\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(0.1234567812345678)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456779729\n```\n:::\n\n```{.python .cell-code}\ndg(0.12345678123456781)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456781117\n```\n:::\n\n```{.python .cell-code}\ndg(0.12345678123456782)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456782505\n```\n:::\n\n```{.python .cell-code}\ndg(0.12345678123456783)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456782505\n```\n:::\n\n```{.python .cell-code}\ndg(0.12345678123456784)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456783892\n```\n:::\n\n```{.python .cell-code}\nbits(0.1234567812345678)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010000110'\n```\n:::\n\n```{.python .cell-code}\nbits(0.12345678123456781)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010000111'\n```\n:::\n\n```{.python .cell-code}\nbits(0.12345678123456782)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010001000'\n```\n:::\n\n```{.python .cell-code}\nbits(0.12345678123456783)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010001000'\n```\n:::\n\n```{.python .cell-code}\nbits(0.12345678123456784)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010001001'\n```\n:::\n:::\n\n\n\n## Working with higher precision numbers\n\nAs we've seen, Python will automatically work with integers in arbitrary precision.\n(Note that R does not do this -- R uses 4-byte integers, and for many calculations\nit's best to use R's `numeric` type because integers that aren't really large\ncan be expressed exactly.)\n\nFor higher precision floating point numbers you can make use of the `gmpy2`\npackage.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport gmpy2\ngmpy2.get_context().precision=200\ngmpy2.const_pi()\n\n## not sure why this shows ...00004\ngmpy2.mpfr(\".1234567812345678\") \n```\n:::\n\n\n\n\n\n# 3. Implications for calculations and comparisons\n\n## Computer arithmetic is not mathematical arithmetic!\n\nAs mentioned for integers, computer number arithmetic is not closed,\nunlike real arithmetic. For example, if we multiply two computer\nfloating points, we can overflow and not get back another computer\nfloating point. \n\nAnother mathematical concept we should consider here is that computer\narithmetic does not obey the associative and distributive laws, i.e.,\n$(a+b)+c$ may not equal $a+(b+c)$ on a computer and $a(b+c)$ may not be\nthe same as $ab+ac$. Here's an example with multiplication:\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nval1 = 1/10; val2 = 0.31; val3 = 0.57\nres1 = val1*val2*val3\nres2 = val3*val2*val1\nres1 == res2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nFalse\n```\n:::\n\n```{.python .cell-code}\ndg(res1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.01766999999999999821\n```\n:::\n\n```{.python .cell-code}\ndg(res2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.01767000000000000168\n```\n:::\n:::\n\n\n\n## Calculating with integers vs. floating points\n\nIt's important to note that operations with integers are fast and exact\n(but can easily overflow -- albeit not with Python's base `int`) while operations with floating points are\nslower and approximate. Because of this slowness, floating point\noperations (*flops*) dominate calculation intensity and are used as the\nmetric for the amount of work being done - a multiplication (or\ndivision) combined with an addition (or subtraction) is one flop. We'll\ntalk a lot about flops in the unit on linear algebra.\n\n## Comparisons\n\nAs we saw, we should never test `x == y` unless:\n\n 1. `x` and `y` are represented as integers, \n 2. they are integer-valued but stored as doubles that are small enough that they can be stored exactly), or\n 3. they are decimal numbers that have been created in the same way (e.g., `0.4-0.3 == 0.4-0.3` returns `TRUE` but `0.1 == 0.4-0.3` does not). \n\nSimilarly we should be careful\nabout testing `x == 0`. And be careful of greater than/less than\ncomparisons. For example, be careful of `x[ x < 0 ] = np.nan` if what you\nare looking for is values that might be *mathematically* less than zero,\nrather than whatever is *numerically* less than zero.\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n4 - 3 == 1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nTrue\n```\n:::\n\n```{.python .cell-code}\n4.0 - 3.0 == 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nTrue\n```\n:::\n\n```{.python .cell-code}\n4.1 - 3.1 == 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nFalse\n```\n:::\n\n```{.python .cell-code}\n0.4-0.3 == 0.1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nFalse\n```\n:::\n\n```{.python .cell-code}\n0.4-0.3 == 0.4-0.3\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nTrue\n```\n:::\n:::\n\n\n\nOne nice approach to checking for approximate equality is to make use of\n*machine epsilon*. If the relative spacing of two numbers is less than\n*machine epsilon*, then for our computer approximation, we say they are\nthe same. Here's an implementation that relies on the absolute spacing\nbeing $x\\epsilon$ (see above).\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = 12345678123456781000\ny = 12345678123456782000\n\ndef approx_equal(a,b):\n if abs(a - b) < np.finfo(np.float64).eps * abs(a + b):\n print(\"approximately equal\")\n else:\n print (\"not equal\")\n\n\napprox_equal(a,b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nnot equal\n```\n:::\n\n```{.python .cell-code}\nx = 1234567812345678\ny = 1234567812345677\n\napprox_equal(a,b) \n```\n\n::: {.cell-output .cell-output-stdout}\n```\nnot equal\n```\n:::\n:::\n\n\n\nActually, we probably want to use a number slightly larger than\nmachine epsilon to be safe. \n\nFinally, sometimes we encounter the use of an unusual integer\nas a symbol for missing values. E.g., a datafile might store missing\nvalues as -9999. Testing for this using `==` with floats should generally be\nok:` x [ x == -9999 ] = np.nan`, because integers of this magnitude\nare stored exactly as floating point values. But to be really careful, you can read in as\nan integer or character type and do the assessment before converting to a float.\n\n## Calculations\n\nGiven the limited *precision* of computer numbers, we need to be careful\nwhen in the following two situations.\n\n1. Subtracting large numbers that are nearly equal (or adding negative\n and positive numbers of the same magnitude). You won't have the\n precision in the answer that you would like. How many decimal places\n of accuracy do we have here?\n\n \n\n\n ::: {.cell}\n \n ```{.python .cell-code}\n # catastrophic cancellation w/ large numbers\n dg(123456781234.56 - 123456781234.00)\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 0.55999755859375000000\n ```\n :::\n :::\n\n\n\n The absolute error in the original numbers here is of the order\n $\\epsilon x=2.2\\times10^{-16}\\cdot1\\times10^{11}\\approx1\\times10^{-5}=.00001$.\n While we might think that the result is close to the value 1 and\n should have error of about machine epsilon, the relevant absolute\n error is in the original numbers, so we actually only have about\n five significant digits in our result because we cancel out the\n other digits.\n\n This is called *catastrophic cancellation*, because most of the\n digits that are left represent rounding error -- many of the significant\n digits have cancelled with each other.\\\n Here's catastrophic cancellation with small numbers. The right\n answer here is exactly 0.000000000000000000001234.\n\n \n\n\n ::: {.cell}\n \n ```{.python .cell-code}\n # catastrophic cancellation w/ small numbers\n x = .000000000000123412341234\n y = .000000000000123412340000\n \n # So we know the right answer is .000000000000000000001234 exactly. \n \n dg(x-y, '.35f')\n ## [1] \"0.00000000000000000000123399999315140\"\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 0.00000000000000000000123399999315140\n ```\n :::\n :::\n\n\n\n But the result is accurate only to 8 places + 20 = 28 decimal\n places, as expected from a machine precision-based calculation,\n since the \"1\" is in the 13th position, after 12 zeroes (12+16=28).\n Ideally, we would have accuracy to 36 places (16 digits + the 20\n zeroes), but we've lost 8 digits to catastrophic cancellation.\n\n It's best to do any subtraction on numbers that are not too large.\n For example, if we compute the sum of squares in a naive way, we can\n lose all of the information in the calculation because the\n information is in digits that are not computed or stored accurately:\n $$s^{2}=\\sum x_{i}^{2}-n\\bar{x}^{2}$$\n\n \n\n\n ::: {.cell}\n \n ```{.python .cell-code}\n ## No problem here:\n x = np.array([-1.0, 0.0, 1.0])\n n = len(x)\n np.sum(x**2)-n*np.mean(x)**2 \n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 2.0\n ```\n :::\n \n ```{.python .cell-code}\n np.sum((x - np.mean(x))**2)\n \n ## Adding/subtracting a constant shouldn't change the result:\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 2.0\n ```\n :::\n \n ```{.python .cell-code}\n x = x + 1e8\n np.sum(x**2)-n*np.mean(x)**2 ## YIKES!\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 0.0\n ```\n :::\n \n ```{.python .cell-code}\n np.sum((x - np.mean(x))**2)\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 2.0\n ```\n :::\n :::\n\n\n\n A good principle to take away is to subtract off a number similar in\n magnitude to the values (in this case $\\bar{x}$ is obviously ideal)\n and adjust your calculation accordingly. In general, you can\n sometimes rearrange your calculation to avoid catastrophic\n cancellation. Another example involves the quadratic formula for\n finding a root (p. 101 of Gentle).\n\n2. Adding or subtracting numbers that are very different in magnitude.\n The precision will be that of the large magnitude number, since we\n can only represent that number to a certain absolute accuracy, which\n is much less than the absolute accuracy of the smaller number:\n\n \n\n\n ::: {.cell}\n \n ```{.python .cell-code}\n dg(123456781234.2)\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19999694824218750000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.1) # truth: 123456781234.1\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.09999084472656250000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.01) # truth: 123456781234.19\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19000244140625000000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.001) # truth: 123456781234.199\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19898986816406250000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.0001) # truth: 123456781234.1999\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19989013671875000000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.00001) # truth: 123456781234.19999\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19998168945312500000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.000001) # truth: 123456781234.199999\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19999694824218750000\n ```\n :::\n \n ```{.python .cell-code}\n 123456781234.2 - 0.000001 == 123456781234.2\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n True\n ```\n :::\n :::\n\n\n\n The larger number in the calculations above is of magnitude\n $10^{11}$, so the absolute error in representing the larger number\n is around $1\\times10^{^{-5}}$. Thus in the calculations above we can\n only expect the answers to be accurate to about $1\\times10^{-5}$. In\n the last calculation above, the smaller number is smaller than\n $1\\times10^{-5}$ and so doing the subtraction has had no effect.\n This is analogous to trying to do $1+1\\times10^{-16}$ and seeing\n that the result is still 1.\n\n A work-around when we are adding numbers of very different\n magnitudes is to add a set of numbers in increasing order. However,\n if the numbers are all of similar magnitude, then by the time you\n add ones later in the summation, the partial sum will be much larger\n than the new term. A (second) work-around to that problem is to add\n the numbers in a tree-like fashion, so that each addition involves a\n summation of numbers of similar size.\n\nGiven the limited *range* of computer numbers, be careful when you are:\n\n- Multiplying or dividing many numbers, particularly large or small\n ones. **Never take the product of many large or small numbers** as this\n can cause over- or under-flow. Rather compute on the log scale and\n only at the end of your computations should you exponentiate. E.g.,\n $$\\prod_{i}x_{i}/\\prod_{j}y_{j}=\\exp(\\sum_{i}\\log x_{i}-\\sum_{j}\\log y_{j})$$\n\nLet's consider some challenges that illustrate that last concern.\n\n- Challenge: consider multiclass logistic regression, where you have\n quantities like this:\n $$p_{j}=\\text{Prob}(y=j)=\\frac{\\exp(x\\beta_{j})}{\\sum_{k=1}^{K}\\exp(x\\beta_{k})}=\\frac{\\exp(z_{j})}{\\sum_{k=1}^{K}\\exp(z_{k})}$$\n for $z_{k}=x\\beta_{k}$. What will happen if the $z$ values are very\n large in magnitude (either positive or negative)? How can we\n reexpress the equation so as to be able to do the calculation? Hint:\n think about multiplying by $\\frac{c}{c}$ for a carefully chosen $c$.\n\n- Second challenge: The same issue arises in the following\n calculation. Suppose I want to calculate a predictive density (e.g.,\n in a model comparison in a Bayesian context): $$\\begin{aligned}\n f(y^{*}|y,x) & = & \\int f(y^{*}|y,x,\\theta)\\pi(\\theta|y,x)d\\theta\\\\\n & \\approx & \\frac{1}{m}\\sum_{j=1}^{m}\\prod_{i=1}^{n}f(y_{i}^{*}|x,\\theta_{j})\\\\\n & = & \\frac{1}{m}\\sum_{j=1}^{m}\\exp\\sum_{i=1}^{n}\\log f(y_{i}^{*}|x,\\theta_{j})\\\\\n & \\equiv & \\frac{1}{m}\\sum_{j=1}^{m}\\exp(v_{j})\\end{aligned}$$\n First, why do I use the log conditional predictive density? Second,\n let's work with an estimate of the unconditional predictive density\n on the log scale,\n $\\log f(y^{*}|y,x)\\approx\\log\\frac{1}{m}\\sum_{j=1}^{m}\\exp(v_{j})$.\n Now note that $e^{v_{j}}$ may be quite small as $v_{j}$ is the sum\n of log likelihoods. So what happens if we have terms something like\n $e^{-1000}$? So we can't exponentiate each individual $v_{j}$. This\n is what is known as the \"log sum of exponentials\" problem (and the\n solution as the \"log-sum-exp trick\"). Thoughts?\n\nNumerical issues come up frequently in linear algebra. For example, they\ncome up in working with positive definite and semi-positive-definite\nmatrices, such as covariance matrices. You can easily get negative\nnumerical eigenvalues even if all the eigenvalues are positive or\nnon-negative. Here's an example where we use an squared exponential\ncorrelation as a function of time (or distance in 1-d), which is\n*mathematically* positive definite (i.e., all the eigenvalues are\npositive) but not numerically positive definite:\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nxs = np.arange(100)\ndists = np.abs(xs[:, np.newaxis] - xs)\ncorr_matrix = np.exp(-(dists/10)**2) # This is a p.d. matrix (mathematically).\nscipy.linalg.eigvals(corr_matrix)[80:99] # But not numerically!\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.10937946e-16+9.49526594e-17j, -2.10937946e-16-9.49526594e-17j,\n -1.77590164e-16+1.30160558e-16j, -1.77590164e-16-1.30160558e-16j,\n -2.09305049e-16+0.00000000e+00j, 2.23869166e-16+3.21640840e-17j,\n 2.23869166e-16-3.21640840e-17j, 1.98271873e-16+9.08175827e-17j,\n 1.98271873e-16-9.08175827e-17j, -1.49116518e-16+0.00000000e+00j,\n -1.23773149e-16+6.06467275e-17j, -1.23773149e-16-6.06467275e-17j,\n -2.48071368e-18+1.51188749e-16j, -2.48071368e-18-1.51188749e-16j,\n -4.08131705e-17+6.79669911e-17j, -4.08131705e-17-6.79669911e-17j,\n 1.27901871e-16+2.34695655e-17j, 1.27901871e-16-2.34695655e-17j,\n 5.23476667e-17+4.08642121e-17j])\n```\n:::\n:::\n\n\n\n## Final note\n\nHow the computer actually does arithmetic with the floating point\nrepresentation in base 2 gets pretty complicated, and we won't go into\nthe details. These rules of thumb should be enough for our practical\npurposes. Monahan and the URL reference have many of the gory details.\n", + "markdown": "---\ntitle: \"Numbers on a computer\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-12\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nengine: knitr\n---\n\n\n\n[PDF](./unit8-numbers.pdf){.btn .btn-primary}\n\n\n\n::: {.cell}\n\n:::\n\n\n\n\nReferences:\n\n- Gentle, Computational Statistics, Chapter 2.\n- [http://www.lahey.com/float.htm](http://www.lahey.com/float.htm)\n- And for more gory detail, see Monahan, Chapter 2.\n\nA quick note that, as we've already seen, Python's version of scientific\nnotation is `XeY`, which means $X\\cdot10^{Y}$.\n\nA second note is that the concepts developed here apply outside of Python,\nbut we'll illustrate the principles of computer numbers using Python.\nPython usually makes use of the *double* type (8 bytes) in C for the underlying\nrepresentation of real-valued numbers in C variables, so what we'll really be\nseeing is how such types behave in C on most modern machines.\nIt's actually a bit more complicated in that one can use real-valued numbers\nthat use something other than 8 bytes in numpy by specifying a `dtype`.\n\nThe handling of integers is even more complicated. In numpy, the default\nis 8 byte integers, but other integer dtypes are available. And in Python\nitself, integers can be arbitrarily large.\n\n# 1. Basic representations\n\nEverything in computer memory or on disk is stored in terms of bits. A\n*bit* is essentially a switch than can be either on or off. Thus\neverything is encoded as numbers in base 2, i.e., 0s and 1s. 8 bits make\nup a *byte*. As discussed in Unit 2, for information stored as plain text (ASCII), each byte is\nused to encode a single character (as previously discussed, actually only 7 of the 8 bits are\nactually used, hence there are $2^{7}=128$ ASCII characters). One way to\nrepresent a byte is to write it in hexadecimal, rather than as 8 0/1\nbits. Since there are $2^{8}=256$ possible values in a byte, we can\nrepresent it more compactly as 2 base-16 numbers, such as \"3e\" or \"a0\"\nor \"ba\". A file format is nothing more than a way of interpreting the\nbytes in a file.\n\n\nWe'll create some helper functions to all us to look\nat the underlying binary representation.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nfrom bitstring import Bits\n\ndef bits(x):\n obj = Bits(float = x, length = 64)\n return(obj.bin)\n\ndef dg(x, form = '.20f'):\n print(format(x, form))\n```\n:::\n\n\n\nNote that 'b' is encoded as one\nmore than 'a', and similarly for '0', '1', and '2'.\nWe could check these against, say, the Wikipedia\ntable that shows the [ASCII encoding](https://en.wikipedia.org/wiki/ASCII).\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nBits(bytes=b'a').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'01100001'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'b').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'01100010'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'0').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'00110000'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'1').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'00110001'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'2').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'00110010'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'@').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'01000000'\n```\n:::\n:::\n\n\n\n\nWe can think about how we'd store an integer in terms of bytes. With two\nbytes (16 bits), we could encode any value from $0,\\ldots,2^{16}-1=65535$. This is\nan *unsigned* integer representation. To store negative numbers as well,\nwe can use one bit for the sign, giving us the ability to encode\n-32767 - 32767 ($\\pm2^{15}-1$).\n\nNote that in general, rather than be stored\nsimply as the sign and then a number in base 2, integers (at least the\nnegative ones) are actually stored in different binary encoding to\nfacilitate arithmetic. \n\nHere's what a 64-bit integer representation \nthe actual bits.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.binary_repr(0, width=64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0000000000000000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(1, width=64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0000000000000000000000000000000000000000000000000000000000000001'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(2, width=64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0000000000000000000000000000000000000000000000000000000000000010'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(-1, width=64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'1111111111111111111111111111111111111111111111111111111111111111'\n```\n:::\n:::\n\n\n\nWhat do I mean about facilitating arithmetic? As an example, consider adding\nthe binary representations of -1 and 1. Nice, right?\n\n\nFinally note that the set of computer integers is not closed under\narithmetic. We get an overflow (i.e., a result that is too\nlarge to be stored as an integer of the particular length):\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\na = np.int32(3423333)\na * a # overflows\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-1756921895\n\n:1: RuntimeWarning: overflow encountered in int_scalars\n```\n:::\n\n```{.python .cell-code}\na = np.int64(3423333)\na * a # doesn't overflow if we use 64 bit int\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n11719208828889\n```\n:::\n\n```{.python .cell-code}\na = np.int64(34233332342343)\na * a\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1001093889201452977\n\n:1: RuntimeWarning: overflow encountered in long_scalars\n```\n:::\n:::\n\n\n\nThat said, if we use Python's `int` rather than numpy's integers,\nwe don't get overflow. But we do use more than 8 bytes that would be used\nby numpy.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\na = 34233332342343\na * a\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1171921043261307270950729649\n```\n:::\n\n```{.python .cell-code}\nsys.getsizeof(a)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n32\n```\n:::\n\n```{.python .cell-code}\nsys.getsizeof(a*a)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n36\n```\n:::\n:::\n\n\n\n\nIn C, one generally works with 8 byte real-valued numbers (aka *floating point* numbers or *floats*).\nHowever, many years ago, an initial standard representation used 4 bytes. Then\npeople started using 8 bytes, which became known as *double precision floating points*\nor *doubles*, whereas the 4-byte version became known as *single precision*.\nNow with GPUs, single precision is often used for speed and reduced memory use.\n\nLet's see how this plays out in terms of memory use in Python.\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = np.random.normal(size = 100000)\nsys.getsizeof(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n800112\n```\n:::\n\n```{.python .cell-code}\nx = np.array(np.random.normal(size = 100000), dtype = \"float32\")\nsys.getsizeof(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n400112\n```\n:::\n\n```{.python .cell-code}\nx = np.array(np.random.normal(size = 100000), dtype = \"float16\") \nsys.getsizeof(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n200112\n```\n:::\n:::\n\n\n\n\nWe can easily calculate the number of megabytes (MB) a vector of\nfloating points (in double precision) will use as the number of elements\ntimes 8 (bytes/double) divided by $10^{6}$ to convert from bytes to\nmegabytes. (In some cases when considering computer memory, a megabyte\nis $1,048,576=2^{20}=1024^{2}$ bytes (this is formally called a\n*mebibyte*) so slightly different than $10^{6}$ -- see [here for more\ndetails](https://en.wikipedia.org/wiki/Megabyte)).\n\nFinally, `numpy` has some helper functions that can tell us\nabout the characteristics of computer\nnumbers on the machine that Python is running.\n\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.iinfo(np.int32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\niinfo(min=-2147483648, max=2147483647, dtype=int32)\n```\n:::\n\n```{.python .cell-code}\nnp.iinfo(np.int64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\niinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(2147483647, width=32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'01111111111111111111111111111111'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(-2147483648, width=32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'10000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(2147483648, width=32) # strange\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'10000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(1, width=32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'00000000000000000000000000000001'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(-1, width=32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'11111111111111111111111111111111'\n```\n:::\n:::\n\n\n\nSo the max for a 32-bit (4-byte) integer is $2147483647=2^{31}-1$, which\nis consistent with 4 bytes. Since we have both negative and\npositive numbers, we have $2\\cdot2^{31}=2^{32}=(2^{8})^{4}$, i.e., 4\nbytes, with each byte having 8 bits.\n\n\n# 2. Floating point basics\n\n## Representing real numbers\n\n### Initial exploration\n\nReals (also called floating points) are stored on the computer as an\napproximation, albeit a very precise approximation. As an example, if we\nrepresent the distance from the earth to the sun using a double, the\nerror is around a millimeter. However, we need to be very careful if\nwe're trying to do a calculation that produces a very small (or very\nlarge number) and particularly when we want to see if numbers are equal\nto each other.\n\nIf you run the code here, the results may surprise you.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n0.3 - 0.2 == 0.1\n0.3\n0.2\n0.1 # Hmmm...\n\nnp.float64(0.3) - np.float64(0.2) == np.float64(0.1)\n\n0.75 - 0.5 == 0.25\n0.6 - 0.4 == 0.2\n## any ideas what is different about those two comparisons?\n```\n:::\n\n\n\nNext, let's consider the number of digits of accuracy\nwe have for a variety of numbers. We'll use `format` within\na handy wrapper function, `dg`, defined earlier, to view as many digits as we want:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\na = 0.3\nb = 0.2\ndg(a)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.29999999999999998890\n```\n:::\n\n```{.python .cell-code}\ndg(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000001110\n```\n:::\n\n```{.python .cell-code}\ndg(a-b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.09999999999999997780\n```\n:::\n\n```{.python .cell-code}\ndg(0.1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.10000000000000000555\n```\n:::\n\n```{.python .cell-code}\ndg(1/3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.33333333333333331483\n```\n:::\n:::\n\n\n\nSo empirically, it looks like we're accurate up to the 16th decimal place\n\nBut actually, the key is the number of digits, not decimal places.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(1234.1234)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1234.12339999999994688551\n```\n:::\n\n```{.python .cell-code}\ndg(1234.123412341234)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1234.12341234123391586763\n```\n:::\n:::\n\n\n\nNotice that we can represent the result accurately only up to 16\nsignificant digits. This suggests no need to show more than 16\nsignificant digits and no need to print out any more when writing to a\nfile (except that if the number is bigger than $10^{16}$ then we need\nextra digits to correctly show the magnitude of the number if not using\nscientific notation). And of course, often we don't need anywhere near\nthat many.\n\nLet's return to our comparison, `0.75-0.5 == 0.25`.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(0.75)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.75000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(0.50)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.50000000000000000000\n```\n:::\n:::\n\n\n\nWhat's different about the numbers 0.75 and 0.5 compared to 0.3, 0.2,\n0.1?\n\n### Machine epsilon\n\n\n*Machine epsilon* is the term used for indicating the\n(relative) accuracy of real numbers and it is defined as the smallest\nfloat, $x$, such that $1+x\\ne1$:\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n1e-16 + 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.0\n```\n:::\n\n```{.python .cell-code}\nnp.array(1e-16) + np.array(1.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.0\n```\n:::\n\n```{.python .cell-code}\n1e-15 + 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.000000000000001\n```\n:::\n\n```{.python .cell-code}\nnp.array(1e-15) + np.array(1.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.000000000000001\n```\n:::\n\n```{.python .cell-code}\n2e-16 + 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.0000000000000002\n```\n:::\n\n```{.python .cell-code}\nnp.finfo(np.float64).eps\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2.220446049250313e-16\n```\n:::\n\n```{.python .cell-code}\ndg(2e-16 + 1.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.00000000000000022204\n```\n:::\n:::\n\n::: {.cell}\n\n```{.python .cell-code}\n## What about in single precision, e.g. on a GPU?\nnp.finfo(np.float32).eps\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.1920929e-07\n```\n:::\n:::\n\n\n\n\n### Floating point representation\n\n*Floating point* refers to the decimal point (or *radix* point since we'll\nbe working with base 2 and *decimal* relates to 10). \n\nTo proceed further we need to consider scientific notation, such as in writing Avogadro's\nnumber as $+6.023\\times10^{23}$. As a\nbaseline for what is about to follow note that we can express a decimal\nnumber in the following expansion\n$$6.037=6\\times10^{0}+0\\times10^{-1}+3\\times10^{-2}+7\\times10^{-3}$$ A real number on a\ncomputer is stored in what is basically scientific notation:\n$$\\pm d_{0}.d_{1}d_{2}\\ldots d_{p}\\times b^{e}\\label{eq:floatRep}$$\nwhere $b$ is the base, $e$ is an integer and $d_{i}\\in\\{0,\\ldots,b-1\\}$.\n$e$ is called the *exponent* and $d=d_{1}d_{2}\\ldots d_{p}$ is called the *mantissa*.\n\nLet's consider the choices that the computer pioneers needed to make\nin using this system to represent numbers on a computer using base 2 ($b=2$).\nFirst, we need to choose the number of bits to represent $e$ so that we\ncan represent sufficiently large and small numbers. Second we need to\nchoose the number of bits, $p$, to allocate to \n$d=d_{1}d_{2}\\ldots d_{p}$, which determines the accuracy of any\ncomputer representation of a real.\n\nThe great thing about floating points\nis that we can represent numbers that range from incredibly small to\nvery large while maintaining good precision. The floating point *floats*\nto adjust to the size of the number. Suppose we had only three digits to\nuse and were in base 10. In floating point notation we can express\n$0.12\\times0.12=0.0144$ as\n$(1.20\\times10^{-1})\\times(1.20\\times10^{-1})=1.44\\times10^{-2}$, but if\nwe had fixed the decimal point, we'd have $0.120\\times0.120=0.014$ and\nwe'd have lost a digit of accuracy. (Furthermore, we wouldn't be able\nto represent numbers bigger than $0.99$.)\n\nMore specifically, the actual storage of a number on a computer these\ndays is generally as a double in the form:\n$$(-1)^{S}\\times1.d\\times2^{e-1023}=(-1)^{S}\\times1.d_{1}d_{2}\\ldots d_{52}\\times2^{e-1023}$$\nwhere the computer uses base 2, $b=2$, (so $d_{i}\\in\\{0,1\\}$) because\nbase-2 arithmetic is faster than base-10 arithmetic. The leading 1\nnormalizes the number; i.e., ensures there is a unique representation\nfor a given computer number. This avoids representing any number in\nmultiple ways, e.g., either\n$1=1.0\\times2^{0}=0.1\\times2^{1}=0.01\\times2^{2}$. For a double, we have\n8 bytes=64 bits. Consider our representation as ($S,d,e$) where $S$ is\nthe sign. The leading 1 is the *hidden bit* and doesn't need to be\nstored because it is always present. In general $e$ is\nrepresented using 11 bits ($2^{11}=2048$), and the subtraction takes the\nplace of having a sign bit for the exponent. (Note that in our\ndiscussion we'll just think of $e$ in terms of its base 10\nrepresentation, although it is of course represented in base 2.) This\nleaves $p=52 = 64-1-11$ bits for $d$.\n\nIn this code I force storage as a double by tacking on a decimal place, `.0`.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nbits(2.0**(-1)) # 1/2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111111100000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2.0**0) # 1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111111110000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2.0**1) # 2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100000000000000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2.0**1 + 2.0**0) # 3\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100000000001000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2.0**2) # 4\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100000000010000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(-2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'1100000000000000000000000000000000000000000000000000000000000000'\n```\n:::\n:::\n\n\n\nLet's see that we can manually work out the bit-wise representation\nof 3.25:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nbits(3.25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100000000001010000000000000000000000000000000000000000000000000'\n```\n:::\n:::\n\n\n\nSo that is $1.101 \\times 2^{1024-1023} = 1\\times 2^{1} + 1\\times 2^{0} + 1\\times 2^{-2}$, where the 2nd through 12th\nbits are $10000000000$, which code for $1\\times 2^{10}=1024$.\n\n**Question**: Given a fixed number of bits for a number, what is the\ntradeoff between using bits for the $d$ part vs. bits for the $e$ part?\n\nLet's consider what can be represented exactly:\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(.1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.10000000000000000555\n```\n:::\n\n```{.python .cell-code}\ndg(.5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.50000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(.25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.25000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(.26)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.26000000000000000888\n```\n:::\n\n```{.python .cell-code}\ndg(1/32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.03125000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(1/33)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.03030303030303030387\n```\n:::\n:::\n\n\n\nSo why is 0.5 stored exactly and 0.1 not stored exactly? By analogy,\nconsider the difficulty with representing 1/3 in base 10.\n\n## Overflow and underflow\n\nThe largest and smallest numbers we can represent are $2^{e_{\\max}}$ and\n$2^{e_{\\min}}$ where $e_{\\max}$ and $e_{\\min}$ are the smallest and\nlargest possible values of the exponent. Let's consider the exponent and\nwhat we can infer about the range of possible numbers. With 11 bits for\n$e$, we can represent $\\pm2^{10}=\\pm1024$ different exponent values (see\n`np.finfo(np.float64).maxexp`) (why is `np.finfo(np.float64).minexp` only\n-1022?). So the largest number we could represent is $2^{1024}$. What\nis this in base 10?\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = np.float64(10)\nx**308\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1e+308\n```\n:::\n\n```{.python .cell-code}\nx**309\n```\n\n::: {.cell-output .cell-output-stdout}\n```\ninf\n\n:1: RuntimeWarning: overflow encountered in double_scalars\n```\n:::\n\n```{.python .cell-code}\nnp.log10(2.0**1024)\n```\n\n::: {.cell-output .cell-output-error}\n```\nError: OverflowError: (34, 'Numerical result out of range')\n```\n:::\n\n```{.python .cell-code}\nnp.log10(2.0**1023)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n307.95368556425274\n```\n:::\n\n```{.python .cell-code}\nnp.finfo(np.float64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfinfo(resolution=1e-15, min=-1.7976931348623157e+308, max=1.7976931348623157e+308, dtype=float64)\n```\n:::\n:::\n\n\n\nWe could have been smarter about that calculation:\n$\\log_{10}2^{1024}=\\log_{2}2^{1024}/\\log_{2}10=1024/3.32\\approx308$. The\nresult is analogous for the smallest number, so we have that floating\npoints can range between $1\\times10^{-308}$ and $1\\times10^{308}$,\nconsistent with what numpy reports above. Producing\nsomething larger or smaller in magnitude than these values is called\noverflow and underflow respectively.\n\nLet's see what happens when we underflow in numpy. Note that there is no warning.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx**(-308)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1e-308\n```\n:::\n\n```{.python .cell-code}\nx**(-330)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0\n```\n:::\n:::\n\n\n\nSomething subtle happens for numbers like $10^{-309}$ through $10^{-323}$. They can actually be represented despite what I said above. Investigating that may be an extra credit problem on a problem set.\n\n\n## Integers or floats?\n\nValues stored as integers should overflow if they exceed the maximum integer.\n\nShould $2^{65}$ overflow?\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.log2(np.iinfo(np.int64).max)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n63.0\n```\n:::\n\n```{.python .cell-code}\nx = np.int64(2)\n# Yikes!\nx**64\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0\n```\n:::\n:::\n\n\n\nPython's `int` type doesn't overflow.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# Interesting:\nprint(2**64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18446744073709551616\n```\n:::\n\n```{.python .cell-code}\nprint(2**100)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1267650600228229401496703205376\n```\n:::\n:::\n\n\n\nOf course, doubles won't overflow until much larger values than 4- or 8-byte integers because we know they can be as big as $10^308$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = np.float64(2)\ndg(x**64, '.2f')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18446744073709551616.00\n```\n:::\n\n```{.python .cell-code}\ndg(x**100, '.2f')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1267650600228229401496703205376.00\n```\n:::\n:::\n\n\n\nHowever we need to think about\nwhat integer-valued numbers can and can't be stored exactly in our base 2 representation of floating point numbers.\nIt turns out that integer-valued numbers can be stored exactly as doubles when their absolute\nvalue is less than $2^{53}$.\n\n> *Challenge*: Why $2^{53}$? Write out what integers can be stored exactly in our base 2 representation of floating point numbers.\n\nYou can force storage as integers or doubles in a few ways.\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = 3; type(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n\n```\n:::\n\n```{.python .cell-code}\nx = np.float64(x); type(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n\n```\n:::\n\n```{.python .cell-code}\nx = 3.0; type(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n\n```\n:::\n\n```{.python .cell-code}\nx = np.float64(3); type(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n\n```\n:::\n:::\n\n\n\n## Precision\n\nConsider our representation as (*S, d, e*) where we have $p=52$ bits for\n$d$. Since we have $2^{52}\\approx0.5\\times10^{16}$, we can represent\nabout that many discrete values, which means we can accurately represent\nabout 16 digits (in base 10). The result is that floats on a computer\nare actually discrete (we have a finite number of bits), and if we get a\nnumber that is in one of the gaps (there are uncountably many reals),\nit's approximated by the nearest discrete value. The accuracy of our\nrepresentation is to within 1/2 of the gap between the two discrete\nvalues bracketing the true number. Let's consider the implications for\naccuracy in working with large and small numbers. By changing $e$ we can\nchange the magnitude of a number. So regardless of whether we have a\nvery large or small number, we have about 16 digits of accuracy, since\nthe absolute spacing depends on what value is represented by the least\nsignificant digit (the *ulp*, or *unit in the last place*) in $d$, i.e.,\nthe $p=52$nd one, or in terms of base 10, the 16th digit. Let's explore\nthis:\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# large vs. small numbers\ndg(.1234123412341234)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12341234123412339607\n```\n:::\n\n```{.python .cell-code}\ndg(1234.1234123412341234) # not accurate to 16 decimal places \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1234.12341234123414324131\n```\n:::\n\n```{.python .cell-code}\ndg(123412341234.123412341234) # only accurate to 4 places \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n123412341234.12341308593750000000\n```\n:::\n\n```{.python .cell-code}\ndg(1234123412341234.123412341234) # no places! \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1234123412341234.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(12341234123412341234) # fewer than no places! \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n12341234123412340736.00000000000000000000\n```\n:::\n:::\n\n\n\nWe can see the implications of this in the context of calculations:\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(1234567812345678.0 - 1234567812345677.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(12345678123456788888.0 - 12345678123456788887.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(12345678123456780000.0 - 12345678123456770000.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n10240.00000000000000000000\n```\n:::\n:::\n\n\n\nThe spacing of possible computer numbers that have a magnitude of about\n1 leads us to another definition of *machine epsilon* (an alternative,\nbut essentially equivalent definition to that given [previously](#machine-epsilon). \nMachine epsilon tells us also about the relative spacing of\nnumbers.\n\nFirst let's consider numbers of magnitude one. The next biggest number we can represent after $1=1.00...00\\times2^{0}$ is $1.000...01\\times2^{0}$. The difference between those two numbers (i.e., the spacing) is\n$$\n\\begin{aligned}\n\\epsilon & = &0.00...01 \\times 2^{0} \\\\\n & =& 0 \\times 2^{0} + 0 \\times 2^{-1} + \\cdots + 0\\times 2^{-51} + 1\\times2^{-52}\\\\\n & =& 1\\times2^{-52}\\\\\n & \\approx & 2.2\\times10^{-16}.\n \\end{aligned}\n $$\n\n\nMachine epsilon gives\nthe *absolute spacing* for numbers near 1 and the *relative spacing* for\nnumbers with a different order of magnitude and therefore a different\nabsolute magnitude of the error in representing a real. The relative\nspacing at $x$ is $$\\frac{(1+\\epsilon)x-x}{x}=\\epsilon$$ since the next\nlargest number from $x$ is given by $(1+\\epsilon)x$.\n\nSuppose $x=1\\times10^{6}$. Then the absolute error in representing a\nnumber of this magnitude is $x\\epsilon\\approx2\\times10^{-10}$. (Actually\nthe error would be one-half of the spacing, but that's a minor\ndistinction.) We can see by looking at the numbers in decimal form,\nwhere we are accurate to the order $10^{-10}$ but not $10^{-11}$. This\nis equivalent to our discussion that we have only 16 digits of accuracy.\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(1000000.1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1000000.09999999997671693563\n```\n:::\n:::\n\n\n\nLet's see what arithmetic we can do exactly with integer-valued numbers stored as\ndoubles and how that relates to the absolute spacing of numbers we've\njust seen:\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n2.0**52\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4503599627370496.0\n```\n:::\n\n```{.python .cell-code}\n2.0**52+1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4503599627370497.0\n```\n:::\n\n```{.python .cell-code}\n2.0**53\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9007199254740992.0\n```\n:::\n\n```{.python .cell-code}\n2.0**53+1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9007199254740992.0\n```\n:::\n\n```{.python .cell-code}\n2.0**53+2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9007199254740994.0\n```\n:::\n\n```{.python .cell-code}\ndg(2.0**54)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18014398509481984.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(2.0**54+2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18014398509481984.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(2.0**54+4)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18014398509481988.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\nbits(2**53)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101000000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2**53+1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101000000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2**53+2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101000000000000000000000000000000000000000000000000000001'\n```\n:::\n\n```{.python .cell-code}\nbits(2**54)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101010000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2**54+2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101010000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2**54+4)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101010000000000000000000000000000000000000000000000000001'\n```\n:::\n:::\n\n\n\nThe absolute spacing is $x\\epsilon$, so we have spacings of\n$2^{52}\\times2^{-52}=1$, $2^{53}\\times2^{-52}=2$,\n$2^{54}\\times2^{-52}=4$ for numbers of magnitude $2^{52}$, $2^{53}$, and\n$2^{54}$, respectively.\n\nWith a bit more work (e.g., using Mathematica), one can demonstrate that\ndoubles in Python in general are represented as the nearest number that can\nstored with the 64-bit structure we have discussed and that the spacing\nis as we have discussed. The results below show the spacing that\nresults, in base 10, for numbers around 0.1. The numbers Python reports are\nspaced in increments of individual bits in the base 2 representation.\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(0.1234567812345678)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456779729\n```\n:::\n\n```{.python .cell-code}\ndg(0.12345678123456781)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456781117\n```\n:::\n\n```{.python .cell-code}\ndg(0.12345678123456782)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456782505\n```\n:::\n\n```{.python .cell-code}\ndg(0.12345678123456783)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456782505\n```\n:::\n\n```{.python .cell-code}\ndg(0.12345678123456784)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456783892\n```\n:::\n\n```{.python .cell-code}\nbits(0.1234567812345678)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010000110'\n```\n:::\n\n```{.python .cell-code}\nbits(0.12345678123456781)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010000111'\n```\n:::\n\n```{.python .cell-code}\nbits(0.12345678123456782)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010001000'\n```\n:::\n\n```{.python .cell-code}\nbits(0.12345678123456783)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010001000'\n```\n:::\n\n```{.python .cell-code}\nbits(0.12345678123456784)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010001001'\n```\n:::\n:::\n\n\n\n## Working with higher precision numbers\n\nAs we've seen, Python will automatically work with integers in arbitrary precision.\n(Note that R does not do this -- R uses 4-byte integers, and for many calculations\nit's best to use R's `numeric` type because integers that aren't really large\ncan be expressed exactly.)\n\nFor higher precision floating point numbers you can make use of the `gmpy2`\npackage.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport gmpy2\ngmpy2.get_context().precision=200\ngmpy2.const_pi()\n\n## not sure why this shows ...00004\ngmpy2.mpfr(\".1234567812345678\") \n```\n:::\n\n\n\n\n\n# 3. Implications for calculations and comparisons\n\n## Computer arithmetic is not mathematical arithmetic!\n\nAs mentioned for integers, computer number arithmetic is not closed,\nunlike real arithmetic. For example, if we multiply two computer\nfloating points, we can overflow and not get back another computer\nfloating point. \n\nAnother mathematical concept we should consider here is that computer\narithmetic does not obey the associative and distributive laws, i.e.,\n$(a+b)+c$ may not equal $a+(b+c)$ on a computer and $a(b+c)$ may not be\nthe same as $ab+ac$. Here's an example with multiplication:\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nval1 = 1/10; val2 = 0.31; val3 = 0.57\nres1 = val1*val2*val3\nres2 = val3*val2*val1\nres1 == res2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nFalse\n```\n:::\n\n```{.python .cell-code}\ndg(res1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.01766999999999999821\n```\n:::\n\n```{.python .cell-code}\ndg(res2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.01767000000000000168\n```\n:::\n:::\n\n\n\n## Calculating with integers vs. floating points\n\nIt's important to note that operations with integers are fast and exact\n(but can easily overflow -- albeit not with Python's base `int`) while operations with floating points are\nslower and approximate. Because of this slowness, floating point\noperations (*flops*) dominate calculation intensity and are used as the\nmetric for the amount of work being done - a multiplication (or\ndivision) combined with an addition (or subtraction) is one flop. We'll\ntalk a lot about flops in the unit on linear algebra.\n\n## Comparisons\n\nAs we saw, we should never test `x == y` unless:\n\n 1. `x` and `y` are represented as integers, \n 2. they are integer-valued but stored as doubles that are small enough that they can be stored exactly), or\n 3. they are decimal numbers that have been created in the same way (e.g., `0.4-0.3 == 0.4-0.3` returns `TRUE` but `0.1 == 0.4-0.3` does not). \n\nSimilarly we should be careful\nabout testing `x == 0`. And be careful of greater than/less than\ncomparisons. For example, be careful of `x[ x < 0 ] = np.nan` if what you\nare looking for is values that might be *mathematically* less than zero,\nrather than whatever is *numerically* less than zero.\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n4 - 3 == 1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nTrue\n```\n:::\n\n```{.python .cell-code}\n4.0 - 3.0 == 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nTrue\n```\n:::\n\n```{.python .cell-code}\n4.1 - 3.1 == 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nFalse\n```\n:::\n\n```{.python .cell-code}\n0.4-0.3 == 0.1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nFalse\n```\n:::\n\n```{.python .cell-code}\n0.4-0.3 == 0.4-0.3\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nTrue\n```\n:::\n:::\n\n\n\nOne nice approach to checking for approximate equality is to make use of\n*machine epsilon*. If the relative spacing of two numbers is less than\n*machine epsilon*, then for our computer approximation, we say they are\nthe same. Here's an implementation that relies on the absolute spacing\nbeing $x\\epsilon$ (see above).\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = 12345678123456781000\ny = 12345678123456782000\n\ndef approx_equal(a,b):\n if abs(a - b) < np.finfo(np.float64).eps * abs(a + b):\n print(\"approximately equal\")\n else:\n print (\"not equal\")\n\n\napprox_equal(a,b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nnot equal\n```\n:::\n\n```{.python .cell-code}\nx = 1234567812345678\ny = 1234567812345677\n\napprox_equal(a,b) \n```\n\n::: {.cell-output .cell-output-stdout}\n```\nnot equal\n```\n:::\n:::\n\n\n\nActually, we probably want to use a number slightly larger than\nmachine epsilon to be safe. \n\nFinally, sometimes we encounter the use of an unusual integer\nas a symbol for missing values. E.g., a datafile might store missing\nvalues as -9999. Testing for this using `==` with floats should generally be\nok:` x [ x == -9999 ] = np.nan`, because integers of this magnitude\nare stored exactly as floating point values. But to be really careful, you can read in as\nan integer or character type and do the assessment before converting to a float.\n\n## Calculations\n\nGiven the limited *precision* of computer numbers, we need to be careful\nwhen in the following two situations.\n\n1. Subtracting large numbers that are nearly equal (or adding negative\n and positive numbers of the same magnitude). You won't have the\n precision in the answer that you would like. How many decimal places\n of accuracy do we have here?\n\n \n\n\n ::: {.cell}\n \n ```{.python .cell-code}\n # catastrophic cancellation w/ large numbers\n dg(123456781234.56 - 123456781234.00)\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 0.55999755859375000000\n ```\n :::\n :::\n\n\n\n The absolute error in the original numbers here is of the order\n $\\epsilon x=2.2\\times10^{-16}\\cdot1\\times10^{11}\\approx1\\times10^{-5}=.00001$.\n While we might think that the result is close to the value 1 and\n should have error of about machine epsilon, the relevant absolute\n error is in the original numbers, so we actually only have about\n five significant digits in our result because we cancel out the\n other digits.\n\n This is called *catastrophic cancellation*, because most of the\n digits that are left represent rounding error -- many of the significant\n digits have cancelled with each other.\\\n Here's catastrophic cancellation with small numbers. The right\n answer here is exactly 0.000000000000000000001234.\n\n \n\n\n ::: {.cell}\n \n ```{.python .cell-code}\n # catastrophic cancellation w/ small numbers\n x = .000000000000123412341234\n y = .000000000000123412340000\n \n # So we know the right answer is .000000000000000000001234 exactly. \n \n dg(x-y, '.35f')\n ## [1] \"0.00000000000000000000123399999315140\"\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 0.00000000000000000000123399999315140\n ```\n :::\n :::\n\n\n\n But the result is accurate only to 8 places + 20 = 28 decimal\n places, as expected from a machine precision-based calculation,\n since the \"1\" is in the 13th position, after 12 zeroes (12+16=28).\n Ideally, we would have accuracy to 36 places (16 digits + the 20\n zeroes), but we've lost 8 digits to catastrophic cancellation.\n\n It's best to do any subtraction on numbers that are not too large.\n For example, if we compute the sum of squares in a naive way, we can\n lose all of the information in the calculation because the\n information is in digits that are not computed or stored accurately:\n $$s^{2}=\\sum x_{i}^{2}-n\\bar{x}^{2}$$\n\n \n\n\n ::: {.cell}\n \n ```{.python .cell-code}\n ## No problem here:\n x = np.array([-1.0, 0.0, 1.0])\n n = len(x)\n np.sum(x**2)-n*np.mean(x)**2 \n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 2.0\n ```\n :::\n \n ```{.python .cell-code}\n np.sum((x - np.mean(x))**2)\n \n ## Adding/subtracting a constant shouldn't change the result:\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 2.0\n ```\n :::\n \n ```{.python .cell-code}\n x = x + 1e8\n np.sum(x**2)-n*np.mean(x)**2 ## YIKES!\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 0.0\n ```\n :::\n \n ```{.python .cell-code}\n np.sum((x - np.mean(x))**2)\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 2.0\n ```\n :::\n :::\n\n\n\n A good principle to take away is to subtract off a number similar in\n magnitude to the values (in this case $\\bar{x}$ is obviously ideal)\n and adjust your calculation accordingly. In general, you can\n sometimes rearrange your calculation to avoid catastrophic\n cancellation. Another example involves the quadratic formula for\n finding a root (p. 101 of Gentle).\n\n2. Adding or subtracting numbers that are very different in magnitude.\n The precision will be that of the large magnitude number, since we\n can only represent that number to a certain absolute accuracy, which\n is much less than the absolute accuracy of the smaller number:\n\n \n\n\n ::: {.cell}\n \n ```{.python .cell-code}\n dg(123456781234.2)\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19999694824218750000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.1) # truth: 123456781234.1\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.09999084472656250000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.01) # truth: 123456781234.19\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19000244140625000000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.001) # truth: 123456781234.199\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19898986816406250000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.0001) # truth: 123456781234.1999\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19989013671875000000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.00001) # truth: 123456781234.19999\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19998168945312500000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.000001) # truth: 123456781234.199999\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19999694824218750000\n ```\n :::\n \n ```{.python .cell-code}\n 123456781234.2 - 0.000001 == 123456781234.2\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n True\n ```\n :::\n :::\n\n\n\n The larger number in the calculations above is of magnitude\n $10^{11}$, so the absolute error in representing the larger number\n is around $1\\times10^{^{-5}}$. Thus in the calculations above we can\n only expect the answers to be accurate to about $1\\times10^{-5}$. In\n the last calculation above, the smaller number is smaller than\n $1\\times10^{-5}$ and so doing the subtraction has had no effect.\n This is analogous to trying to do $1+1\\times10^{-16}$ and seeing\n that the result is still 1.\n\n A work-around when we are adding numbers of very different\n magnitudes is to add a set of numbers in increasing order. However,\n if the numbers are all of similar magnitude, then by the time you\n add ones later in the summation, the partial sum will be much larger\n than the new term. A (second) work-around to that problem is to add\n the numbers in a tree-like fashion, so that each addition involves a\n summation of numbers of similar size.\n\nGiven the limited *range* of computer numbers, be careful when you are:\n\n- Multiplying or dividing many numbers, particularly large or small\n ones. **Never take the product of many large or small numbers** as this\n can cause over- or under-flow. Rather compute on the log scale and\n only at the end of your computations should you exponentiate. E.g.,\n $$\\prod_{i}x_{i}/\\prod_{j}y_{j}=\\exp(\\sum_{i}\\log x_{i}-\\sum_{j}\\log y_{j})$$\n\nLet's consider some challenges that illustrate that last concern.\n\n- Challenge: consider multiclass logistic regression, where you have\n quantities like this:\n $$p_{j}=\\text{Prob}(y=j)=\\frac{\\exp(x\\beta_{j})}{\\sum_{k=1}^{K}\\exp(x\\beta_{k})}=\\frac{\\exp(z_{j})}{\\sum_{k=1}^{K}\\exp(z_{k})}$$\n for $z_{k}=x\\beta_{k}$. What will happen if the $z$ values are very\n large in magnitude (either positive or negative)? How can we\n reexpress the equation so as to be able to do the calculation? Hint:\n think about multiplying by $\\frac{c}{c}$ for a carefully chosen $c$.\n\n- Second challenge: The same issue arises in the following\n calculation. Suppose I want to calculate a predictive density (e.g.,\n in a model comparison in a Bayesian context): $$\\begin{aligned}\n f(y^{*}|y,x) & = & \\int f(y^{*}|y,x,\\theta)\\pi(\\theta|y,x)d\\theta\\\\\n & \\approx & \\frac{1}{m}\\sum_{j=1}^{m}\\prod_{i=1}^{n}f(y_{i}^{*}|x,\\theta_{j})\\\\\n & = & \\frac{1}{m}\\sum_{j=1}^{m}\\exp\\sum_{i=1}^{n}\\log f(y_{i}^{*}|x,\\theta_{j})\\\\\n & \\equiv & \\frac{1}{m}\\sum_{j=1}^{m}\\exp(v_{j})\\end{aligned}$$\n First, why do I use the log conditional predictive density? Second,\n let's work with an estimate of the unconditional predictive density\n on the log scale,\n $\\log f(y^{*}|y,x)\\approx\\log\\frac{1}{m}\\sum_{j=1}^{m}\\exp(v_{j})$.\n Now note that $e^{v_{j}}$ may be quite small as $v_{j}$ is the sum\n of log likelihoods. So what happens if we have terms something like\n $e^{-1000}$? So we can't exponentiate each individual $v_{j}$. This\n is what is known as the \"log sum of exponentials\" problem (and the\n solution as the \"log-sum-exp trick\"). Thoughts?\n\nNumerical issues come up frequently in linear algebra. For example, they\ncome up in working with positive definite and semi-positive-definite\nmatrices, such as covariance matrices. You can easily get negative\nnumerical eigenvalues even if all the eigenvalues are positive or\nnon-negative. Here's an example where we use an squared exponential\ncorrelation as a function of time (or distance in 1-d), which is\n*mathematically* positive definite (i.e., all the eigenvalues are\npositive) but not numerically positive definite:\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nxs = np.arange(100)\ndists = np.abs(xs[:, np.newaxis] - xs)\ncorr_matrix = np.exp(-(dists/10)**2) # This is a p.d. matrix (mathematically).\nscipy.linalg.eigvals(corr_matrix)[80:99] # But not numerically!\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.10937946e-16+9.49526594e-17j, -2.10937946e-16-9.49526594e-17j,\n -1.77590164e-16+1.30160558e-16j, -1.77590164e-16-1.30160558e-16j,\n -2.09305049e-16+0.00000000e+00j, 2.23869166e-16+3.21640840e-17j,\n 2.23869166e-16-3.21640840e-17j, 1.98271873e-16+9.08175827e-17j,\n 1.98271873e-16-9.08175827e-17j, -1.49116518e-16+0.00000000e+00j,\n -1.23773149e-16+6.06467275e-17j, -1.23773149e-16-6.06467275e-17j,\n -2.48071368e-18+1.51188749e-16j, -2.48071368e-18-1.51188749e-16j,\n -4.08131705e-17+6.79669911e-17j, -4.08131705e-17-6.79669911e-17j,\n 1.27901871e-16+2.34695655e-17j, 1.27901871e-16-2.34695655e-17j,\n 5.23476667e-17+4.08642121e-17j])\n```\n:::\n:::\n\n\n\n## Final note\n\nHow the computer actually does arithmetic with the floating point\nrepresentation in base 2 gets pretty complicated, and we won't go into\nthe details. These rules of thumb should be enough for our practical\npurposes. Monahan and the URL reference have many of the gory details.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/units/unit8-numbers/execute-results/tex.json b/_freeze/units/unit8-numbers/execute-results/tex.json index a66952c..a719881 100644 --- a/_freeze/units/unit8-numbers/execute-results/tex.json +++ b/_freeze/units/unit8-numbers/execute-results/tex.json @@ -1,7 +1,7 @@ { - "hash": "fcbb7815b811ee69c0e6b2ee8d864e88", + "hash": "d42dd640f7faf07bafa4f7c3e7d4169d", "result": { - "markdown": "---\ntitle: \"Numbers on a computer\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-12\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nengine: knitr\n---\n\n\n[PDF](./unit8-numbers.pdf){.btn .btn-primary}\n\n\n::: {.cell}\n\n:::\n\n\n\nReferences:\n\n- Gentle, Computational Statistics, Chapter 2.\n- [http://www.lahey.com/float.htm](http://www.lahey.com/float.htm)\n- And for more gory detail, see Monahan, Chapter 2.\n\nA quick note that, as we've already seen, Python's version of scientific\nnotation is `XeY`, which means $X\\cdot10^{Y}$.\n\nA second note is that the concepts developed here apply outside of Python,\nbut we'll illustrate the principles of computer numbers using Python.\nPython usually makes use of the *double* type (8 bytes) in C for the underlying\nrepresentation of real-valued numbers in C variables, so what we'll really be\nseeing is how such types behave in C on most modern machines.\nIt's actually a bit more complicated in that one can use real-valued numbers\nthat use something other than 8 bytes in numpy by specifying a `dtype`.\n\nThe handling of integers is even more complicated. In numpy, the default\nis 8 byte integers, but other integer dtypes are available. And in Python\nitself, integers can be arbitrarily large.\n\n# 1. Basic representations\n\nEverything in computer memory or on disk is stored in terms of bits. A\n*bit* is essentially a switch than can be either on or off. Thus\neverything is encoded as numbers in base 2, i.e., 0s and 1s. 8 bits make\nup a *byte*. As discussed in Unit 2, for information stored as plain text (ASCII), each byte is\nused to encode a single character (as previously discussed, actually only 7 of the 8 bits are\nactually used, hence there are $2^{7}=128$ ASCII characters). One way to\nrepresent a byte is to write it in hexadecimal, rather than as 8 0/1\nbits. Since there are $2^{8}=256$ possible values in a byte, we can\nrepresent it more compactly as 2 base-16 numbers, such as \"3e\" or \"a0\"\nor \"ba\". A file format is nothing more than a way of interpreting the\nbytes in a file.\n\n\nWe'll create some helper functions to all us to look\nat the underlying binary representation.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nfrom bitstring import Bits\n\ndef bits(x):\n obj = Bits(float = x, length = 64)\n return(obj.bin)\n\ndef dg(x, form = '.20f'):\n print(format(x, form))\n```\n:::\n\n\nNote that 'b' is encoded as one\nmore than 'a', and similarly for '0', '1', and '2'.\nWe could check these against, say, the Wikipedia\ntable that shows the [ASCII encoding](https://en.wikipedia.org/wiki/ASCII).\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nBits(bytes=b'a').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'01100001'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'b').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'01100010'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'0').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'00110000'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'1').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'00110001'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'2').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'00110010'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'@').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'01000000'\n```\n:::\n:::\n\n\n\nWe can think about how we'd store an integer in terms of bytes. With two\nbytes (16 bits), we could encode any value from $0,\\ldots,2^{16}-1=65535$. This is\nan *unsigned* integer representation. To store negative numbers as well,\nwe can use one bit for the sign, giving us the ability to encode\n-32767 - 32767 ($\\pm2^{15}-1$).\n\nNote that in general, rather than be stored\nsimply as the sign and then a number in base 2, integers (at least the\nnegative ones) are actually stored in different binary encoding to\nfacilitate arithmetic. \n\nHere's what a 64-bit integer representation \nthe actual bits.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.binary_repr(0, width=64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0000000000000000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(1, width=64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0000000000000000000000000000000000000000000000000000000000000001'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(2, width=64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0000000000000000000000000000000000000000000000000000000000000010'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(-1, width=64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'1111111111111111111111111111111111111111111111111111111111111111'\n```\n:::\n:::\n\n\nWhat do I mean about facilitating arithmetic? As an example, consider adding\nthe binary representations of -1 and 1. Nice, right?\n\n\nFinally note that the set of computer integers is not closed under\narithmetic. We get an overflow (i.e., a result that is too\nlarge to be stored as an integer of the particular length):\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\na = np.int32(3423333)\na * a # overflows\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-1756921895\n\n:1: RuntimeWarning: overflow encountered in int_scalars\n```\n:::\n\n```{.python .cell-code}\na = np.int64(3423333)\na * a # doesn't overflow if we use 64 bit int\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n11719208828889\n```\n:::\n\n```{.python .cell-code}\na = np.int64(34233332342343)\na * a\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1001093889201452977\n\n:1: RuntimeWarning: overflow encountered in long_scalars\n```\n:::\n:::\n\n\nThat said, if we use Python's `int` rather than numpy's integers,\nwe don't get overflow. But we do use more than 8 bytes that would be used\nby numpy.\n\n\n::: {.cell}\n\n```{.python .cell-code}\na = 34233332342343\na * a\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1171921043261307270950729649\n```\n:::\n\n```{.python .cell-code}\nsys.getsizeof(a)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n32\n```\n:::\n\n```{.python .cell-code}\nsys.getsizeof(a*a)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n36\n```\n:::\n:::\n\n\n\nIn C, one generally works with 8 byte real-valued numbers (aka *floating point* numbers or *floats*).\nHowever, many years ago, an initial standard representation used 4 bytes. Then\npeople started using 8 bytes, which became known as *double precision floating points*\nor *doubles*, whereas the 4-byte version became known as *single precision*.\nNow with GPUs, single precision is often used for speed and reduced memory use.\n\nLet's see how this plays out in terms of memory use in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = np.random.normal(size = 100000)\nsys.getsizeof(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n800112\n```\n:::\n\n```{.python .cell-code}\nx = np.array(np.random.normal(size = 100000), dtype = \"float32\")\nsys.getsizeof(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n400112\n```\n:::\n\n```{.python .cell-code}\nx = np.array(np.random.normal(size = 100000), dtype = \"float16\") \nsys.getsizeof(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n200112\n```\n:::\n:::\n\n\n\nWe can easily calculate the number of megabytes (MB) a vector of\nfloating points (in double precision) will use as the number of elements\ntimes 8 (bytes/double) divided by $10^{6}$ to convert from bytes to\nmegabytes. (In some cases when considering computer memory, a megabyte\nis $1,048,576=2^{20}=1024^{2}$ bytes (this is formally called a\n*mebibyte*) so slightly different than $10^{6}$ -- see [here for more\ndetails](https://en.wikipedia.org/wiki/Megabyte)).\n\nFinally, `numpy` has some helper functions that can tell us\nabout the characteristics of computer\nnumbers on the machine that Python is running.\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.iinfo(np.int32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\niinfo(min=-2147483648, max=2147483647, dtype=int32)\n```\n:::\n\n```{.python .cell-code}\nnp.iinfo(np.int64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\niinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(2147483647, width=32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'01111111111111111111111111111111'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(-2147483648, width=32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'10000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(2147483648, width=32) # strange\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'10000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(1, width=32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'00000000000000000000000000000001'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(-1, width=32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'11111111111111111111111111111111'\n```\n:::\n:::\n\n\nSo the max for a 32-bit (4-byte) integer is $2147483647=2^{31}-1$, which\nis consistent with 4 bytes. Since we have both negative and\npositive numbers, we have $2\\cdot2^{31}=2^{32}=(2^{8})^{4}$, i.e., 4\nbytes, with each byte having 8 bits.\n\n\n# 2. Floating point basics\n\n## Representing real numbers\n\n### Initial exploration\n\nReals (also called floating points) are stored on the computer as an\napproximation, albeit a very precise approximation. As an example, if we\nrepresent the distance from the earth to the sun using a double, the\nerror is around a millimeter. However, we need to be very careful if\nwe're trying to do a calculation that produces a very small (or very\nlarge number) and particularly when we want to see if numbers are equal\nto each other.\n\nIf you run the code here, the results may surprise you.\n\n::: {.cell}\n\n```{.python .cell-code}\n0.3 - 0.2 == 0.1\n0.3\n0.2\n0.1 # Hmmm...\n\nnp.float64(0.3) - np.float64(0.2) == np.float64(0.1)\n\n0.75 - 0.5 == 0.25\n0.6 - 0.4 == 0.2\n## any ideas what is different about those two comparisons?\n```\n:::\n\n\nNext, let's consider the number of digits of accuracy\nwe have for a variety of numbers. We'll use `format` within\na handy wrapper function, `dg`, defined earlier, to view as many digits as we want:\n\n\n::: {.cell}\n\n```{.python .cell-code}\na = 0.3\nb = 0.2\ndg(a)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.29999999999999998890\n```\n:::\n\n```{.python .cell-code}\ndg(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000001110\n```\n:::\n\n```{.python .cell-code}\ndg(a-b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.09999999999999997780\n```\n:::\n\n```{.python .cell-code}\ndg(0.1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.10000000000000000555\n```\n:::\n\n```{.python .cell-code}\ndg(1/3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.33333333333333331483\n```\n:::\n:::\n\n\nSo empirically, it looks like we're accurate up to the 16th decimal place\n\nBut actually, the key is the number of digits, not decimal places.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(1234.1234)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1234.12339999999994688551\n```\n:::\n\n```{.python .cell-code}\ndg(1234.123412341234)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1234.12341234123391586763\n```\n:::\n:::\n\n\nNotice that we can represent the result accurately only up to 16\nsignificant digits. This suggests no need to show more than 16\nsignificant digits and no need to print out any more when writing to a\nfile (except that if the number is bigger than $10^{16}$ then we need\nextra digits to correctly show the magnitude of the number if not using\nscientific notation). And of course, often we don't need anywhere near\nthat many.\n\nLet's return to our comparison, `0.75-0.5 == 0.25`.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(0.75)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.75000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(0.50)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.50000000000000000000\n```\n:::\n:::\n\n\nWhat's different about the numbers 0.75 and 0.5 compared to 0.3, 0.2,\n0.1?\n\n### Machine epsilon\n\n\n*Machine epsilon* is the term used for indicating the\n(relative) accuracy of real numbers and it is defined as the smallest\nfloat, $x$, such that $1+x\\ne1$:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n1e-16 + 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.0\n```\n:::\n\n```{.python .cell-code}\nnp.array(1e-16) + np.array(1.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.0\n```\n:::\n\n```{.python .cell-code}\n1e-15 + 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.000000000000001\n```\n:::\n\n```{.python .cell-code}\nnp.array(1e-15) + np.array(1.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.000000000000001\n```\n:::\n\n```{.python .cell-code}\n2e-16 + 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.0000000000000002\n```\n:::\n\n```{.python .cell-code}\nnp.finfo(np.float64).eps\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2.220446049250313e-16\n```\n:::\n\n```{.python .cell-code}\ndg(2e-16 + 1.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.00000000000000022204\n```\n:::\n:::\n\n::: {.cell}\n\n```{.python .cell-code}\n## What about in single precision, e.g. on a GPU?\nnp.finfo(np.float32).eps\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.1920929e-07\n```\n:::\n:::\n\n\n\n### Floating point representation\n\n*Floating point* refers to the decimal point (or *radix* point since we'll\nbe working with base 2 and *decimal* relates to 10). \n\nTo proceed further we need to consider scientific notation, such as in writing Avogadro's\nnumber as $+6.023\\times10^{23}$. As a\nbaseline for what is about to follow note that we can express a decimal\nnumber in the following expansion\n$$6.037=6\\times10^{0}+0\\times10^{-1}+3\\times10^{-2}+7\\times10^{-3}$$ A real number on a\ncomputer is stored in what is basically scientific notation:\n$$\\pm d_{0}.d_{1}d_{2}\\ldots d_{p}\\times b^{e}\\label{eq:floatRep}$$\nwhere $b$ is the base, $e$ is an integer and $d_{i}\\in\\{0,\\ldots,b-1\\}$.\n$e$ is called the *exponent* and $d=d_{1}d_{2}\\ldots d_{p}$ is called the *mantissa*.\n\nLet's consider the choices that the computer pioneers needed to make\nin using this system to represent numbers on a computer using base 2 ($b=2$).\nFirst, we need to choose the number of bits to represent $e$ so that we\ncan represent sufficiently large and small numbers. Second we need to\nchoose the number of bits, $p$, to allocate to \n$d=d_{1}d_{2}\\ldots d_{p}$, which determines the accuracy of any\ncomputer representation of a real.\n\nThe great thing about floating points\nis that we can represent numbers that range from incredibly small to\nvery large while maintaining good precision. The floating point *floats*\nto adjust to the size of the number. Suppose we had only three digits to\nuse and were in base 10. In floating point notation we can express\n$0.12\\times0.12=0.0144$ as\n$(1.20\\times10^{-1})\\times(1.20\\times10^{-1})=1.44\\times10^{-2}$, but if\nwe had fixed the decimal point, we'd have $0.120\\times0.120=0.014$ and\nwe'd have lost a digit of accuracy. (Furthermore, we wouldn't be able\nto represent numbers bigger than $0.99$.)\n\nMore specifically, the actual storage of a number on a computer these\ndays is generally as a double in the form:\n$$(-1)^{S}\\times1.d\\times2^{e-1023}=(-1)^{S}\\times1.d_{1}d_{2}\\ldots d_{52}\\times2^{e-1023}$$\nwhere the computer uses base 2, $b=2$, (so $d_{i}\\in\\{0,1\\}$) because\nbase-2 arithmetic is faster than base-10 arithmetic. The leading 1\nnormalizes the number; i.e., ensures there is a unique representation\nfor a given computer number. This avoids representing any number in\nmultiple ways, e.g., either\n$1=1.0\\times2^{0}=0.1\\times2^{1}=0.01\\times2^{2}$. For a double, we have\n8 bytes=64 bits. Consider our representation as ($S,d,e$) where $S$ is\nthe sign. The leading 1 is the *hidden bit* and doesn't need to be\nstored because it is always present. In general $e$ is\nrepresented using 11 bits ($2^{11}=2048$), and the subtraction takes the\nplace of having a sign bit for the exponent. (Note that in our\ndiscussion we'll just think of $e$ in terms of its base 10\nrepresentation, although it is of course represented in base 2.) This\nleaves $p=52 = 64-1-11$ bits for $d$.\n\nIn this code I force storage as a double by tacking on a decimal place, `.0`.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nbits(2.0**(-1)) # 1/2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111111100000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2.0**0) # 1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111111110000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2.0**1) # 2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100000000000000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2.0**1 + 2.0**0) # 3\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100000000001000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2.0**2) # 4\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100000000010000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(-2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'1100000000000000000000000000000000000000000000000000000000000000'\n```\n:::\n:::\n\n\nLet's see that we can manually work out the bit-wise representation\nof 3.25:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nbits(3.25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100000000001010000000000000000000000000000000000000000000000000'\n```\n:::\n:::\n\n\n**Question**: Given a fixed number of bits for a number, what is the\ntradeoff between using bits for the $d$ part vs. bits for the $e$ part?\n\nLet's consider what can be represented exactly:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(.1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.10000000000000000555\n```\n:::\n\n```{.python .cell-code}\ndg(.5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.50000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(.25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.25000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(.26)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.26000000000000000888\n```\n:::\n\n```{.python .cell-code}\ndg(1/32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.03125000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(1/33)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.03030303030303030387\n```\n:::\n:::\n\n\nSo why is 0.5 stored exactly and 0.1 not stored exactly? By analogy,\nconsider the difficulty with representing 1/3 in base 10.\n\n## Overflow and underflow\n\nThe largest and smallest numbers we can represent are $2^{e_{\\max}}$ and\n$2^{e_{\\min}}$ where $e_{\\max}$ and $e_{\\min}$ are the smallest and\nlargest possible values of the exponent. Let's consider the exponent and\nwhat we can infer about the range of possible numbers. With 11 bits for\n$e$, we can represent $\\pm2^{10}=\\pm1024$ different exponent values (see\n`np.finfo(np.float64).maxexp`) (why is `np.finfo(np.float64).minexp` only\n-1022?). So the largest number we could represent is $2^{1024}$. What\nis this in base 10?\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = np.float64(10)\nx**308\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1e+308\n```\n:::\n\n```{.python .cell-code}\nx**309\n```\n\n::: {.cell-output .cell-output-stdout}\n```\ninf\n\n:1: RuntimeWarning: overflow encountered in double_scalars\n```\n:::\n\n```{.python .cell-code}\nnp.log10(2.0**1024)\n```\n\n::: {.cell-output .cell-output-error}\n```\nError: OverflowError: (34, 'Numerical result out of range')\n```\n:::\n\n```{.python .cell-code}\nnp.log10(2.0**1023)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n307.95368556425274\n```\n:::\n\n```{.python .cell-code}\nnp.finfo(np.float64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfinfo(resolution=1e-15, min=-1.7976931348623157e+308, max=1.7976931348623157e+308, dtype=float64)\n```\n:::\n:::\n\n\nWe could have been smarter about that calculation:\n$\\log_{10}2^{1024}=\\log_{2}2^{1024}/\\log_{2}10=1024/3.32\\approx308$. The\nresult is analogous for the smallest number, so we have that floating\npoints can range between $1\\times10^{-308}$ and $1\\times10^{308}$,\nconsistent with what numpy reports above. Producing\nsomething larger or smaller in magnitude than these values is called\noverflow and underflow respectively.\n\nLet's see what happens when we underflow in numpy. Note that there is no warning.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx**(-308)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1e-308\n```\n:::\n\n```{.python .cell-code}\nx**(-330)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0\n```\n:::\n:::\n\n\nSomething subtle happens for numbers like $10^{-309}$ through $10^{-323}$. They can actually be represented despite what I said above. Investigating that may be an extra credit problem on a problem set.\n\n\n## Integers or floats?\n\nValues stored as integers should overflow if they exceed the maximum integer.\n\nShould $2^{65}$ overflow?\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.log2(np.iinfo(np.int64).max)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n63.0\n```\n:::\n\n```{.python .cell-code}\nx = np.int64(2)\n# Yikes!\nx**64\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0\n```\n:::\n:::\n\n\nPython's `int` type doesn't overflow.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# Interesting:\nprint(2**64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18446744073709551616\n```\n:::\n\n```{.python .cell-code}\nprint(2**100)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1267650600228229401496703205376\n```\n:::\n:::\n\n\nOf course, doubles won't overflow until much larger values than 4- or 8-byte integers because we know they can be as big as $10^308$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = np.float64(2)\ndg(x**64, '.2f')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18446744073709551616.00\n```\n:::\n\n```{.python .cell-code}\ndg(x**100, '.2f')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1267650600228229401496703205376.00\n```\n:::\n:::\n\n\nHowever we need to think about\nwhat integer-valued numbers can and can't be stored exactly in our base 2 representation of floating point numbers.\nIt turns out that integer-valued numbers can be stored exactly as doubles when their absolute\nvalue is less than $2^{53}$.\n\n> *Challenge*: Why $2^{53}$? Write out what integers can be stored exactly in our base 2 representation of floating point numbers.\n\nYou can force storage as integers or doubles in a few ways.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = 3; type(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n\n```\n:::\n\n```{.python .cell-code}\nx = np.float64(x); type(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n\n```\n:::\n\n```{.python .cell-code}\nx = 3.0; type(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n\n```\n:::\n\n```{.python .cell-code}\nx = np.float64(3); type(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n\n```\n:::\n:::\n\n\n## Precision\n\nConsider our representation as (*S, d, e*) where we have $p=52$ bits for\n$d$. Since we have $2^{52}\\approx0.5\\times10^{16}$, we can represent\nabout that many discrete values, which means we can accurately represent\nabout 16 digits (in base 10). The result is that floats on a computer\nare actually discrete (we have a finite number of bits), and if we get a\nnumber that is in one of the gaps (there are uncountably many reals),\nit's approximated by the nearest discrete value. The accuracy of our\nrepresentation is to within 1/2 of the gap between the two discrete\nvalues bracketing the true number. Let's consider the implications for\naccuracy in working with large and small numbers. By changing $e$ we can\nchange the magnitude of a number. So regardless of whether we have a\nvery large or small number, we have about 16 digits of accuracy, since\nthe absolute spacing depends on what value is represented by the least\nsignificant digit (the *ulp*, or *unit in the last place*) in $d$, i.e.,\nthe $p=52$nd one, or in terms of base 10, the 16th digit. Let's explore\nthis:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# large vs. small numbers\ndg(.1234123412341234)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12341234123412339607\n```\n:::\n\n```{.python .cell-code}\ndg(1234.1234123412341234) # not accurate to 16 decimal places \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1234.12341234123414324131\n```\n:::\n\n```{.python .cell-code}\ndg(123412341234.123412341234) # only accurate to 4 places \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n123412341234.12341308593750000000\n```\n:::\n\n```{.python .cell-code}\ndg(1234123412341234.123412341234) # no places! \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1234123412341234.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(12341234123412341234) # fewer than no places! \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n12341234123412340736.00000000000000000000\n```\n:::\n:::\n\n\nWe can see the implications of this in the context of calculations:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(1234567812345678.0 - 1234567812345677.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(12345678123456788888.0 - 12345678123456788887.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(12345678123456780000.0 - 12345678123456770000.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n10240.00000000000000000000\n```\n:::\n:::\n\n\nThe spacing of possible computer numbers that have a magnitude of about\n1 leads us to another definition of *machine epsilon* (an alternative,\nbut essentially equivalent definition to that given [previously](#machine-epsilon). \nMachine epsilon tells us also about the relative spacing of\nnumbers. First let's consider numbers of magnitude one. The difference\nbetween $1=1.00...00\\times2^{0}$ and $1.000...01\\times2^{0}$ is\n$\\epsilon=1\\times2^{-52}\\approx2.2\\times10^{-16}$. Machine epsilon gives\nthe *absolute spacing* for numbers near 1 and the *relative spacing* for\nnumbers with a different order of magnitude and therefore a different\nabsolute magnitude of the error in representing a real. The relative\nspacing at $x$ is $$\\frac{(1+\\epsilon)x-x}{x}=\\epsilon$$ since the next\nlargest number from $x$ is given by $(1+\\epsilon)x$.\n\nSuppose $x=1\\times10^{6}$. Then the absolute error in representing a\nnumber of this magnitude is $x\\epsilon\\approx2\\times10^{-10}$. (Actually\nthe error would be one-half of the spacing, but that's a minor\ndistinction.) We can see by looking at the numbers in decimal form,\nwhere we are accurate to the order $10^{-10}$ but not $10^{-11}$. This\nis equivalent to our discussion that we have only 16 digits of accuracy.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(1000000.1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1000000.09999999997671693563\n```\n:::\n:::\n\n\nLet's see what arithmetic we can do exactly with integer-valued numbers stored as\ndoubles and how that relates to the absolute spacing of numbers we've\njust seen:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n2.0**52\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4503599627370496.0\n```\n:::\n\n```{.python .cell-code}\n2.0**52+1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4503599627370497.0\n```\n:::\n\n```{.python .cell-code}\n2.0**53\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9007199254740992.0\n```\n:::\n\n```{.python .cell-code}\n2.0**53+1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9007199254740992.0\n```\n:::\n\n```{.python .cell-code}\n2.0**53+2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9007199254740994.0\n```\n:::\n\n```{.python .cell-code}\ndg(2.0**54)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18014398509481984.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(2.0**54+2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18014398509481984.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(2.0**54+4)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18014398509481988.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\nbits(2**53)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101000000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2**53+1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101000000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2**53+2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101000000000000000000000000000000000000000000000000000001'\n```\n:::\n\n```{.python .cell-code}\nbits(2**54)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101010000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2**54+2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101010000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2**54+4)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101010000000000000000000000000000000000000000000000000001'\n```\n:::\n:::\n\n\nThe absolute spacing is $x\\epsilon$, so we have spacings of\n$2^{52}\\times2^{-52}=1$, $2^{53}\\times2^{-52}=2$,\n$2^{54}\\times2^{-52}=4$ for numbers of magnitude $2^{52}$, $2^{53}$, and\n$2^{54}$, respectively.\n\nWith a bit more work (e.g., using Mathematica), one can demonstrate that\ndoubles in Python in general are represented as the nearest number that can\nstored with the 64-bit structure we have discussed and that the spacing\nis as we have discussed. The results below show the spacing that\nresults, in base 10, for numbers around 0.1. The numbers Python reports are\nspaced in increments of individual bits in the base 2 representation.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(0.1234567812345678)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456779729\n```\n:::\n\n```{.python .cell-code}\ndg(0.12345678123456781)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456781117\n```\n:::\n\n```{.python .cell-code}\ndg(0.12345678123456782)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456782505\n```\n:::\n\n```{.python .cell-code}\ndg(0.12345678123456783)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456782505\n```\n:::\n\n```{.python .cell-code}\ndg(0.12345678123456784)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456783892\n```\n:::\n\n```{.python .cell-code}\nbits(0.1234567812345678)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010000110'\n```\n:::\n\n```{.python .cell-code}\nbits(0.12345678123456781)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010000111'\n```\n:::\n\n```{.python .cell-code}\nbits(0.12345678123456782)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010001000'\n```\n:::\n\n```{.python .cell-code}\nbits(0.12345678123456783)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010001000'\n```\n:::\n\n```{.python .cell-code}\nbits(0.12345678123456784)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010001001'\n```\n:::\n:::\n\n\n## Working with higher precision numbers\n\nAs we've seen, Python will automatically work with integers in arbitrary precision.\n(Note that R does not do this -- R uses 4-byte integers, and for many calculations\nit's best to use R's `numeric` type because integers that aren't really large\ncan be expressed exactly.)\n\nFor higher precision floating point numbers you can make use of the `gmpy2`\npackage.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport gmpy2\ngmpy2.get_context().precision=200\ngmpy2.const_pi()\n\n## not sure why this shows ...00004\ngmpy2.mpfr(\".1234567812345678\") \n```\n:::\n\n\n\n\n# 3. Implications for calculations and comparisons\n\n## Computer arithmetic is not mathematical arithmetic!\n\nAs mentioned for integers, computer number arithmetic is not closed,\nunlike real arithmetic. For example, if we multiply two computer\nfloating points, we can overflow and not get back another computer\nfloating point. \n\nAnother mathematical concept we should consider here is that computer\narithmetic does not obey the associative and distributive laws, i.e.,\n$(a+b)+c$ may not equal $a+(b+c)$ on a computer and $a(b+c)$ may not be\nthe same as $ab+ac$. Here's an example with multiplication:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nval1 = 1/10; val2 = 0.31; val3 = 0.57\nres1 = val1*val2*val3\nres2 = val3*val2*val1\nres1 == res2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nFalse\n```\n:::\n\n```{.python .cell-code}\ndg(res1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.01766999999999999821\n```\n:::\n\n```{.python .cell-code}\ndg(res2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.01767000000000000168\n```\n:::\n:::\n\n\n## Calculating with integers vs. floating points\n\nIt's important to note that operations with integers are fast and exact\n(but can easily overflow -- albeit not with Python's base `int`) while operations with floating points are\nslower and approximate. Because of this slowness, floating point\noperations (*flops*) dominate calculation intensity and are used as the\nmetric for the amount of work being done - a multiplication (or\ndivision) combined with an addition (or subtraction) is one flop. We'll\ntalk a lot about flops in the unit on linear algebra.\n\n## Comparisons\n\nAs we saw, we should never test `x == y` unless:\n\n 1. `x` and `y` are represented as integers, \n 2. they are integer-valued but stored as doubles that are small enough that they can be stored exactly), or\n 3. they are decimal numbers that have been created in the same way (e.g., `0.4-0.3 == 0.4-0.3` returns `TRUE` but `0.1 == 0.4-0.3` does not). \n\nSimilarly we should be careful\nabout testing `x == 0`. And be careful of greater than/less than\ncomparisons. For example, be careful of `x[ x < 0 ] = np.nan` if what you\nare looking for is values that might be *mathematically* less than zero,\nrather than whatever is *numerically* less than zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n4 - 3 == 1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nTrue\n```\n:::\n\n```{.python .cell-code}\n4.0 - 3.0 == 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nTrue\n```\n:::\n\n```{.python .cell-code}\n4.1 - 3.1 == 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nFalse\n```\n:::\n\n```{.python .cell-code}\n0.4-0.3 == 0.1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nFalse\n```\n:::\n\n```{.python .cell-code}\n0.4-0.3 == 0.4-0.3\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nTrue\n```\n:::\n:::\n\n\nOne nice approach to checking for approximate equality is to make use of\n*machine epsilon*. If the relative spacing of two numbers is less than\n*machine epsilon*, then for our computer approximation, we say they are\nthe same. Here's an implementation that relies on the absolute spacing\nbeing $x\\epsilon$ (see above).\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = 12345678123456781000\ny = 12345678123456782000\n\ndef approx_equal(a,b):\n if abs(a - b) < np.finfo(np.float64).eps * abs(a + b):\n print(\"approximately equal\")\n else:\n print (\"not equal\")\n\n\napprox_equal(a,b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nnot equal\n```\n:::\n\n```{.python .cell-code}\nx = 1234567812345678\ny = 1234567812345677\n\napprox_equal(a,b) \n```\n\n::: {.cell-output .cell-output-stdout}\n```\nnot equal\n```\n:::\n:::\n\n\nActually, we probably want to use a number slightly larger than\nmachine epsilon to be safe. \n\nFinally, sometimes we encounter the use of an unusual integer\nas a symbol for missing values. E.g., a datafile might store missing\nvalues as -9999. Testing for this using `==` with floats should generally be\nok:` x [ x == -9999 ] = np.nan`, because integers of this magnitude\nare stored exactly as floating point values. But to be really careful, you can read in as\nan integer or character type and do the assessment before converting to a float.\n\n## Calculations\n\nGiven the limited *precision* of computer numbers, we need to be careful\nwhen in the following two situations.\n\n1. Subtracting large numbers that are nearly equal (or adding negative\n and positive numbers of the same magnitude). You won't have the\n precision in the answer that you would like. How many decimal places\n of accuracy do we have here?\n\n \n\n ::: {.cell}\n \n ```{.python .cell-code}\n # catastrophic cancellation w/ large numbers\n dg(123456781234.56 - 123456781234.00)\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 0.55999755859375000000\n ```\n :::\n :::\n\n\n The absolute error in the original numbers here is of the order\n $\\epsilon x=2.2\\times10^{-16}\\cdot1\\times10^{11}\\approx1\\times10^{-5}=.00001$.\n While we might think that the result is close to the value 1 and\n should have error of about machine epsilon, the relevant absolute\n error is in the original numbers, so we actually only have about\n five significant digits in our result because we cancel out the\n other digits.\n\n This is called *catastrophic cancellation*, because most of the\n digits that are left represent rounding error -- many of the significant\n digits have cancelled with each other.\\\n Here's catastrophic cancellation with small numbers. The right\n answer here is exactly 0.000000000000000000001234.\n\n \n\n ::: {.cell}\n \n ```{.python .cell-code}\n # catastrophic cancellation w/ small numbers\n x = .000000000000123412341234\n y = .000000000000123412340000\n \n # So we know the right answer is .000000000000000000001234 exactly. \n \n dg(x-y, '.35f')\n ## [1] \"0.00000000000000000000123399999315140\"\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 0.00000000000000000000123399999315140\n ```\n :::\n :::\n\n\n But the result is accurate only to 8 places + 20 = 28 decimal\n places, as expected from a machine precision-based calculation,\n since the \"1\" is in the 13th position, after 12 zeroes (12+16=28).\n Ideally, we would have accuracy to 36 places (16 digits + the 20\n zeroes), but we've lost 8 digits to catastrophic cancellation.\n\n It's best to do any subtraction on numbers that are not too large.\n For example, if we compute the sum of squares in a naive way, we can\n lose all of the information in the calculation because the\n information is in digits that are not computed or stored accurately:\n $$s^{2}=\\sum x_{i}^{2}-n\\bar{x}^{2}$$\n\n \n\n ::: {.cell}\n \n ```{.python .cell-code}\n ## No problem here:\n x = np.array([-1.0, 0.0, 1.0])\n n = len(x)\n np.sum(x**2)-n*np.mean(x)**2 \n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 2.0\n ```\n :::\n \n ```{.python .cell-code}\n np.sum((x - np.mean(x))**2)\n \n ## Adding/subtracting a constant shouldn't change the result:\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 2.0\n ```\n :::\n \n ```{.python .cell-code}\n x = x + 1e8\n np.sum(x**2)-n*np.mean(x)**2 ## YIKES!\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 0.0\n ```\n :::\n \n ```{.python .cell-code}\n np.sum((x - np.mean(x))**2)\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 2.0\n ```\n :::\n :::\n\n\n A good principle to take away is to subtract off a number similar in\n magnitude to the values (in this case $\\bar{x}$ is obviously ideal)\n and adjust your calculation accordingly. In general, you can\n sometimes rearrange your calculation to avoid catastrophic\n cancellation. Another example involves the quadratic formula for\n finding a root (p. 101 of Gentle).\n\n2. Adding or subtracting numbers that are very different in magnitude.\n The precision will be that of the large magnitude number, since we\n can only represent that number to a certain absolute accuracy, which\n is much less than the absolute accuracy of the smaller number:\n\n \n\n ::: {.cell}\n \n ```{.python .cell-code}\n dg(123456781234.2)\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19999694824218750000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.1) # truth: 123456781234.1\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.09999084472656250000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.01) # truth: 123456781234.19\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19000244140625000000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.001) # truth: 123456781234.199\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19898986816406250000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.0001) # truth: 123456781234.1999\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19989013671875000000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.00001) # truth: 123456781234.19999\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19998168945312500000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.000001) # truth: 123456781234.199999\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19999694824218750000\n ```\n :::\n \n ```{.python .cell-code}\n 123456781234.2 - 0.000001 == 123456781234.2\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n True\n ```\n :::\n :::\n\n\n The larger number in the calculations above is of magnitude\n $10^{11}$, so the absolute error in representing the larger number\n is around $1\\times10^{^{-5}}$. Thus in the calculations above we can\n only expect the answers to be accurate to about $1\\times10^{-5}$. In\n the last calculation above, the smaller number is smaller than\n $1\\times10^{-5}$ and so doing the subtraction has had no effect.\n This is analogous to trying to do $1+1\\times10^{-16}$ and seeing\n that the result is still 1.\n\n A work-around when we are adding numbers of very different\n magnitudes is to add a set of numbers in increasing order. However,\n if the numbers are all of similar magnitude, then by the time you\n add ones later in the summation, the partial sum will be much larger\n than the new term. A (second) work-around to that problem is to add\n the numbers in a tree-like fashion, so that each addition involves a\n summation of numbers of similar size.\n\nGiven the limited *range* of computer numbers, be careful when you are:\n\n- Multiplying or dividing many numbers, particularly large or small\n ones. **Never take the product of many large or small numbers** as this\n can cause over- or under-flow. Rather compute on the log scale and\n only at the end of your computations should you exponentiate. E.g.,\n $$\\prod_{i}x_{i}/\\prod_{j}y_{j}=\\exp(\\sum_{i}\\log x_{i}-\\sum_{j}\\log y_{j})$$\n\nLet's consider some challenges that illustrate that last concern.\n\n- Challenge: consider multiclass logistic regression, where you have\n quantities like this:\n $$p_{j}=\\text{Prob}(y=j)=\\frac{\\exp(x\\beta_{j})}{\\sum_{k=1}^{K}\\exp(x\\beta_{k})}=\\frac{\\exp(z_{j})}{\\sum_{k=1}^{K}\\exp(z_{k})}$$\n for $z_{k}=x\\beta_{k}$. What will happen if the $z$ values are very\n large in magnitude (either positive or negative)? How can we\n reexpress the equation so as to be able to do the calculation? Hint:\n think about multiplying by $\\frac{c}{c}$ for a carefully chosen $c$.\n\n- Second challenge: The same issue arises in the following\n calculation. Suppose I want to calculate a predictive density (e.g.,\n in a model comparison in a Bayesian context): $$\\begin{aligned}\n f(y^{*}|y,x) & = & \\int f(y^{*}|y,x,\\theta)\\pi(\\theta|y,x)d\\theta\\\\\n & \\approx & \\frac{1}{m}\\sum_{j=1}^{m}\\prod_{i=1}^{n}f(y_{i}^{*}|x,\\theta_{j})\\\\\n & = & \\frac{1}{m}\\sum_{j=1}^{m}\\exp\\sum_{i=1}^{n}\\log f(y_{i}^{*}|x,\\theta_{j})\\\\\n & \\equiv & \\frac{1}{m}\\sum_{j=1}^{m}\\exp(v_{j})\\end{aligned}$$\n First, why do I use the log conditional predictive density? Second,\n let's work with an estimate of the unconditional predictive density\n on the log scale,\n $\\log f(y^{*}|y,x)\\approx\\log\\frac{1}{m}\\sum_{j=1}^{m}\\exp(v_{j})$.\n Now note that $e^{v_{j}}$ may be quite small as $v_{j}$ is the sum\n of log likelihoods. So what happens if we have terms something like\n $e^{-1000}$? So we can't exponentiate each individual $v_{j}$. This\n is what is known as the \"log sum of exponentials\" problem (and the\n solution as the \"log-sum-exp trick\"). Thoughts?\n\nNumerical issues come up frequently in linear algebra. For example, they\ncome up in working with positive definite and semi-positive-definite\nmatrices, such as covariance matrices. You can easily get negative\nnumerical eigenvalues even if all the eigenvalues are positive or\nnon-negative. Here's an example where we use an squared exponential\ncorrelation as a function of time (or distance in 1-d), which is\n*mathematically* positive definite (i.e., all the eigenvalues are\npositive) but not numerically positive definite:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nxs = np.arange(100)\ndists = np.abs(xs[:, np.newaxis] - xs)\ncorr_matrix = np.exp(-(dists/10)**2) # This is a p.d. matrix (mathematically).\nscipy.linalg.eigvals(corr_matrix)[80:99] # But not numerically!\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.10937946e-16+9.49526594e-17j, -2.10937946e-16-9.49526594e-17j,\n -1.77590164e-16+1.30160558e-16j, -1.77590164e-16-1.30160558e-16j,\n -2.09305049e-16+0.00000000e+00j, 2.23869166e-16+3.21640840e-17j,\n 2.23869166e-16-3.21640840e-17j, 1.98271873e-16+9.08175827e-17j,\n 1.98271873e-16-9.08175827e-17j, -1.49116518e-16+0.00000000e+00j,\n -1.23773149e-16+6.06467275e-17j, -1.23773149e-16-6.06467275e-17j,\n -2.48071368e-18+1.51188749e-16j, -2.48071368e-18-1.51188749e-16j,\n -4.08131705e-17+6.79669911e-17j, -4.08131705e-17-6.79669911e-17j,\n 1.27901871e-16+2.34695655e-17j, 1.27901871e-16-2.34695655e-17j,\n 5.23476667e-17+4.08642121e-17j])\n```\n:::\n:::\n\n\n## Final note\n\nHow the computer actually does arithmetic with the floating point\nrepresentation in base 2 gets pretty complicated, and we won't go into\nthe details. These rules of thumb should be enough for our practical\npurposes. Monahan and the URL reference have many of the gory details.\n", + "markdown": "---\ntitle: \"Numbers on a computer\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-12\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nengine: knitr\n---\n\n\n[PDF](./unit8-numbers.pdf){.btn .btn-primary}\n\n\n::: {.cell}\n\n:::\n\n\n\nReferences:\n\n- Gentle, Computational Statistics, Chapter 2.\n- [http://www.lahey.com/float.htm](http://www.lahey.com/float.htm)\n- And for more gory detail, see Monahan, Chapter 2.\n\nA quick note that, as we've already seen, Python's version of scientific\nnotation is `XeY`, which means $X\\cdot10^{Y}$.\n\nA second note is that the concepts developed here apply outside of Python,\nbut we'll illustrate the principles of computer numbers using Python.\nPython usually makes use of the *double* type (8 bytes) in C for the underlying\nrepresentation of real-valued numbers in C variables, so what we'll really be\nseeing is how such types behave in C on most modern machines.\nIt's actually a bit more complicated in that one can use real-valued numbers\nthat use something other than 8 bytes in numpy by specifying a `dtype`.\n\nThe handling of integers is even more complicated. In numpy, the default\nis 8 byte integers, but other integer dtypes are available. And in Python\nitself, integers can be arbitrarily large.\n\n# 1. Basic representations\n\nEverything in computer memory or on disk is stored in terms of bits. A\n*bit* is essentially a switch than can be either on or off. Thus\neverything is encoded as numbers in base 2, i.e., 0s and 1s. 8 bits make\nup a *byte*. As discussed in Unit 2, for information stored as plain text (ASCII), each byte is\nused to encode a single character (as previously discussed, actually only 7 of the 8 bits are\nactually used, hence there are $2^{7}=128$ ASCII characters). One way to\nrepresent a byte is to write it in hexadecimal, rather than as 8 0/1\nbits. Since there are $2^{8}=256$ possible values in a byte, we can\nrepresent it more compactly as 2 base-16 numbers, such as \"3e\" or \"a0\"\nor \"ba\". A file format is nothing more than a way of interpreting the\nbytes in a file.\n\n\nWe'll create some helper functions to all us to look\nat the underlying binary representation.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nfrom bitstring import Bits\n\ndef bits(x):\n obj = Bits(float = x, length = 64)\n return(obj.bin)\n\ndef dg(x, form = '.20f'):\n print(format(x, form))\n```\n:::\n\n\nNote that 'b' is encoded as one\nmore than 'a', and similarly for '0', '1', and '2'.\nWe could check these against, say, the Wikipedia\ntable that shows the [ASCII encoding](https://en.wikipedia.org/wiki/ASCII).\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nBits(bytes=b'a').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'01100001'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'b').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'01100010'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'0').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'00110000'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'1').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'00110001'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'2').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'00110010'\n```\n:::\n\n```{.python .cell-code}\nBits(bytes=b'@').bin\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'01000000'\n```\n:::\n:::\n\n\n\nWe can think about how we'd store an integer in terms of bytes. With two\nbytes (16 bits), we could encode any value from $0,\\ldots,2^{16}-1=65535$. This is\nan *unsigned* integer representation. To store negative numbers as well,\nwe can use one bit for the sign, giving us the ability to encode\n-32767 - 32767 ($\\pm2^{15}-1$).\n\nNote that in general, rather than be stored\nsimply as the sign and then a number in base 2, integers (at least the\nnegative ones) are actually stored in different binary encoding to\nfacilitate arithmetic. \n\nHere's what a 64-bit integer representation \nthe actual bits.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.binary_repr(0, width=64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0000000000000000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(1, width=64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0000000000000000000000000000000000000000000000000000000000000001'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(2, width=64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0000000000000000000000000000000000000000000000000000000000000010'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(-1, width=64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'1111111111111111111111111111111111111111111111111111111111111111'\n```\n:::\n:::\n\n\nWhat do I mean about facilitating arithmetic? As an example, consider adding\nthe binary representations of -1 and 1. Nice, right?\n\n\nFinally note that the set of computer integers is not closed under\narithmetic. We get an overflow (i.e., a result that is too\nlarge to be stored as an integer of the particular length):\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\na = np.int32(3423333)\na * a # overflows\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-1756921895\n\n:1: RuntimeWarning: overflow encountered in int_scalars\n```\n:::\n\n```{.python .cell-code}\na = np.int64(3423333)\na * a # doesn't overflow if we use 64 bit int\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n11719208828889\n```\n:::\n\n```{.python .cell-code}\na = np.int64(34233332342343)\na * a\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1001093889201452977\n\n:1: RuntimeWarning: overflow encountered in long_scalars\n```\n:::\n:::\n\n\nThat said, if we use Python's `int` rather than numpy's integers,\nwe don't get overflow. But we do use more than 8 bytes that would be used\nby numpy.\n\n\n::: {.cell}\n\n```{.python .cell-code}\na = 34233332342343\na * a\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1171921043261307270950729649\n```\n:::\n\n```{.python .cell-code}\nsys.getsizeof(a)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n32\n```\n:::\n\n```{.python .cell-code}\nsys.getsizeof(a*a)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n36\n```\n:::\n:::\n\n\n\nIn C, one generally works with 8 byte real-valued numbers (aka *floating point* numbers or *floats*).\nHowever, many years ago, an initial standard representation used 4 bytes. Then\npeople started using 8 bytes, which became known as *double precision floating points*\nor *doubles*, whereas the 4-byte version became known as *single precision*.\nNow with GPUs, single precision is often used for speed and reduced memory use.\n\nLet's see how this plays out in terms of memory use in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = np.random.normal(size = 100000)\nsys.getsizeof(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n800112\n```\n:::\n\n```{.python .cell-code}\nx = np.array(np.random.normal(size = 100000), dtype = \"float32\")\nsys.getsizeof(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n400112\n```\n:::\n\n```{.python .cell-code}\nx = np.array(np.random.normal(size = 100000), dtype = \"float16\") \nsys.getsizeof(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n200112\n```\n:::\n:::\n\n\n\nWe can easily calculate the number of megabytes (MB) a vector of\nfloating points (in double precision) will use as the number of elements\ntimes 8 (bytes/double) divided by $10^{6}$ to convert from bytes to\nmegabytes. (In some cases when considering computer memory, a megabyte\nis $1,048,576=2^{20}=1024^{2}$ bytes (this is formally called a\n*mebibyte*) so slightly different than $10^{6}$ -- see [here for more\ndetails](https://en.wikipedia.org/wiki/Megabyte)).\n\nFinally, `numpy` has some helper functions that can tell us\nabout the characteristics of computer\nnumbers on the machine that Python is running.\n\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.iinfo(np.int32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\niinfo(min=-2147483648, max=2147483647, dtype=int32)\n```\n:::\n\n```{.python .cell-code}\nnp.iinfo(np.int64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\niinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(2147483647, width=32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'01111111111111111111111111111111'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(-2147483648, width=32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'10000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(2147483648, width=32) # strange\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'10000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(1, width=32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'00000000000000000000000000000001'\n```\n:::\n\n```{.python .cell-code}\nnp.binary_repr(-1, width=32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'11111111111111111111111111111111'\n```\n:::\n:::\n\n\nSo the max for a 32-bit (4-byte) integer is $2147483647=2^{31}-1$, which\nis consistent with 4 bytes. Since we have both negative and\npositive numbers, we have $2\\cdot2^{31}=2^{32}=(2^{8})^{4}$, i.e., 4\nbytes, with each byte having 8 bits.\n\n\n# 2. Floating point basics\n\n## Representing real numbers\n\n### Initial exploration\n\nReals (also called floating points) are stored on the computer as an\napproximation, albeit a very precise approximation. As an example, if we\nrepresent the distance from the earth to the sun using a double, the\nerror is around a millimeter. However, we need to be very careful if\nwe're trying to do a calculation that produces a very small (or very\nlarge number) and particularly when we want to see if numbers are equal\nto each other.\n\nIf you run the code here, the results may surprise you.\n\n::: {.cell}\n\n```{.python .cell-code}\n0.3 - 0.2 == 0.1\n0.3\n0.2\n0.1 # Hmmm...\n\nnp.float64(0.3) - np.float64(0.2) == np.float64(0.1)\n\n0.75 - 0.5 == 0.25\n0.6 - 0.4 == 0.2\n## any ideas what is different about those two comparisons?\n```\n:::\n\n\nNext, let's consider the number of digits of accuracy\nwe have for a variety of numbers. We'll use `format` within\na handy wrapper function, `dg`, defined earlier, to view as many digits as we want:\n\n\n::: {.cell}\n\n```{.python .cell-code}\na = 0.3\nb = 0.2\ndg(a)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.29999999999999998890\n```\n:::\n\n```{.python .cell-code}\ndg(b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.20000000000000001110\n```\n:::\n\n```{.python .cell-code}\ndg(a-b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.09999999999999997780\n```\n:::\n\n```{.python .cell-code}\ndg(0.1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.10000000000000000555\n```\n:::\n\n```{.python .cell-code}\ndg(1/3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.33333333333333331483\n```\n:::\n:::\n\n\nSo empirically, it looks like we're accurate up to the 16th decimal place\n\nBut actually, the key is the number of digits, not decimal places.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(1234.1234)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1234.12339999999994688551\n```\n:::\n\n```{.python .cell-code}\ndg(1234.123412341234)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1234.12341234123391586763\n```\n:::\n:::\n\n\nNotice that we can represent the result accurately only up to 16\nsignificant digits. This suggests no need to show more than 16\nsignificant digits and no need to print out any more when writing to a\nfile (except that if the number is bigger than $10^{16}$ then we need\nextra digits to correctly show the magnitude of the number if not using\nscientific notation). And of course, often we don't need anywhere near\nthat many.\n\nLet's return to our comparison, `0.75-0.5 == 0.25`.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(0.75)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.75000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(0.50)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.50000000000000000000\n```\n:::\n:::\n\n\nWhat's different about the numbers 0.75 and 0.5 compared to 0.3, 0.2,\n0.1?\n\n### Machine epsilon\n\n\n*Machine epsilon* is the term used for indicating the\n(relative) accuracy of real numbers and it is defined as the smallest\nfloat, $x$, such that $1+x\\ne1$:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n1e-16 + 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.0\n```\n:::\n\n```{.python .cell-code}\nnp.array(1e-16) + np.array(1.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.0\n```\n:::\n\n```{.python .cell-code}\n1e-15 + 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.000000000000001\n```\n:::\n\n```{.python .cell-code}\nnp.array(1e-15) + np.array(1.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.000000000000001\n```\n:::\n\n```{.python .cell-code}\n2e-16 + 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.0000000000000002\n```\n:::\n\n```{.python .cell-code}\nnp.finfo(np.float64).eps\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2.220446049250313e-16\n```\n:::\n\n```{.python .cell-code}\ndg(2e-16 + 1.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.00000000000000022204\n```\n:::\n:::\n\n::: {.cell}\n\n```{.python .cell-code}\n## What about in single precision, e.g. on a GPU?\nnp.finfo(np.float32).eps\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.1920929e-07\n```\n:::\n:::\n\n\n\n### Floating point representation\n\n*Floating point* refers to the decimal point (or *radix* point since we'll\nbe working with base 2 and *decimal* relates to 10). \n\nTo proceed further we need to consider scientific notation, such as in writing Avogadro's\nnumber as $+6.023\\times10^{23}$. As a\nbaseline for what is about to follow note that we can express a decimal\nnumber in the following expansion\n$$6.037=6\\times10^{0}+0\\times10^{-1}+3\\times10^{-2}+7\\times10^{-3}$$ A real number on a\ncomputer is stored in what is basically scientific notation:\n$$\\pm d_{0}.d_{1}d_{2}\\ldots d_{p}\\times b^{e}\\label{eq:floatRep}$$\nwhere $b$ is the base, $e$ is an integer and $d_{i}\\in\\{0,\\ldots,b-1\\}$.\n$e$ is called the *exponent* and $d=d_{1}d_{2}\\ldots d_{p}$ is called the *mantissa*.\n\nLet's consider the choices that the computer pioneers needed to make\nin using this system to represent numbers on a computer using base 2 ($b=2$).\nFirst, we need to choose the number of bits to represent $e$ so that we\ncan represent sufficiently large and small numbers. Second we need to\nchoose the number of bits, $p$, to allocate to \n$d=d_{1}d_{2}\\ldots d_{p}$, which determines the accuracy of any\ncomputer representation of a real.\n\nThe great thing about floating points\nis that we can represent numbers that range from incredibly small to\nvery large while maintaining good precision. The floating point *floats*\nto adjust to the size of the number. Suppose we had only three digits to\nuse and were in base 10. In floating point notation we can express\n$0.12\\times0.12=0.0144$ as\n$(1.20\\times10^{-1})\\times(1.20\\times10^{-1})=1.44\\times10^{-2}$, but if\nwe had fixed the decimal point, we'd have $0.120\\times0.120=0.014$ and\nwe'd have lost a digit of accuracy. (Furthermore, we wouldn't be able\nto represent numbers bigger than $0.99$.)\n\nMore specifically, the actual storage of a number on a computer these\ndays is generally as a double in the form:\n$$(-1)^{S}\\times1.d\\times2^{e-1023}=(-1)^{S}\\times1.d_{1}d_{2}\\ldots d_{52}\\times2^{e-1023}$$\nwhere the computer uses base 2, $b=2$, (so $d_{i}\\in\\{0,1\\}$) because\nbase-2 arithmetic is faster than base-10 arithmetic. The leading 1\nnormalizes the number; i.e., ensures there is a unique representation\nfor a given computer number. This avoids representing any number in\nmultiple ways, e.g., either\n$1=1.0\\times2^{0}=0.1\\times2^{1}=0.01\\times2^{2}$. For a double, we have\n8 bytes=64 bits. Consider our representation as ($S,d,e$) where $S$ is\nthe sign. The leading 1 is the *hidden bit* and doesn't need to be\nstored because it is always present. In general $e$ is\nrepresented using 11 bits ($2^{11}=2048$), and the subtraction takes the\nplace of having a sign bit for the exponent. (Note that in our\ndiscussion we'll just think of $e$ in terms of its base 10\nrepresentation, although it is of course represented in base 2.) This\nleaves $p=52 = 64-1-11$ bits for $d$.\n\nIn this code I force storage as a double by tacking on a decimal place, `.0`.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nbits(2.0**(-1)) # 1/2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111111100000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2.0**0) # 1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111111110000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2.0**1) # 2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100000000000000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2.0**1 + 2.0**0) # 3\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100000000001000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2.0**2) # 4\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100000000010000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(-2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'1100000000000000000000000000000000000000000000000000000000000000'\n```\n:::\n:::\n\n\nLet's see that we can manually work out the bit-wise representation\nof 3.25:\n\n\n::: {.cell}\n\n```{.python .cell-code}\nbits(3.25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100000000001010000000000000000000000000000000000000000000000000'\n```\n:::\n:::\n\n\nSo that is $1.101 \\times 2^{1024-1023} = 1\\times 2^{1} + 1\\times 2^{0} + 1\\times 2^{-2}$, where the 2nd through 12th\nbits are $10000000000$, which code for $1\\times 2^{10}=1024$.\n\n**Question**: Given a fixed number of bits for a number, what is the\ntradeoff between using bits for the $d$ part vs. bits for the $e$ part?\n\nLet's consider what can be represented exactly:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(.1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.10000000000000000555\n```\n:::\n\n```{.python .cell-code}\ndg(.5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.50000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(.25)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.25000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(.26)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.26000000000000000888\n```\n:::\n\n```{.python .cell-code}\ndg(1/32)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.03125000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(1/33)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.03030303030303030387\n```\n:::\n:::\n\n\nSo why is 0.5 stored exactly and 0.1 not stored exactly? By analogy,\nconsider the difficulty with representing 1/3 in base 10.\n\n## Overflow and underflow\n\nThe largest and smallest numbers we can represent are $2^{e_{\\max}}$ and\n$2^{e_{\\min}}$ where $e_{\\max}$ and $e_{\\min}$ are the smallest and\nlargest possible values of the exponent. Let's consider the exponent and\nwhat we can infer about the range of possible numbers. With 11 bits for\n$e$, we can represent $\\pm2^{10}=\\pm1024$ different exponent values (see\n`np.finfo(np.float64).maxexp`) (why is `np.finfo(np.float64).minexp` only\n-1022?). So the largest number we could represent is $2^{1024}$. What\nis this in base 10?\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = np.float64(10)\nx**308\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1e+308\n```\n:::\n\n```{.python .cell-code}\nx**309\n```\n\n::: {.cell-output .cell-output-stdout}\n```\ninf\n\n:1: RuntimeWarning: overflow encountered in double_scalars\n```\n:::\n\n```{.python .cell-code}\nnp.log10(2.0**1024)\n```\n\n::: {.cell-output .cell-output-error}\n```\nError: OverflowError: (34, 'Numerical result out of range')\n```\n:::\n\n```{.python .cell-code}\nnp.log10(2.0**1023)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n307.95368556425274\n```\n:::\n\n```{.python .cell-code}\nnp.finfo(np.float64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfinfo(resolution=1e-15, min=-1.7976931348623157e+308, max=1.7976931348623157e+308, dtype=float64)\n```\n:::\n:::\n\n\nWe could have been smarter about that calculation:\n$\\log_{10}2^{1024}=\\log_{2}2^{1024}/\\log_{2}10=1024/3.32\\approx308$. The\nresult is analogous for the smallest number, so we have that floating\npoints can range between $1\\times10^{-308}$ and $1\\times10^{308}$,\nconsistent with what numpy reports above. Producing\nsomething larger or smaller in magnitude than these values is called\noverflow and underflow respectively.\n\nLet's see what happens when we underflow in numpy. Note that there is no warning.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx**(-308)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1e-308\n```\n:::\n\n```{.python .cell-code}\nx**(-330)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0\n```\n:::\n:::\n\n\nSomething subtle happens for numbers like $10^{-309}$ through $10^{-323}$. They can actually be represented despite what I said above. Investigating that may be an extra credit problem on a problem set.\n\n\n## Integers or floats?\n\nValues stored as integers should overflow if they exceed the maximum integer.\n\nShould $2^{65}$ overflow?\n\n\n::: {.cell}\n\n```{.python .cell-code}\nnp.log2(np.iinfo(np.int64).max)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n63.0\n```\n:::\n\n```{.python .cell-code}\nx = np.int64(2)\n# Yikes!\nx**64\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0\n```\n:::\n:::\n\n\nPython's `int` type doesn't overflow.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# Interesting:\nprint(2**64)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18446744073709551616\n```\n:::\n\n```{.python .cell-code}\nprint(2**100)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1267650600228229401496703205376\n```\n:::\n:::\n\n\nOf course, doubles won't overflow until much larger values than 4- or 8-byte integers because we know they can be as big as $10^308$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = np.float64(2)\ndg(x**64, '.2f')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18446744073709551616.00\n```\n:::\n\n```{.python .cell-code}\ndg(x**100, '.2f')\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1267650600228229401496703205376.00\n```\n:::\n:::\n\n\nHowever we need to think about\nwhat integer-valued numbers can and can't be stored exactly in our base 2 representation of floating point numbers.\nIt turns out that integer-valued numbers can be stored exactly as doubles when their absolute\nvalue is less than $2^{53}$.\n\n> *Challenge*: Why $2^{53}$? Write out what integers can be stored exactly in our base 2 representation of floating point numbers.\n\nYou can force storage as integers or doubles in a few ways.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = 3; type(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n\n```\n:::\n\n```{.python .cell-code}\nx = np.float64(x); type(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n\n```\n:::\n\n```{.python .cell-code}\nx = 3.0; type(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n\n```\n:::\n\n```{.python .cell-code}\nx = np.float64(3); type(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n\n```\n:::\n:::\n\n\n## Precision\n\nConsider our representation as (*S, d, e*) where we have $p=52$ bits for\n$d$. Since we have $2^{52}\\approx0.5\\times10^{16}$, we can represent\nabout that many discrete values, which means we can accurately represent\nabout 16 digits (in base 10). The result is that floats on a computer\nare actually discrete (we have a finite number of bits), and if we get a\nnumber that is in one of the gaps (there are uncountably many reals),\nit's approximated by the nearest discrete value. The accuracy of our\nrepresentation is to within 1/2 of the gap between the two discrete\nvalues bracketing the true number. Let's consider the implications for\naccuracy in working with large and small numbers. By changing $e$ we can\nchange the magnitude of a number. So regardless of whether we have a\nvery large or small number, we have about 16 digits of accuracy, since\nthe absolute spacing depends on what value is represented by the least\nsignificant digit (the *ulp*, or *unit in the last place*) in $d$, i.e.,\nthe $p=52$nd one, or in terms of base 10, the 16th digit. Let's explore\nthis:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# large vs. small numbers\ndg(.1234123412341234)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12341234123412339607\n```\n:::\n\n```{.python .cell-code}\ndg(1234.1234123412341234) # not accurate to 16 decimal places \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1234.12341234123414324131\n```\n:::\n\n```{.python .cell-code}\ndg(123412341234.123412341234) # only accurate to 4 places \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n123412341234.12341308593750000000\n```\n:::\n\n```{.python .cell-code}\ndg(1234123412341234.123412341234) # no places! \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1234123412341234.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(12341234123412341234) # fewer than no places! \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n12341234123412340736.00000000000000000000\n```\n:::\n:::\n\n\nWe can see the implications of this in the context of calculations:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(1234567812345678.0 - 1234567812345677.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(12345678123456788888.0 - 12345678123456788887.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(12345678123456780000.0 - 12345678123456770000.0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n10240.00000000000000000000\n```\n:::\n:::\n\n\nThe spacing of possible computer numbers that have a magnitude of about\n1 leads us to another definition of *machine epsilon* (an alternative,\nbut essentially equivalent definition to that given [previously](#machine-epsilon). \nMachine epsilon tells us also about the relative spacing of\nnumbers.\n\nFirst let's consider numbers of magnitude one. The next biggest number we can represent after $1=1.00...00\\times2^{0}$ is $1.000...01\\times2^{0}$. The difference between those two numbers (i.e., the spacing) is\n$$\n\\begin{aligned}\n\\epsilon & = &0.00...01 \\times 2^{0} \\\\\n & =& 0 \\times 2^{0} + 0 \\times 2^{-1} + \\cdots + 0\\times 2^{-51} + 1\\times2^{-52}\\\\\n & =& 1\\times2^{-52}\\\\\n & \\approx & 2.2\\times10^{-16}.\n \\end{aligned}\n $$\n\n\nMachine epsilon gives\nthe *absolute spacing* for numbers near 1 and the *relative spacing* for\nnumbers with a different order of magnitude and therefore a different\nabsolute magnitude of the error in representing a real. The relative\nspacing at $x$ is $$\\frac{(1+\\epsilon)x-x}{x}=\\epsilon$$ since the next\nlargest number from $x$ is given by $(1+\\epsilon)x$.\n\nSuppose $x=1\\times10^{6}$. Then the absolute error in representing a\nnumber of this magnitude is $x\\epsilon\\approx2\\times10^{-10}$. (Actually\nthe error would be one-half of the spacing, but that's a minor\ndistinction.) We can see by looking at the numbers in decimal form,\nwhere we are accurate to the order $10^{-10}$ but not $10^{-11}$. This\nis equivalent to our discussion that we have only 16 digits of accuracy.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(1000000.1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n1000000.09999999997671693563\n```\n:::\n:::\n\n\nLet's see what arithmetic we can do exactly with integer-valued numbers stored as\ndoubles and how that relates to the absolute spacing of numbers we've\njust seen:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n2.0**52\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4503599627370496.0\n```\n:::\n\n```{.python .cell-code}\n2.0**52+1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4503599627370497.0\n```\n:::\n\n```{.python .cell-code}\n2.0**53\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9007199254740992.0\n```\n:::\n\n```{.python .cell-code}\n2.0**53+1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9007199254740992.0\n```\n:::\n\n```{.python .cell-code}\n2.0**53+2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n9007199254740994.0\n```\n:::\n\n```{.python .cell-code}\ndg(2.0**54)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18014398509481984.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(2.0**54+2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18014398509481984.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\ndg(2.0**54+4)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n18014398509481988.00000000000000000000\n```\n:::\n\n```{.python .cell-code}\nbits(2**53)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101000000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2**53+1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101000000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2**53+2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101000000000000000000000000000000000000000000000000000001'\n```\n:::\n\n```{.python .cell-code}\nbits(2**54)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101010000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2**54+2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101010000000000000000000000000000000000000000000000000000'\n```\n:::\n\n```{.python .cell-code}\nbits(2**54+4)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0100001101010000000000000000000000000000000000000000000000000001'\n```\n:::\n:::\n\n\nThe absolute spacing is $x\\epsilon$, so we have spacings of\n$2^{52}\\times2^{-52}=1$, $2^{53}\\times2^{-52}=2$,\n$2^{54}\\times2^{-52}=4$ for numbers of magnitude $2^{52}$, $2^{53}$, and\n$2^{54}$, respectively.\n\nWith a bit more work (e.g., using Mathematica), one can demonstrate that\ndoubles in Python in general are represented as the nearest number that can\nstored with the 64-bit structure we have discussed and that the spacing\nis as we have discussed. The results below show the spacing that\nresults, in base 10, for numbers around 0.1. The numbers Python reports are\nspaced in increments of individual bits in the base 2 representation.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndg(0.1234567812345678)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456779729\n```\n:::\n\n```{.python .cell-code}\ndg(0.12345678123456781)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456781117\n```\n:::\n\n```{.python .cell-code}\ndg(0.12345678123456782)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456782505\n```\n:::\n\n```{.python .cell-code}\ndg(0.12345678123456783)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456782505\n```\n:::\n\n```{.python .cell-code}\ndg(0.12345678123456784)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.12345678123456783892\n```\n:::\n\n```{.python .cell-code}\nbits(0.1234567812345678)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010000110'\n```\n:::\n\n```{.python .cell-code}\nbits(0.12345678123456781)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010000111'\n```\n:::\n\n```{.python .cell-code}\nbits(0.12345678123456782)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010001000'\n```\n:::\n\n```{.python .cell-code}\nbits(0.12345678123456783)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010001000'\n```\n:::\n\n```{.python .cell-code}\nbits(0.12345678123456784)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'0011111110111111100110101101110100010101110111110011010010001001'\n```\n:::\n:::\n\n\n## Working with higher precision numbers\n\nAs we've seen, Python will automatically work with integers in arbitrary precision.\n(Note that R does not do this -- R uses 4-byte integers, and for many calculations\nit's best to use R's `numeric` type because integers that aren't really large\ncan be expressed exactly.)\n\nFor higher precision floating point numbers you can make use of the `gmpy2`\npackage.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport gmpy2\ngmpy2.get_context().precision=200\ngmpy2.const_pi()\n\n## not sure why this shows ...00004\ngmpy2.mpfr(\".1234567812345678\") \n```\n:::\n\n\n\n\n# 3. Implications for calculations and comparisons\n\n## Computer arithmetic is not mathematical arithmetic!\n\nAs mentioned for integers, computer number arithmetic is not closed,\nunlike real arithmetic. For example, if we multiply two computer\nfloating points, we can overflow and not get back another computer\nfloating point. \n\nAnother mathematical concept we should consider here is that computer\narithmetic does not obey the associative and distributive laws, i.e.,\n$(a+b)+c$ may not equal $a+(b+c)$ on a computer and $a(b+c)$ may not be\nthe same as $ab+ac$. Here's an example with multiplication:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nval1 = 1/10; val2 = 0.31; val3 = 0.57\nres1 = val1*val2*val3\nres2 = val3*val2*val1\nres1 == res2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nFalse\n```\n:::\n\n```{.python .cell-code}\ndg(res1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.01766999999999999821\n```\n:::\n\n```{.python .cell-code}\ndg(res2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.01767000000000000168\n```\n:::\n:::\n\n\n## Calculating with integers vs. floating points\n\nIt's important to note that operations with integers are fast and exact\n(but can easily overflow -- albeit not with Python's base `int`) while operations with floating points are\nslower and approximate. Because of this slowness, floating point\noperations (*flops*) dominate calculation intensity and are used as the\nmetric for the amount of work being done - a multiplication (or\ndivision) combined with an addition (or subtraction) is one flop. We'll\ntalk a lot about flops in the unit on linear algebra.\n\n## Comparisons\n\nAs we saw, we should never test `x == y` unless:\n\n 1. `x` and `y` are represented as integers, \n 2. they are integer-valued but stored as doubles that are small enough that they can be stored exactly), or\n 3. they are decimal numbers that have been created in the same way (e.g., `0.4-0.3 == 0.4-0.3` returns `TRUE` but `0.1 == 0.4-0.3` does not). \n\nSimilarly we should be careful\nabout testing `x == 0`. And be careful of greater than/less than\ncomparisons. For example, be careful of `x[ x < 0 ] = np.nan` if what you\nare looking for is values that might be *mathematically* less than zero,\nrather than whatever is *numerically* less than zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n4 - 3 == 1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nTrue\n```\n:::\n\n```{.python .cell-code}\n4.0 - 3.0 == 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nTrue\n```\n:::\n\n```{.python .cell-code}\n4.1 - 3.1 == 1.0\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nFalse\n```\n:::\n\n```{.python .cell-code}\n0.4-0.3 == 0.1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nFalse\n```\n:::\n\n```{.python .cell-code}\n0.4-0.3 == 0.4-0.3\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nTrue\n```\n:::\n:::\n\n\nOne nice approach to checking for approximate equality is to make use of\n*machine epsilon*. If the relative spacing of two numbers is less than\n*machine epsilon*, then for our computer approximation, we say they are\nthe same. Here's an implementation that relies on the absolute spacing\nbeing $x\\epsilon$ (see above).\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nx = 12345678123456781000\ny = 12345678123456782000\n\ndef approx_equal(a,b):\n if abs(a - b) < np.finfo(np.float64).eps * abs(a + b):\n print(\"approximately equal\")\n else:\n print (\"not equal\")\n\n\napprox_equal(a,b)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nnot equal\n```\n:::\n\n```{.python .cell-code}\nx = 1234567812345678\ny = 1234567812345677\n\napprox_equal(a,b) \n```\n\n::: {.cell-output .cell-output-stdout}\n```\nnot equal\n```\n:::\n:::\n\n\nActually, we probably want to use a number slightly larger than\nmachine epsilon to be safe. \n\nFinally, sometimes we encounter the use of an unusual integer\nas a symbol for missing values. E.g., a datafile might store missing\nvalues as -9999. Testing for this using `==` with floats should generally be\nok:` x [ x == -9999 ] = np.nan`, because integers of this magnitude\nare stored exactly as floating point values. But to be really careful, you can read in as\nan integer or character type and do the assessment before converting to a float.\n\n## Calculations\n\nGiven the limited *precision* of computer numbers, we need to be careful\nwhen in the following two situations.\n\n1. Subtracting large numbers that are nearly equal (or adding negative\n and positive numbers of the same magnitude). You won't have the\n precision in the answer that you would like. How many decimal places\n of accuracy do we have here?\n\n \n\n ::: {.cell}\n \n ```{.python .cell-code}\n # catastrophic cancellation w/ large numbers\n dg(123456781234.56 - 123456781234.00)\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 0.55999755859375000000\n ```\n :::\n :::\n\n\n The absolute error in the original numbers here is of the order\n $\\epsilon x=2.2\\times10^{-16}\\cdot1\\times10^{11}\\approx1\\times10^{-5}=.00001$.\n While we might think that the result is close to the value 1 and\n should have error of about machine epsilon, the relevant absolute\n error is in the original numbers, so we actually only have about\n five significant digits in our result because we cancel out the\n other digits.\n\n This is called *catastrophic cancellation*, because most of the\n digits that are left represent rounding error -- many of the significant\n digits have cancelled with each other.\\\n Here's catastrophic cancellation with small numbers. The right\n answer here is exactly 0.000000000000000000001234.\n\n \n\n ::: {.cell}\n \n ```{.python .cell-code}\n # catastrophic cancellation w/ small numbers\n x = .000000000000123412341234\n y = .000000000000123412340000\n \n # So we know the right answer is .000000000000000000001234 exactly. \n \n dg(x-y, '.35f')\n ## [1] \"0.00000000000000000000123399999315140\"\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 0.00000000000000000000123399999315140\n ```\n :::\n :::\n\n\n But the result is accurate only to 8 places + 20 = 28 decimal\n places, as expected from a machine precision-based calculation,\n since the \"1\" is in the 13th position, after 12 zeroes (12+16=28).\n Ideally, we would have accuracy to 36 places (16 digits + the 20\n zeroes), but we've lost 8 digits to catastrophic cancellation.\n\n It's best to do any subtraction on numbers that are not too large.\n For example, if we compute the sum of squares in a naive way, we can\n lose all of the information in the calculation because the\n information is in digits that are not computed or stored accurately:\n $$s^{2}=\\sum x_{i}^{2}-n\\bar{x}^{2}$$\n\n \n\n ::: {.cell}\n \n ```{.python .cell-code}\n ## No problem here:\n x = np.array([-1.0, 0.0, 1.0])\n n = len(x)\n np.sum(x**2)-n*np.mean(x)**2 \n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 2.0\n ```\n :::\n \n ```{.python .cell-code}\n np.sum((x - np.mean(x))**2)\n \n ## Adding/subtracting a constant shouldn't change the result:\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 2.0\n ```\n :::\n \n ```{.python .cell-code}\n x = x + 1e8\n np.sum(x**2)-n*np.mean(x)**2 ## YIKES!\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 0.0\n ```\n :::\n \n ```{.python .cell-code}\n np.sum((x - np.mean(x))**2)\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 2.0\n ```\n :::\n :::\n\n\n A good principle to take away is to subtract off a number similar in\n magnitude to the values (in this case $\\bar{x}$ is obviously ideal)\n and adjust your calculation accordingly. In general, you can\n sometimes rearrange your calculation to avoid catastrophic\n cancellation. Another example involves the quadratic formula for\n finding a root (p. 101 of Gentle).\n\n2. Adding or subtracting numbers that are very different in magnitude.\n The precision will be that of the large magnitude number, since we\n can only represent that number to a certain absolute accuracy, which\n is much less than the absolute accuracy of the smaller number:\n\n \n\n ::: {.cell}\n \n ```{.python .cell-code}\n dg(123456781234.2)\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19999694824218750000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.1) # truth: 123456781234.1\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.09999084472656250000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.01) # truth: 123456781234.19\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19000244140625000000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.001) # truth: 123456781234.199\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19898986816406250000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.0001) # truth: 123456781234.1999\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19989013671875000000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.00001) # truth: 123456781234.19999\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19998168945312500000\n ```\n :::\n \n ```{.python .cell-code}\n dg(123456781234.2 - 0.000001) # truth: 123456781234.199999\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n 123456781234.19999694824218750000\n ```\n :::\n \n ```{.python .cell-code}\n 123456781234.2 - 0.000001 == 123456781234.2\n ```\n \n ::: {.cell-output .cell-output-stdout}\n ```\n True\n ```\n :::\n :::\n\n\n The larger number in the calculations above is of magnitude\n $10^{11}$, so the absolute error in representing the larger number\n is around $1\\times10^{^{-5}}$. Thus in the calculations above we can\n only expect the answers to be accurate to about $1\\times10^{-5}$. In\n the last calculation above, the smaller number is smaller than\n $1\\times10^{-5}$ and so doing the subtraction has had no effect.\n This is analogous to trying to do $1+1\\times10^{-16}$ and seeing\n that the result is still 1.\n\n A work-around when we are adding numbers of very different\n magnitudes is to add a set of numbers in increasing order. However,\n if the numbers are all of similar magnitude, then by the time you\n add ones later in the summation, the partial sum will be much larger\n than the new term. A (second) work-around to that problem is to add\n the numbers in a tree-like fashion, so that each addition involves a\n summation of numbers of similar size.\n\nGiven the limited *range* of computer numbers, be careful when you are:\n\n- Multiplying or dividing many numbers, particularly large or small\n ones. **Never take the product of many large or small numbers** as this\n can cause over- or under-flow. Rather compute on the log scale and\n only at the end of your computations should you exponentiate. E.g.,\n $$\\prod_{i}x_{i}/\\prod_{j}y_{j}=\\exp(\\sum_{i}\\log x_{i}-\\sum_{j}\\log y_{j})$$\n\nLet's consider some challenges that illustrate that last concern.\n\n- Challenge: consider multiclass logistic regression, where you have\n quantities like this:\n $$p_{j}=\\text{Prob}(y=j)=\\frac{\\exp(x\\beta_{j})}{\\sum_{k=1}^{K}\\exp(x\\beta_{k})}=\\frac{\\exp(z_{j})}{\\sum_{k=1}^{K}\\exp(z_{k})}$$\n for $z_{k}=x\\beta_{k}$. What will happen if the $z$ values are very\n large in magnitude (either positive or negative)? How can we\n reexpress the equation so as to be able to do the calculation? Hint:\n think about multiplying by $\\frac{c}{c}$ for a carefully chosen $c$.\n\n- Second challenge: The same issue arises in the following\n calculation. Suppose I want to calculate a predictive density (e.g.,\n in a model comparison in a Bayesian context): $$\\begin{aligned}\n f(y^{*}|y,x) & = & \\int f(y^{*}|y,x,\\theta)\\pi(\\theta|y,x)d\\theta\\\\\n & \\approx & \\frac{1}{m}\\sum_{j=1}^{m}\\prod_{i=1}^{n}f(y_{i}^{*}|x,\\theta_{j})\\\\\n & = & \\frac{1}{m}\\sum_{j=1}^{m}\\exp\\sum_{i=1}^{n}\\log f(y_{i}^{*}|x,\\theta_{j})\\\\\n & \\equiv & \\frac{1}{m}\\sum_{j=1}^{m}\\exp(v_{j})\\end{aligned}$$\n First, why do I use the log conditional predictive density? Second,\n let's work with an estimate of the unconditional predictive density\n on the log scale,\n $\\log f(y^{*}|y,x)\\approx\\log\\frac{1}{m}\\sum_{j=1}^{m}\\exp(v_{j})$.\n Now note that $e^{v_{j}}$ may be quite small as $v_{j}$ is the sum\n of log likelihoods. So what happens if we have terms something like\n $e^{-1000}$? So we can't exponentiate each individual $v_{j}$. This\n is what is known as the \"log sum of exponentials\" problem (and the\n solution as the \"log-sum-exp trick\"). Thoughts?\n\nNumerical issues come up frequently in linear algebra. For example, they\ncome up in working with positive definite and semi-positive-definite\nmatrices, such as covariance matrices. You can easily get negative\nnumerical eigenvalues even if all the eigenvalues are positive or\nnon-negative. Here's an example where we use an squared exponential\ncorrelation as a function of time (or distance in 1-d), which is\n*mathematically* positive definite (i.e., all the eigenvalues are\npositive) but not numerically positive definite:\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nxs = np.arange(100)\ndists = np.abs(xs[:, np.newaxis] - xs)\ncorr_matrix = np.exp(-(dists/10)**2) # This is a p.d. matrix (mathematically).\nscipy.linalg.eigvals(corr_matrix)[80:99] # But not numerically!\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.10937946e-16+9.49526594e-17j, -2.10937946e-16-9.49526594e-17j,\n -1.77590164e-16+1.30160558e-16j, -1.77590164e-16-1.30160558e-16j,\n -2.09305049e-16+0.00000000e+00j, 2.23869166e-16+3.21640840e-17j,\n 2.23869166e-16-3.21640840e-17j, 1.98271873e-16+9.08175827e-17j,\n 1.98271873e-16-9.08175827e-17j, -1.49116518e-16+0.00000000e+00j,\n -1.23773149e-16+6.06467275e-17j, -1.23773149e-16-6.06467275e-17j,\n -2.48071368e-18+1.51188749e-16j, -2.48071368e-18-1.51188749e-16j,\n -4.08131705e-17+6.79669911e-17j, -4.08131705e-17-6.79669911e-17j,\n 1.27901871e-16+2.34695655e-17j, 1.27901871e-16-2.34695655e-17j,\n 5.23476667e-17+4.08642121e-17j])\n```\n:::\n:::\n\n\n## Final note\n\nHow the computer actually does arithmetic with the floating point\nrepresentation in base 2 gets pretty complicated, and we won't go into\nthe details. These rules of thumb should be enough for our practical\npurposes. Monahan and the URL reference have many of the gory details.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/units/unit8-numbers.qmd b/units/unit8-numbers.qmd index 11caf3b..6f7d878 100644 --- a/units/unit8-numbers.qmd +++ b/units/unit8-numbers.qmd @@ -367,6 +367,9 @@ of 3.25: bits(3.25) ``` +So that is $1.101 \times 2^{1024-1023} = 1\times 2^{1} + 1\times 2^{0} + 1\times 2^{-2}$, where the 2nd through 12th +bits are $10000000000$, which code for $1\times 2^{10}=1024$. + **Question**: Given a fixed number of bits for a number, what is the tradeoff between using bits for the $d$ part vs. bits for the $e$ part? @@ -515,9 +518,20 @@ The spacing of possible computer numbers that have a magnitude of about 1 leads us to another definition of *machine epsilon* (an alternative, but essentially equivalent definition to that given [previously](#machine-epsilon). Machine epsilon tells us also about the relative spacing of -numbers. First let's consider numbers of magnitude one. The difference -between $1=1.00...00\times2^{0}$ and $1.000...01\times2^{0}$ is -$\epsilon=1\times2^{-52}\approx2.2\times10^{-16}$. Machine epsilon gives +numbers. + +First let's consider numbers of magnitude one. The next biggest number we can represent after $1=1.00...00\times2^{0}$ is $1.000...01\times2^{0}$. The difference between those two numbers (i.e., the spacing) is +$$ +\begin{aligned} +\epsilon & = &0.00...01 \times 2^{0} \\ + & =& 0 \times 2^{0} + 0 \times 2^{-1} + \cdots + 0\times 2^{-51} + 1\times2^{-52}\\ + & =& 1\times2^{-52}\\ + & \approx & 2.2\times10^{-16}. + \end{aligned} + $$ + + +Machine epsilon gives the *absolute spacing* for numbers near 1 and the *relative spacing* for numbers with a different order of magnitude and therefore a different absolute magnitude of the error in representing a real. The relative From ffc07b0728fb534a5905731d3bd4430a6bc5e3e1 Mon Sep 17 00:00:00 2001 From: Christopher Paciorek Date: Thu, 2 Nov 2023 10:40:21 -0700 Subject: [PATCH 15/17] some edits to unit 10 --- .../unit10-linalg/execute-results/html.json | 4 +- .../unit10-linalg/execute-results/tex.json | 4 +- units/unit10-linalg.qmd | 58 +++++++++++-------- 3 files changed, 39 insertions(+), 27 deletions(-) diff --git a/_freeze/units/unit10-linalg/execute-results/html.json b/_freeze/units/unit10-linalg/execute-results/html.json index daf9b99..69590e4 100644 --- a/_freeze/units/unit10-linalg/execute-results/html.json +++ b/_freeze/units/unit10-linalg/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "7cff00b7a51d43b73dea6de7106d65c0", + "hash": "04df3b9264ae4187721edd4da62e08c5", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2.220446049250313e-16\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n\ndelta_b = bPerturbed - b\ndelta_x = xPerturbed - x\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code below that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nprint(evals)\n\n## relative perturbation in x much bigger than in b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[3.02886853e+01 3.85805746e+00 1.01500484e-02 8.43107150e-01]\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_x) / norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_b) / norm2(b)\n\n## ratio of relative perturbations\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0033319453118976702\n```\n:::\n\n```{.python .cell-code}\n(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b))\n\n## ratio of largest and smallest magnitude eigenvalues\n## confusingly evals[2] is the smallest, not evals[3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2460.567236431514\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2984.092701676269\n```\n:::\n:::\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport statsmodels.api as sm\n\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\n\nbeta = np.array([5, .1, .0001])\ny = X1 @ beta + np.random.normal(size = len(t1))\n\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nnp.linalg.cond(np.dot(X1.T, X1)) # built-in!\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.653329826789808e+21\n```\n:::\n\n```{.python .cell-code}\nsm.OLS(y, X1).fit().params\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.19490003e+04, -1.18366839e+01, 3.08227764e-03])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\nI haven't shown the OLS results for the transformed version\nof the problem because the transformations modify the true\nparameter values, so there is a bit of arithmetic to be done,\nbut you should be able to verify that the second and third\napproaches give reasonable answers.\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\n## Transposes and inverses\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\nFor two invertible matrices, we have that\n$(AB)^{-1} = B^{-1}A^{-1}$ since\n$B^{-1}A^{-1} AB = I$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-8.881784197001252e-16\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n\ndelta_b = bPerturbed - b\ndelta_x = xPerturbed - x\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code below that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nprint(evals)\n\n## relative perturbation in x much bigger than in b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[3.02886853e+01 3.85805746e+00 1.01500484e-02 8.43107150e-01]\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_x) / norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_b) / norm2(b)\n\n## ratio of relative perturbations\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0033319453118976702\n```\n:::\n\n```{.python .cell-code}\n(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b))\n\n## ratio of largest and smallest magnitude eigenvalues\n## confusingly evals[2] is the smallest, not evals[3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2460.567236431514\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2984.092701676269\n```\n:::\n:::\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport statsmodels.api as sm\n\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\n\nbeta = np.array([5, .1, .0001])\ny = X1 @ beta + np.random.normal(size = len(t1))\n\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nnp.linalg.cond(np.dot(X1.T, X1)) # built-in!\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.653329826789808e+21\n```\n:::\n\n```{.python .cell-code}\nsm.OLS(y, X1).fit().params\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-3.61355412e+04, 3.61987534e+01, -8.91405553e-03])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\nI haven't shown the OLS results for the transformed version\nof the problem because the transformations modify the true\nparameter values, so there is a bit of arithmetic to be done,\nbut you should be able to verify that the second and third\napproaches give reasonable answers.\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in Python and R\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via `qr()`, which calls a\nFortran function. `qr()` (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, `qr()` returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of `\\$qr`, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn Python, the following will do it (on the log scale).\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set $k=0$.\n\n- Then iterate:\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/units/unit10-linalg/execute-results/tex.json b/_freeze/units/unit10-linalg/execute-results/tex.json index e952bfa..9658164 100644 --- a/_freeze/units/unit10-linalg/execute-results/tex.json +++ b/_freeze/units/unit10-linalg/execute-results/tex.json @@ -1,7 +1,7 @@ { - "hash": "7cff00b7a51d43b73dea6de7106d65c0", + "hash": "04df3b9264ae4187721edd4da62e08c5", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.440892098500626e-16\n```\n:::\n:::\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n\ndelta_b = bPerturbed - b\ndelta_x = xPerturbed - x\n```\n:::\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code below that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nprint(evals)\n\n## relative perturbation in x much bigger than in b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[3.02886853e+01 3.85805746e+00 1.01500484e-02 8.43107150e-01]\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_x) / norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_b) / norm2(b)\n\n## ratio of relative perturbations\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0033319453118976702\n```\n:::\n\n```{.python .cell-code}\n(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b))\n\n## ratio of largest and smallest magnitude eigenvalues\n## confusingly evals[2] is the smallest, not evals[3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2460.567236431514\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2984.092701676269\n```\n:::\n:::\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport statsmodels.api as sm\n\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\n\nbeta = np.array([5, .1, .0001])\ny = X1 @ beta + np.random.normal(size = len(t1))\n\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nnp.linalg.cond(np.dot(X1.T, X1)) # built-in!\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.653329826789808e+21\n```\n:::\n\n```{.python .cell-code}\nsm.OLS(y, X1).fit().params\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-2.85056265e+04, 2.85759104e+01, -7.01025606e-03])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\nI haven't shown the OLS results for the transformed version\nof the problem because the transformations modify the true\nparameter values, so there is a bit of arithmetic to be done,\nbut you should be able to verify that the second and third\napproaches give reasonable answers.\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in R and Python\n\nWe can get the Q and R matrices easily in Python.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via *qr()*, which calls a\nFortran function. *qr()* (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, *qr()* returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of *\\$qr*, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn R, the following will do it (on the log scale), since $R$ is stored\nin the upper triangle of the *\\$qr* element.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set$k=0$.\n\n- Then iterate\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details and for the figures shown in class, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\n## Transposes and inverses\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\nFor two invertible matrices, we have that\n$(AB)^{-1} = B^{-1}A^{-1}$ since\n$B^{-1}A^{-1} AB = I$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-2.220446049250313e-16\n```\n:::\n:::\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n\ndelta_b = bPerturbed - b\ndelta_x = xPerturbed - x\n```\n:::\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code below that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nprint(evals)\n\n## relative perturbation in x much bigger than in b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[3.02886853e+01 3.85805746e+00 1.01500484e-02 8.43107150e-01]\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_x) / norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_b) / norm2(b)\n\n## ratio of relative perturbations\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0033319453118976702\n```\n:::\n\n```{.python .cell-code}\n(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b))\n\n## ratio of largest and smallest magnitude eigenvalues\n## confusingly evals[2] is the smallest, not evals[3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2460.567236431514\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2984.092701676269\n```\n:::\n:::\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport statsmodels.api as sm\n\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\n\nbeta = np.array([5, .1, .0001])\ny = X1 @ beta + np.random.normal(size = len(t1))\n\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nnp.linalg.cond(np.dot(X1.T, X1)) # built-in!\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.653329826789808e+21\n```\n:::\n\n```{.python .cell-code}\nsm.OLS(y, X1).fit().params\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-7.08730861e+03, 7.17362346e+00, -1.66371671e-03])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\nI haven't shown the OLS results for the transformed version\nof the problem because the transformations modify the true\nparameter values, so there is a bit of arithmetic to be done,\nbut you should be able to verify that the second and third\napproaches give reasonable answers.\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in Python and R\n\nWe can get the Q and R matrices easily in Python.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via `qr()`, which calls a\nFortran function. `qr()` (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, `qr()` returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of `\\$qr`, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn Python, the following will do it (on the log scale).\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set $k=0$.\n\n- Then iterate:\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/units/unit10-linalg.qmd b/units/unit10-linalg.qmd index 3f34898..c4dea77 100644 --- a/units/unit10-linalg.qmd +++ b/units/unit10-linalg.qmd @@ -274,12 +274,18 @@ $|A|=|A^{\top}|$, which can be seen using the QR decomposition for $A$ and understanding properties of determinants of triangular matrices (in this case $R$) and orthogonal matrices (in this case $Q$). +## Transposes and inverses + For square, invertible matrices, we have that $(A^{-1})^{\top}=(A^{\top})^{-1}$. Why? Since we have $(AB)^{\top}=B^{\top}A^{\top}$, we have: $$A^{\top}(A^{-1})^{\top}=(A^{-1}A)^{\top}=I$$ so $(A^{\top})^{-1}=(A^{-1})^{\top}$. +For two invertible matrices, we have that +$(AB)^{-1} = B^{-1}A^{-1}$ since +$B^{-1}A^{-1} AB = I$. + #### Other matrix multiplications The Hadamard or direct product is simply multiplication of the @@ -1003,18 +1009,19 @@ diagonals to be positive). One algorithm for computing $U$ is: We can then solve a system of equations as: $U^{-1}(U^{\top-1}b)$. -Since numpy's `cholesky` gives $L = U^\top$, let's instead solve -the system as: $L^{\top-1}(L^{-1}b)$, which -in Python can be done in either of the following ways: +Confusingly, while numpy's `cholesky` gives $L = U^\top$, scipy +can return either $L$ or $U$ but defaults to $U$. + +Here are two ways we can use the Cholesky to solve a system of equations: ```{python, eval=FALSE} -L = sp.linalg.cholesky(A) +U = sp.linalg.cholesky(A) sp.linalg.solve_triangular(L.T, - sp.linalg.solve_triangular(L, b, lower=True), + sp.linalg.solve_triangular(U, b, lower=False, trans='T'), lower=False) -c, low = sp.linalg.cho_factor(A) -sp.linalg.cho_solve((c, low), b) +U, lower = sp.linalg.cho_factor(A) +sp.linalg.cho_solve((U, lower), b) ``` @@ -1031,7 +1038,7 @@ also a method for finding the Cholesky without square roots. The standard algorithm for generating $y\sim\mathcal{N}(0,A)$ is: ```{python, eval=FALSE} -L = sp.linalg.cholesky(A) +L = sp.linalg.cholesky(A, lower=True) y = L @ np.random.normal(size = n) ``` @@ -1041,14 +1048,20 @@ be spent? If a regression design matrix, $X$, is full rank, then $X^{\top}X$ is positive definite, so we could find $\hat{\beta}=(X^{\top}X)^{-1}X^{\top}Y$ using either the Cholesky or -Gaussian elimination. **Challenge**: write efficient R code to carry out -the OLS solution using either LU or Cholesky factorization. +Gaussian elimination. -However, it turns out that the standard approach is to work with $X$ +However, for OLS, it turns out that the standard approach is to work with $X$ using the QR decomposition rather than working with $X^{\top}X$; working with $X$ is more numerically stable, though in most situations without extreme collinearity, either of the approaches will be fine. +We could also consider the GLS estimator, which accounts for dependence +in the errors: $\hat{\beta}=(X^{\top}\Sigma^{-1}X)^{-1}X^{\top}\Sigma^{-1}Y$ + +**Challenge**: write efficient R code to carry out +the GLS solution using the Cholesky factorization. + + #### Numerical issues with eigendecompositions and Cholesky decompositions for positive definite matrices Monahan comments that in general Gaussian elimination and the Cholesky @@ -1110,7 +1123,7 @@ zero any linear combinations with very small variance. We can also use pivoting with the Cholesky and accumulate zeroes in the last $n-q$ rows (for cases where we try to take the square root of a negative number), corresponding to the columns of $A$ that are numerically linearly -dependent. See the *pivot* argument to R's *chol()*. +dependent. ## QR decomposition @@ -1184,7 +1197,7 @@ pretty quick unless $p$ is large since it is linear in $n$, so it may not be worth worrying too much about computational differences of the sort noted here. -### Regression and the QR in R and Python +### Regression and the QR in Python and R We can get the Q and R matrices easily in Python. @@ -1204,13 +1217,13 @@ that we get the basis vectors for the regression, while adding the remaining columns gives us the full $n$-dimensional space of the observations. -Regression in R uses the QR decomposition via *qr()*, which calls a -Fortran function. *qr()* (and the Fortran functions that are called) is +Regression in R uses the QR decomposition via `qr()`, which calls a +Fortran function. `qr()` (and the Fortran functions that are called) is specifically designed to output quantities useful in fitting linear models. -In R, *qr()* returns the result as a list meant for use by other tools. R -stores the $R$ matrix in the upper triangle of *\$qr*, while the lower +In R, `qr()` returns the result as a list meant for use by other tools. R +stores the $R$ matrix in the upper triangle of `\$qr`, while the lower triangle of *\$qr* and *\$aux* store the information for constructing $Q$ (this relates to the Householder-related vectors $u$ below). One can multiply by $Q$ using *qr.qy()* and by $Q^{\top}$ using *qr.qty()*. If @@ -1457,8 +1470,7 @@ orthogonal matrix is either one or minus one. $|A|=|QR|=|Q||R|=\pm|R|$ $|A^{\top}A|=|(QR)^{\top}QR|=|R^{\top}R|=|R_{1}^{\top}R_{1}|=|R_{1}|^{2}$\ -In R, the following will do it (on the log scale), since $R$ is stored -in the upper triangle of the *\$qr* element. +In Python, the following will do it (on the log scale). ```{python, eval=FALSE} Q,R = qr(A) @@ -1755,7 +1767,7 @@ mat2 = sparse.csr_array((mat.data, mat.indices, mat.indptr)) mat2.toarray() ``` -That's also how things are done in the *spam* package in R.``` +That's also how things are done in the `spam` package in R. We can do a fast matrix multiply, $x = Ab$, as follows in pseudo-code: @@ -1874,9 +1886,9 @@ basic algorithm: - Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and - set$k=0$. + set $k=0$. -- Then iterate +- Then iterate: - $\alpha_{k}=\frac{r_{(k)}^{\top}r_{(k)}}{d_{k}^{\top}Ad_{k}}$ (choose step size so next error will be orthogonal to current @@ -1908,7 +1920,7 @@ In general, CG is used for large sparse systems. See the [extensive description from Shewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf) -for more details and for the figures shown in class, as well as the use +for more details, as well as the use of CG when $A$ is not positive definite. #### Updating a solution From e71d847e6f3f2ae9e38bbb2b7b355675ebcf6f71 Mon Sep 17 00:00:00 2001 From: Christopher Paciorek Date: Thu, 2 Nov 2023 10:45:22 -0700 Subject: [PATCH 16/17] a bit more edits to unit 10 --- _freeze/units/unit10-linalg/execute-results/html.json | 4 ++-- _freeze/units/unit10-linalg/execute-results/tex.json | 4 ++-- units/unit10-linalg.qmd | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/_freeze/units/unit10-linalg/execute-results/html.json b/_freeze/units/unit10-linalg/execute-results/html.json index 69590e4..b040609 100644 --- a/_freeze/units/unit10-linalg/execute-results/html.json +++ b/_freeze/units/unit10-linalg/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "04df3b9264ae4187721edd4da62e08c5", + "hash": "d1d0a6f17e0930b47afaca760a06ac18", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\n## Transposes and inverses\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\nFor two invertible matrices, we have that\n$(AB)^{-1} = B^{-1}A^{-1}$ since\n$B^{-1}A^{-1} AB = I$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-8.881784197001252e-16\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n\ndelta_b = bPerturbed - b\ndelta_x = xPerturbed - x\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code below that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nprint(evals)\n\n## relative perturbation in x much bigger than in b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[3.02886853e+01 3.85805746e+00 1.01500484e-02 8.43107150e-01]\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_x) / norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_b) / norm2(b)\n\n## ratio of relative perturbations\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0033319453118976702\n```\n:::\n\n```{.python .cell-code}\n(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b))\n\n## ratio of largest and smallest magnitude eigenvalues\n## confusingly evals[2] is the smallest, not evals[3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2460.567236431514\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2984.092701676269\n```\n:::\n:::\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport statsmodels.api as sm\n\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\n\nbeta = np.array([5, .1, .0001])\ny = X1 @ beta + np.random.normal(size = len(t1))\n\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nnp.linalg.cond(np.dot(X1.T, X1)) # built-in!\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.653329826789808e+21\n```\n:::\n\n```{.python .cell-code}\nsm.OLS(y, X1).fit().params\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-3.61355412e+04, 3.61987534e+01, -8.91405553e-03])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\nI haven't shown the OLS results for the transformed version\nof the problem because the transformations modify the true\nparameter values, so there is a bit of arithmetic to be done,\nbut you should be able to verify that the second and third\napproaches give reasonable answers.\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in Python and R\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via `qr()`, which calls a\nFortran function. `qr()` (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, `qr()` returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of `\\$qr`, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn Python, the following will do it (on the log scale).\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set $k=0$.\n\n- Then iterate:\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\n## Transposes and inverses\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\nFor two invertible matrices, we have that\n$(AB)^{-1} = B^{-1}A^{-1}$ since\n$B^{-1}A^{-1} AB = I$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.440892098500626e-16\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n\ndelta_b = bPerturbed - b\ndelta_x = xPerturbed - x\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code below that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nprint(evals)\n\n## relative perturbation in x much bigger than in b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[3.02886853e+01 3.85805746e+00 1.01500484e-02 8.43107150e-01]\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_x) / norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_b) / norm2(b)\n\n## ratio of relative perturbations\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0033319453118976702\n```\n:::\n\n```{.python .cell-code}\n(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b))\n\n## ratio of largest and smallest magnitude eigenvalues\n## confusingly evals[2] is the smallest, not evals[3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2460.567236431514\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2984.092701676269\n```\n:::\n:::\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport statsmodels.api as sm\n\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\n\nbeta = np.array([5, .1, .0001])\ny = X1 @ beta + np.random.normal(size = len(t1))\n\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nnp.linalg.cond(np.dot(X1.T, X1)) # built-in!\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.653329826789808e+21\n```\n:::\n\n```{.python .cell-code}\nsm.OLS(y, X1).fit().params\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-1.02879965e+03, 1.16747888e+00, -1.75251012e-04])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\nI haven't shown the OLS results for the transformed version\nof the problem because the transformations modify the true\nparameter values, so there is a bit of arithmetic to be done,\nbut you should be able to verify that the second and third\napproaches give reasonable answers.\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in Python and R\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via `qr()`, which calls a\nFortran function. `qr()` (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, `qr()` returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of `\\$qr`, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn Python, the following will do it (on the log scale).\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set $k=0$.\n\n- Then iterate:\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/units/unit10-linalg/execute-results/tex.json b/_freeze/units/unit10-linalg/execute-results/tex.json index 9658164..a6242b7 100644 --- a/_freeze/units/unit10-linalg/execute-results/tex.json +++ b/_freeze/units/unit10-linalg/execute-results/tex.json @@ -1,7 +1,7 @@ { - "hash": "04df3b9264ae4187721edd4da62e08c5", + "hash": "d1d0a6f17e0930b47afaca760a06ac18", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\n## Transposes and inverses\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\nFor two invertible matrices, we have that\n$(AB)^{-1} = B^{-1}A^{-1}$ since\n$B^{-1}A^{-1} AB = I$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-2.220446049250313e-16\n```\n:::\n:::\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n\ndelta_b = bPerturbed - b\ndelta_x = xPerturbed - x\n```\n:::\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code below that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nprint(evals)\n\n## relative perturbation in x much bigger than in b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[3.02886853e+01 3.85805746e+00 1.01500484e-02 8.43107150e-01]\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_x) / norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_b) / norm2(b)\n\n## ratio of relative perturbations\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0033319453118976702\n```\n:::\n\n```{.python .cell-code}\n(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b))\n\n## ratio of largest and smallest magnitude eigenvalues\n## confusingly evals[2] is the smallest, not evals[3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2460.567236431514\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2984.092701676269\n```\n:::\n:::\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport statsmodels.api as sm\n\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\n\nbeta = np.array([5, .1, .0001])\ny = X1 @ beta + np.random.normal(size = len(t1))\n\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nnp.linalg.cond(np.dot(X1.T, X1)) # built-in!\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.653329826789808e+21\n```\n:::\n\n```{.python .cell-code}\nsm.OLS(y, X1).fit().params\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-7.08730861e+03, 7.17362346e+00, -1.66371671e-03])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\nI haven't shown the OLS results for the transformed version\nof the problem because the transformations modify the true\nparameter values, so there is a bit of arithmetic to be done,\nbut you should be able to verify that the second and third\napproaches give reasonable answers.\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in Python and R\n\nWe can get the Q and R matrices easily in Python.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via `qr()`, which calls a\nFortran function. `qr()` (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, `qr()` returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of `\\$qr`, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn Python, the following will do it (on the log scale).\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set $k=0$.\n\n- Then iterate:\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\n## Transposes and inverses\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\nFor two invertible matrices, we have that\n$(AB)^{-1} = B^{-1}A^{-1}$ since\n$B^{-1}A^{-1} AB = I$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n6.661338147750939e-16\n```\n:::\n:::\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n\ndelta_b = bPerturbed - b\ndelta_x = xPerturbed - x\n```\n:::\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code below that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nprint(evals)\n\n## relative perturbation in x much bigger than in b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[3.02886853e+01 3.85805746e+00 1.01500484e-02 8.43107150e-01]\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_x) / norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_b) / norm2(b)\n\n## ratio of relative perturbations\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0033319453118976702\n```\n:::\n\n```{.python .cell-code}\n(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b))\n\n## ratio of largest and smallest magnitude eigenvalues\n## confusingly evals[2] is the smallest, not evals[3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2460.567236431514\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2984.092701676269\n```\n:::\n:::\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport statsmodels.api as sm\n\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\n\nbeta = np.array([5, .1, .0001])\ny = X1 @ beta + np.random.normal(size = len(t1))\n\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nnp.linalg.cond(np.dot(X1.T, X1)) # built-in!\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.653329826789808e+21\n```\n:::\n\n```{.python .cell-code}\nsm.OLS(y, X1).fit().params\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.60671997e+04, -1.59483225e+01, 4.10859375e-03])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\nI haven't shown the OLS results for the transformed version\nof the problem because the transformations modify the true\nparameter values, so there is a bit of arithmetic to be done,\nbut you should be able to verify that the second and third\napproaches give reasonable answers.\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in Python and R\n\nWe can get the Q and R matrices easily in Python.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via `qr()`, which calls a\nFortran function. `qr()` (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, `qr()` returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of `\\$qr`, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn Python, the following will do it (on the log scale).\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set $k=0$.\n\n- Then iterate:\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/units/unit10-linalg.qmd b/units/unit10-linalg.qmd index c4dea77..17e9369 100644 --- a/units/unit10-linalg.qmd +++ b/units/unit10-linalg.qmd @@ -1009,14 +1009,14 @@ diagonals to be positive). One algorithm for computing $U$ is: We can then solve a system of equations as: $U^{-1}(U^{\top-1}b)$. -Confusingly, while numpy's `cholesky` gives $L = U^\top$, scipy -can return either $L$ or $U$ but defaults to $U$. +Confusingly, while numpy's `cholesky` gives $L = U^\top$, scipy's +`choleskey` can return either $L$ or $U$ but defaults to $U$. Here are two ways we can use the Cholesky to solve a system of equations: ```{python, eval=FALSE} U = sp.linalg.cholesky(A) -sp.linalg.solve_triangular(L.T, +sp.linalg.solve_triangular(U, sp.linalg.solve_triangular(U, b, lower=False, trans='T'), lower=False) From c2a12c69356fc5ae3ce6d7112040b59efc3d8d58 Mon Sep 17 00:00:00 2001 From: Christopher Paciorek Date: Thu, 2 Nov 2023 10:47:48 -0700 Subject: [PATCH 17/17] a bit more edits to unit 10 --- _freeze/units/unit10-linalg/execute-results/html.json | 4 ++-- _freeze/units/unit10-linalg/execute-results/tex.json | 4 ++-- units/unit10-linalg.qmd | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/_freeze/units/unit10-linalg/execute-results/html.json b/_freeze/units/unit10-linalg/execute-results/html.json index b040609..5072c1e 100644 --- a/_freeze/units/unit10-linalg/execute-results/html.json +++ b/_freeze/units/unit10-linalg/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "d1d0a6f17e0930b47afaca760a06ac18", + "hash": "5b7c8e8425b120ddbee5c90f23932b4d", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\n## Transposes and inverses\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\nFor two invertible matrices, we have that\n$(AB)^{-1} = B^{-1}A^{-1}$ since\n$B^{-1}A^{-1} AB = I$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.440892098500626e-16\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n\ndelta_b = bPerturbed - b\ndelta_x = xPerturbed - x\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code below that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nprint(evals)\n\n## relative perturbation in x much bigger than in b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[3.02886853e+01 3.85805746e+00 1.01500484e-02 8.43107150e-01]\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_x) / norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_b) / norm2(b)\n\n## ratio of relative perturbations\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0033319453118976702\n```\n:::\n\n```{.python .cell-code}\n(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b))\n\n## ratio of largest and smallest magnitude eigenvalues\n## confusingly evals[2] is the smallest, not evals[3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2460.567236431514\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2984.092701676269\n```\n:::\n:::\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport statsmodels.api as sm\n\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\n\nbeta = np.array([5, .1, .0001])\ny = X1 @ beta + np.random.normal(size = len(t1))\n\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nnp.linalg.cond(np.dot(X1.T, X1)) # built-in!\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.653329826789808e+21\n```\n:::\n\n```{.python .cell-code}\nsm.OLS(y, X1).fit().params\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-1.02879965e+03, 1.16747888e+00, -1.75251012e-04])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\nI haven't shown the OLS results for the transformed version\nof the problem because the transformations modify the true\nparameter values, so there is a bit of arithmetic to be done,\nbut you should be able to verify that the second and third\napproaches give reasonable answers.\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in Python and R\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via `qr()`, which calls a\nFortran function. `qr()` (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, `qr()` returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of `\\$qr`, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn Python, the following will do it (on the log scale).\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set $k=0$.\n\n- Then iterate:\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\n## Transposes and inverses\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\nFor two invertible matrices, we have that\n$(AB)^{-1} = B^{-1}A^{-1}$ since\n$B^{-1}A^{-1} AB = I$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-2.220446049250313e-16\n```\n:::\n:::\n\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n\ndelta_b = bPerturbed - b\ndelta_x = xPerturbed - x\n```\n:::\n\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code below that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nprint(evals)\n\n## relative perturbation in x much bigger than in b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[3.02886853e+01 3.85805746e+00 1.01500484e-02 8.43107150e-01]\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_x) / norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_b) / norm2(b)\n\n## ratio of relative perturbations\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0033319453118976702\n```\n:::\n\n```{.python .cell-code}\n(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b))\n\n## ratio of largest and smallest magnitude eigenvalues\n## confusingly evals[2] is the smallest, not evals[3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2460.567236431514\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2984.092701676269\n```\n:::\n:::\n\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport statsmodels.api as sm\n\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\n\nbeta = np.array([5, .1, .0001])\ny = X1 @ beta + np.random.normal(size = len(t1))\n\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nnp.linalg.cond(np.dot(X1.T, X1)) # built-in!\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.653329826789808e+21\n```\n:::\n\n```{.python .cell-code}\nsm.OLS(y, X1).fit().params\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.03931000e+04, -1.03449429e+01, 2.72550525e-03])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\n\nI haven't shown the OLS results for the transformed version\nof the problem because the transformations modify the true\nparameter values, so there is a bit of arithmetic to be done,\nbut you should be able to verify that the second and third\napproaches give reasonable answers.\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in Python and R\n\nWe can get the Q and R matrices easily in Python.\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via `qr()`, which calls a\nFortran function. `qr()` (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, `qr()` returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of `\\$qr`, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn Python, the following will do it (on the log scale).\n\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set $k=0$.\n\n- Then iterate:\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/units/unit10-linalg/execute-results/tex.json b/_freeze/units/unit10-linalg/execute-results/tex.json index a6242b7..cfbd8d0 100644 --- a/_freeze/units/unit10-linalg/execute-results/tex.json +++ b/_freeze/units/unit10-linalg/execute-results/tex.json @@ -1,7 +1,7 @@ { - "hash": "d1d0a6f17e0930b47afaca760a06ac18", + "hash": "5b7c8e8425b120ddbee5c90f23932b4d", "result": { - "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\n## Transposes and inverses\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\nFor two invertible matrices, we have that\n$(AB)^{-1} = B^{-1}A^{-1}$ since\n$B^{-1}A^{-1} AB = I$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n6.661338147750939e-16\n```\n:::\n:::\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n\ndelta_b = bPerturbed - b\ndelta_x = xPerturbed - x\n```\n:::\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code below that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nprint(evals)\n\n## relative perturbation in x much bigger than in b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[3.02886853e+01 3.85805746e+00 1.01500484e-02 8.43107150e-01]\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_x) / norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_b) / norm2(b)\n\n## ratio of relative perturbations\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0033319453118976702\n```\n:::\n\n```{.python .cell-code}\n(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b))\n\n## ratio of largest and smallest magnitude eigenvalues\n## confusingly evals[2] is the smallest, not evals[3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2460.567236431514\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2984.092701676269\n```\n:::\n:::\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport statsmodels.api as sm\n\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\n\nbeta = np.array([5, .1, .0001])\ny = X1 @ beta + np.random.normal(size = len(t1))\n\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nnp.linalg.cond(np.dot(X1.T, X1)) # built-in!\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.653329826789808e+21\n```\n:::\n\n```{.python .cell-code}\nsm.OLS(y, X1).fit().params\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([ 1.60671997e+04, -1.59483225e+01, 4.10859375e-03])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\nI haven't shown the OLS results for the transformed version\nof the problem because the transformations modify the true\nparameter values, so there is a bit of arithmetic to be done,\nbut you should be able to verify that the second and third\napproaches give reasonable answers.\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in Python and R\n\nWe can get the Q and R matrices easily in Python.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via `qr()`, which calls a\nFortran function. `qr()` (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, `qr()` returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of `\\$qr`, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn Python, the following will do it (on the log scale).\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set $k=0$.\n\n- Then iterate:\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", + "markdown": "---\ntitle: \"Numerical linear algebra\"\nauthor: \"Chris Paciorek\"\ndate: \"2023-10-24\"\nformat:\n pdf:\n documentclass: article\n margin-left: 30mm\n margin-right: 30mm\n toc: true\n html:\n theme: cosmo\n css: ../styles.css\n toc: true\n code-copy: true\n code-block-background: true\nexecute:\n freeze: auto\nfrom: markdown+tex_math_single_backslash\n---\n\n\n\n[PDF](./unit10-linalg.pdf){.btn .btn-primary}\n\nReferences:\n\n- Gentle: Numerical Linear Algebra for Applications in Statistics\n (available via UC Library Search) (my notes here are based primarily\n on this source) [Gentle-NLA]\n - Gentle: Matrix Algebra also has much of this material.\n- Gentle: Computational Statistics [Gentle-CS]\n- Lange: Numerical Analysis for Statisticians\n- Monahan: Numerical Methods of Statistics\n\nVideos (optional): \n\nThere are various videos from 2020 in the bCourses Media Gallery that you\ncan use for reference if you want to. \n\n - Video 1. Ill-conditioned problems, part 1\n - Video 2. Ill-conditioned problems, part 2\n - Video 3. Triangular systems of equations\n - Video 4. Solving systems of equations via LU, part 1\n - Video 5. Solving systems of equations via LU, part 2\n - Video 6. Solving systems of equations via LU, part 3\n - Video 7. Cholesky decomposition\n\n\nIn working through how to compute something or understanding an\nalgorithm, it can be very helpful to depict the matrices and vectors\ngraphically. We'll see this on the board in class.\n\n# 1. Preliminaries\n\n## Context\n\nMany statistical and machine learning methods involve linear algebra of\nsome sort - at the very least matrix multiplication and very often some\nsort of matrix decomposition to fit models and do analysis: linear\nregression, various more sophisticated forms of regression, deep neural\nnetworks, principle components analysis (PCA) and the wide varieties of\ngeneralizations and variations on PCA, etc., etc.\n\n## Goals\n\nHere's what I'd like you to get out of this unit:\n\n1. How to think about the computational order (number of computations\n involved) of a problem\n2. How to choose a computational approach to a given linear algebra\n calculation you need to do.\n3. An understanding of how issues with computer numbers (Unit 8) affect\n linear algebra calculations.\n\n## Key principle\n\n**The form of a mathematical expression and how it should be evaluated\non a computer may be very different.** Better computational approaches\ncan increase speed and improve the numerical properties of the\ncalculation.\n\n- Example 1 (already seen in Unit 5): If $X$ and $Y$ are matrices and $z$\nis a vector, we should compute $X(Yz)$ rather than $(XY)z$; the former\nis much more computationally efficient. \n- Example 2: We do not compute $(X^{\\top}X)^{-1}X^{\\top}Y$ by computing\n$X^{\\top}X$ and finding its inverse. In fact, perhaps more surprisingly,\nwe may never actually form $X^{\\top}X$ in some implementations.\n- Example 3: Suppose I have a matrix $A$, and I want to permute (switch)\ntwo rows. I can do this with a permutation matrix, $P$, which is mostly\nzeroes. On a computer, in general I wouldn't need to even change the\nvalues of $A$ in memory in some cases (e.g., if I were to calculate\n$PAB$). Why not?\n\n## Computational complexity\n\nWe can assess the computational complexity of a linear algebra\ncalculation by counting the number multiplys/divides and the number of\nadds/subtracts. Sidenote: addition is a bit faster than multiplication,\nso some algorithms attempt to trade multiplication for addition.\n\nIn general we do not try to count the actual number of calculations, but\njust their order, though in some cases in this unit we'll actually get a\nmore exact count. In general, we denote this as $O(f(n))$ which means\nthat the number of calculations approaches $cf(n)$ as $n\\to\\infty$\n(i.e., we know the calculation is approximately proportional to $f(n)$).\nConsider matrix multiplication, $AB$, with matrices of size $a\\times b$\nand $b\\times c$. Each column of the second matrix is multiplied by all\nthe rows of the first. For any given inner product of a row by a column,\nwe have $b$ multiplies. We repeat these operations for each column and\nthen for each row, so we have $abc$ multiplies so $O(abc)$ operations.\nWe could count the additions as well, but there's usually an addition\nfor each multiply, so we can usually just count the multiplys and then\nsay there are such and such {multiply and add}s. This is Monahan's\napproach, but you may see other counting approaches where one counts the\nmultiplys and the adds separately.\n\nFor two symmetric, $n\\times n$ matrices, this is $O(n^{3})$. Similarly,\nmatrix factorization (e.g., the Cholesky decomposition) is $O(n^{3})$\nunless the matrix has special structure, such as being sparse. As\nmatrices get large, the speed of calculations decreases drastically\nbecause of the scaling as $n^{3}$ and memory use increases drastically.\nIn terms of memory use, to hold the result of the multiply indicated\nabove, we need to hold $ab+bc+ac$ total elements, which for symmetric\nmatrices sums to $3n^{2}$. So for a matrix with $n=10000$, we have\n$3\\cdot10000^{2}\\cdot8/1e9=2.4$Gb.\n\nWhen we have $O(n^{q})$ this is known as polynomial time. Much worse is\n$O(b^{n})$ (exponential time), while much better is $O(\\log n$) (log\ntime). Computer scientists talk about NP-complete problems; these are\nessentially problems for which there is not a polynomial time\nalgorithm - it turns out all such problems can be rewritten such that\nthey are equivalent to one another.\n\nIn real calculations, it's possible to have the actual time ordering of\ntwo approaches differ from what the order approximations tell us. For\nexample, something that involves $n^{2}$ operations may be faster than\none that involves $1000(n\\log n+n)$ even though the former is $O(n^{2})$\nand the latter $O(n\\log n)$. The problem is that the constant, $c=1000$,\ncan matter (depending on how big $n$ is), as can the extra calculations\nfrom the lower order term(s), in this case $1000n$.\n\nA note on terminology: *flops* stands for both floating point operations\n(the number of operations required) and floating point operations per\nsecond, the speed of calculation.\n\n## Notation and dimensions\n\nI'll try to use capital letters for matrices, $A$, and lower-case for\nvectors, $x$. Then $x_{i}$ is the ith element of $x$, $A_{ij}$ is the\n$i$th row, $j$th column element, and $A_{\\cdot j}$ is the $j$th column\nand $A_{i\\cdot}$ the $i$th row. By default, we'll consider a vector,\n$x$, to be a one-column matrix, and $x^{\\top}$ to be a one-row matrix.\nSome of the references given at the start of this Unit also use $a_{ij}$ for $A_{ij}$ and\n$a_{j}$ for the $j$th column.\n\nThroughout, we'll need to be careful that the matrices involved in an\noperation are conformable: for $A+B$ both matrices need to be of the\nsame dimension, while for $AB$ the number of columns of $A$ must match\nthe number of rows of $B$. Note that this allows for $B$ to be a column\nvector, with only one column, $Ab$. Just checking dimensions is a good\nway to catch many errors. Example: is\n$\\mbox{Cov}(Ax)=A\\mbox{Cov}(x)A^{\\top}$ or\n$\\mbox{Cov}(Ax)=A^{\\top}\\mbox{Cov}(x)A$? Well, if $A$ is $m\\times n$, it\nmust be the former, as the latter is not conformable.\n\nThe **inner product** of two vectors is\n$\\sum_{i}x_{i}y_{i}=x^{\\top}y\\equiv\\langle x,y\\rangle\\equiv x\\cdot y$.\n\nThe **outer product** is $xy^{\\top}$, which comes from all pairwise\nproducts of the elements.\n\nWhen the indices of summation should be obvious, I'll sometimes leave\nthem implicit. Ask me if it's not clear.\n\n## Norms\n\nFor a vector, $\\|x\\|_{p}=(\\sum_{i}|x_{i}|^{p})^{1/p}$ and the standard (Euclidean)\nnorm is $\\|x\\|_{2}=\\sqrt{\\sum x_{i}^{2}}=\\sqrt{x^{\\top}x}$, just the\nlength of the vector in Euclidean space, which we'll refer to as\n$\\|x\\|$, unless noted otherwise.\n\nOne commonly used norm for a matrix is\nthe Frobenius norm, $\\|A\\|_{F}=(\\sum_{i,j}a_{ij}^{2})^{1/2}$.\n\nIn this Unit, we'll often make use of the **induced matrix norm**, which is\ndefined relative to a corresponding vector norm, $\\|\\cdot\\|$, as:\n$$\\|A\\|=\\sup_{x\\ne0}\\frac{\\|Ax\\|}{\\|x\\|}$$ So we have\n$$\\|A\\|_{2}=\\sup_{x\\ne0}\\frac{\\|Ax\\|_{2}}{\\|x\\|_{2}}=\\sup_{\\|x\\|_{2}=1}\\|Ax\\|_{2}$$\nIf you're not familiar with the supremum (\"sup\" above), you can just\nthink of it as taking the maximum. In the case of the 2-norm, the norm turns\nout to be the largest singular value in the singular value decomposition (SVD)\nof the matrix.\n\nWe can interpret the norm of a matrix as the most that the matrix\ncan stretch a vector when multiplying by the vector (relative to the\nlength of the vector).\n\nA property of any legitimate matrix norm (including the induced norm) is\nthat $\\|AB\\|\\leq\\|A\\|\\|B\\|$. Also recall that norms must obey the triangle\ninequality, $\\|A+B\\|\\leq\\|A\\|+\\|B\\|$.\n\nA normalized vector is one with \"length\", i.e., Euclidean norm, of one.\nWe can easily normalize a vector: $\\tilde{x}=x/\\|x\\|$\n\nThe angle between two vectors is\n$$\\theta=\\cos^{-1}\\left(\\frac{\\langle x,y\\rangle}{\\sqrt{\\langle x,x\\rangle\\langle y,y\\rangle}}\\right)$$\n\n## Orthogonality\n\nTwo vectors are orthogonal if $x^{\\top}y=0$, in which case we say\n$x\\perp y$. An **orthogonal matrix** is a square matrix in which all of the\ncolumns are orthogonal to each other and normalized. The same holds for\nthe rows. Orthogonal matrices\ncan be shown to have full rank. Furthermore if $A$ is orthogonal,\n$A^{\\top}A=I$, so $A^{-1}=A^{\\top}$. Given all this, the determinant of\northogonal $A$ is either 1 or -1. Finally the product of two orthogonal\nmatrices, $A$ and $B$, is also orthogonal since\n$(AB)^{\\top}AB=B^{\\top}A^{\\top}AB=B^{\\top}B=I$.\n\n#### Permutations\n\nSometimes we make use of matrices that permute two rows (or two columns)\nof another matrix when multiplied. Such a matrix is known as an\nelementary permutation matrix and is an orthogonal matrix with a\ndeterminant of -1. You can multiply such matrices to get more general\npermutation matrices that are also orthogonal. If you premultiply by\n$P$, you permute rows, and if you postmultiply by $P$ you permute\ncolumns. Note that on a computer, you wouldn't need to actually do the\nmultiply (and if you did, you should use a sparse matrix routine), but\nrather one can often just rework index values that indicate where\nrelevant pieces of the matrix are stored (more in the next section).\n\n## Some vector and matrix properties\n\n$AB\\ne BA$ but $A+B=B+A$ and $A(BC)=(AB)C$.\n\nIn Python, recall the syntax is\n\n\n::: {.cell}\n\n```{.python .cell-code}\nA + B\n\n# Matrix multiplication\nnp.matmul(A, B) \nA @ B # alternative\nA.dot(B) # not recommended by the NumPy docs\n\nA * B # Hadamard (direct) product\n```\n:::\n\n\nYou don't need the spaces, but they're nice for code readability.\n\n## Trace and determinant of square matrices\n\nThe trace of a matrix is the sum of the diagonal elements. For square\nmatrices, $\\mbox{tr}(A+B)=\\mbox{tr}(A)+\\mbox{tr}(B)$,\n$\\mbox{tr}(A)=\\mbox{tr}(A^{\\top})$.\n\nWe also have $\\mbox{tr}(ABC)=\\mbox{tr}(CAB)=\\mbox{tr}(BCA)$ - basically\nyou can move a matrix from the beginning to the end or end to beginning,\nprovided they are conformable for this operation. This is helpful for a\ncouple reasons:\n\n1. We can find the ordering that reduces computation the most if the\n individual matrices are not square.\n2. $x^{\\top}Ax=\\mbox{tr}(x^{\\top}Ax)$ since the quadratic form,\n $x^{\\top}Ax$, is a scalar, and this is equal to\n $\\mbox{tr}(xx^{\\top}A)$ where $xx^{\\top}A$ is a matrix. It can be\n helpful to be able to go back and forth between a scalar and a trace\n in some statistical calculations.\n\nFor square matrices, the determinant exists and we have $|AB|=|A||B|$\nand therefore, $|A^{-1}|=1/|A|$ since $|I|=|AA^{-1}|=1$. Also\n$|A|=|A^{\\top}|$, which can be seen using the QR decomposition for $A$\nand understanding properties of determinants of triangular matrices (in\nthis case $R$) and orthogonal matrices (in this case $Q$).\n\n## Transposes and inverses\n\nFor square, invertible matrices, we have that\n$(A^{-1})^{\\top}=(A^{\\top})^{-1}$. Why? Since we have\n$(AB)^{\\top}=B^{\\top}A^{\\top}$, we have:\n$$A^{\\top}(A^{-1})^{\\top}=(A^{-1}A)^{\\top}=I$$ so\n$(A^{\\top})^{-1}=(A^{-1})^{\\top}$.\n\nFor two invertible matrices, we have that\n$(AB)^{-1} = B^{-1}A^{-1}$ since\n$B^{-1}A^{-1} AB = I$.\n\n#### Other matrix multiplications\n\nThe Hadamard or direct product is simply multiplication of the\ncorrespoding elements of two matrices by each other. In R this is\nsimply` A * B`.\\\n**Challenge**: How can I find $\\mbox{tr}(AB)$ without using `A %*% B` ?\n\nThe Kronecker product is the product of each element of one matrix with\nthe entire other matrix\"\n\n$$A\\otimes B=\\left(\\begin{array}{ccc}\nA_{11}B & \\cdots & A_{1m}B\\\\\n\\vdots & \\ddots & \\vdots\\\\\nA_{n1}B & \\cdots & A_{nm}B\n\\end{array}\\right)$$\n\nThe inverse of a Kronecker product is the Kronecker product of the\ninverses,\n\n$$ B^{-1} \\otimes A^{-1} $$ \n\nwhich is obviously quite a bit faster because\nthe inverse (i.e., solving a system of equations) in this special case\nis $O(n^{3}+m^{3})$ rather than the naive approach being $O((nm)^{3})$.\n\n## Matrix decompositions\n\nA matrix decomposition is a re-expression of a matrix, $A$, in terms of\na product of two or three other, simpler matrices, where the\ndecomposition reveals structure or relationships present in the original\nmatrix, $A$. The \"simpler\" matrices may be simpler in various ways,\nincluding\n\n- having fewer rows or columns;\n- being diagonal, triangular or sparse in some way,\n- being orthogonal matrices.\n\nIn addition, once you have a decomposition, computation is generally\neasier, because of the special structure of the simpler matrices.\n\nWe'll see this in great detail in Section 3.\n\n# 2. Statistical interpretations of matrix invertibility, rank, etc.\n\n## Linear independence, rank, and basis vectors\n\nA set of vectors, $v_{1},\\ldots v_{n}$, is linearly independent (LIN)\nwhen none of the vectors can be represented as a linear combination,\n$\\sum c_{i}v_{i}$, of the others for scalars, $c_{1},\\ldots,c_{n}$. If\nwe have vectors of length $n$, we can have at most $n$ linearly\nindependent vectors. The rank of a matrix is the number of linearly\nindependent rows (or columns - it's the same), and is at most the\nminimum of the number of rows and number of columns. We'll generally\nthink about it in terms of the dimension of the column space - so we can\njust think about the number of linearly independent columns.\n\nAny set of linearly independent vectors (say $v_{1},\\ldots,v_{n}$) span\na space made up of all linear combinations of those vectors\n($\\sum_{i=1}^{n}c_{i}v_{i}$). The spanning vectors are known as basis\nvectors. We can express a vector $y$ that is in the space with respect\nto (as a linear combination of) basis vectors as $y=\\sum_{i}c_{i}v_{i}$,\nwhere if the basis vectors are normalized and orthogonal, we can find\nthe weights as $c_{i}=\\langle y,v_{i}\\rangle$.\n\nConsider a regression context. We have $p$ covariates ($p$ columns in\nthe design matrix, $X$), of which $q\\leq p$ are linearly independent\ncovariates. This means that $p-q$ of the vectors can be written as\nlinear combos of the $q$ vectors. The space spanned by the covariate\nvectors is of dimension $q$, rather than $p$, and $X^{\\top}X$ has $p-q$\neigenvalues that are zero. The $q$ LIN vectors are basis vectors for the\nspace - we can represent any point in the space as a linear combination\nof the basis vectors. You can think of the basis vectors as being like\nthe axes of the space, except that the basis vectors are not orthogonal.\nSo it's like denoting a point in $\\Re^{q}$ as a set of $q$ numbers\ntelling us where on each of the axes we are - this is the same as a\nlinear combination of axis-oriented vectors.\n\nWhen fitting a regression, if $n=p=q$, a vector of $n$ observations can\nbe represented exactly as a linear combination of the $p$ basis vectors,\nso there is no residual and we have a single unique (and exact) solution\n(e.g., with $n=p=2$, the observations fall exactly on the simple linear\nregression line). If $np$, so the system is overdetermined - there is no exact\nsolution, but regression is all about finding solutions that minimize\nsome criterion about the differences between the observations and linear\ncombinations of the columns of the $X$ matrix (such as least squares or\npenalized least squares). In standard regression, we project the\nobservation vector onto the space spanned by the columns of the $X$\nmatrix, so we find the point in the space closest to the observation\nvector.\n\n## Invertibility, singularity, rank, and positive definiteness\n\nFor square matrices, let's consider how invertibility, singularity, rank\nand positive (or non-negative) definiteness relate.\n\nSquare matrices that are \"regular\" have an eigendecomposition,\n$A=\\Gamma\\Lambda\\Gamma^{-1}$ where $\\Gamma$ is a matrix with the\neigenvectors as the columns and $\\Lambda$ is a diagonal matrix of\neigenvalues, $\\Lambda_{ii}=\\lambda_{i}$. Symmetric matrices and matrices\nwith unique eigenvalues are regular, as are some other matrices. The\nnumber of non-zero eigenvalues is the same as the rank of the matrix.\nSquare matrices that have an inverse are also called nonsingular, and\nthis is equivalent to having full rank. If the matrix is symmetric, the\neigenvectors and eigenvalues are real and $\\Gamma$ is orthogonal, so we\nhave $A=\\Gamma\\Lambda\\Gamma^{\\top}$. The determinant of the matrix is\nthe product of the eigenvalues (why?), which is zero if it is less than\nfull rank. Note that if none of the eigenvalues are zero then\n$A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$.\n\nLet's focus on symmetric matrices. The symmetric matrices that tend to\narise in statistics are either positive definite (p.d.) or non-negative\ndefinite (n.n.d.). If a matrix is positive definite, then by definition\n$x^{\\top}Ax>0$ for any $x$. Note that if $\\mbox{Cov}(y)=A$ then\n$x^{\\top}Ax=x^{\\top}\\mbox{Cov}(y)x=\\mbox{Cov}(x^{\\top}y)=\\mbox{Var}(x^{\\top}y)$\nif so positive definiteness amounts to having linear combinations of\nrandom variables (with the elements of $x$ here being the weights)\nhaving positive variance. So we must have that positive definite\nmatrices are equivalent to variance-covariance matrices (I'll just refer\nto this as a variance matrix or as a covariance matrix). If $A$ is p.d.\nthen it has all positive eigenvalues and it must have an inverse, though\nas we'll see, from a numerical perspective, we may not be able to\ncompute it if some of the eigenvalues are very close to zero. In Python,\n`numpy.linalg.eig(A)[1]` is $\\Gamma$, with each column a vector, and\n`numpy.linalg.eig(A)[0]` contains the (unordered) eigenvalues.\n\nTo summarize, here are some of the various connections between\nmathematical and statistical properties of **positive definite**\nmatrices:\n\n$A$ positive definite $\\Leftrightarrow$ $A$ is a covariance matrix\n$\\Leftrightarrow$ $x^{\\top}Ax>0$ $\\Leftrightarrow$ $\\lambda_{i}>0$\n(positive eigenvalues) $\\Rightarrow$$|A|>0$ $\\Rightarrow$$A$ is\ninvertible $\\Leftrightarrow$ $A$ is non singular $\\Leftrightarrow$ $A$ is\nfull rank.\n\nAnd here are connections for positive semi-definite matrices:\n\n$A$ positive semi-definite $\\Leftrightarrow$ $A$ is a constrained\ncovariance matrix $\\Leftrightarrow$ $x^{\\top}Ax\\geq0$ and equal to 0 for\nsome $x$ $\\Leftrightarrow$ $\\lambda_{i}\\geq 0$ (non-negative eigenvalues),\nwith at least one zero $\\Rightarrow$ $|A|=0$ $\\Leftrightarrow$ $A$ is not\ninvertible $\\Leftrightarrow$ $A$ is singular $\\Leftrightarrow$ $A$ is not\nfull rank.\n\n## Interpreting an eigendecomposition\n\nLet's interpret the eigendecomposition in a generative context as a way\nof generating random vectors. We can generate $y$ s.t. $\\mbox{Cov}(y)=A$\nif we generate $y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$ and\n$\\Lambda^{1/2}$ is formed by taking the square roots of the eigenvalues.\nSo $\\sqrt{\\lambda_{i}}$ is the standard deviation associated with the\nbasis vector $\\Gamma_{\\cdot i}$. That is, the $z$'s provide the weights\non the basis vectors, with scaling based on the eigenvalues. So $y$ is\nproduced as a linear combination of eigenvectors as basis vectors, with\nthe variance attributable to the basis vectors determined by the\neigenvalues.\n\nTo go the other direction, we can project a vector $y$ onto the space \nspanned by the eigenvectors: $w = (\\Gamma^{\\top}\\Gamma)^{-1}\\Gamma^{\\top}y = \\Gamma^{\\top}y = \\Lambda^{1/2}z$,\nwhere the simplification of course comes from $\\Gamma$ being orthogonal.\n\nIf $x^{\\top}Ax\\geq0$ then $A$ is nonnegative definite (also called\npositive semi-definite). In this case one or more eigenvalues can be\nzero. Let's interpret this a bit more in the context of generating\nrandom vectors based on non-negative definite matrices,\n$y=\\Gamma\\Lambda^{1/2}z$ where $\\mbox{Cov}(z)=I$. Questions:\n\n1. What does it mean when one or more eigenvalue (i.e.,\n $\\lambda_{i}=\\Lambda_{ii}$) is zero?\n\n2. Suppose I have an eigenvalue that is very small and I set it to\n zero? What will be the impact upon $y$ and $\\mbox{Cov}(y)$?\n\n3. Now let's consider the inverse of a covariance matrix, known as the\n precision matrix, $A^{-1}=\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. What\n does it mean if a $(\\Lambda^{-1})_{ii}$ is very large? What if\n $(\\Lambda^{-1})_{ii}$ is very small?\n\nConsider an arbitrary $n\\times p$ matrix, $X$. Any crossproduct or sum\nof squares matrix, such as $X^{\\top}X$ is positive definite\n(non-negative definite if $p>n$). This makes sense as it's just a\nscaling of an empirical covariance matrix.\n\n## Generalized inverses (optional)\n\nSuppose I want to find $x$ such that $Ax=b$. Mathematically the answer\n(provided $A$ is invertible, i.e. of full rank) is $x=A^{-1}b$.\n\nGeneralized inverses arise in solving equations when $A$ is not full\nrank. A generalized inverse is a matrix, $A^{-}$ s.t. $AA^{-}A=A$. The\nMoore-Penrose inverse (the pseudo-inverse), $A^{+}$, is a (unique)\ngeneralized inverse that also satisfies some additional properties.\n$x=A^{+}b$ is the solution to the linear system, $Ax=b$, that has the\nshortest length for $x$.\n\nWe can find the pseudo-inverse based on an eigendecomposition (or an\nSVD) as $\\Gamma\\Lambda^{+}\\Gamma^{\\top}$. We obtain $\\Lambda^{+}$ from\n$\\Lambda$ as follows. For values $\\lambda_{i}>0$, compute\n$1/\\lambda_{i}$. All other values are set to 0. Let's interpret this\nstatistically. Suppose we have a precision matrix with one or more zero\neigenvalues and we want to find the covariance matrix. A zero eigenvalue\nmeans we have no precision, or infinite variance, for some linear\ncombination (i.e., for some basis vector). We take the pseudo-inverse\nand assign that linear combination zero variance.\n\nLet's consider a specific example. Autoregressive models are often used\nfor smoothing (in time, in space, and in covariates). A first order\nautoregressive model for $y_{1},y_{2},\\ldots,y_{T}$ has\n$E(y_{i}|y_{-i})=\\frac{1}{2}(y_{i-1}+y_{i+1})$. Another way of writing\nthe model is in time-order: $y_{i}=y_{i-1}+\\epsilon_{i}$. A second order\nautoregressive model has\n$E(y_{i}|y_{-i})=\\frac{1}{6}(4y_{i-1}+4y_{i+1}-y_{i-2}-y_{i+2})$. These\nconstructions basically state that each value should be a smoothed\nversion of its neighbors. One can figure out that the **precision**\nmatrix for $y$ in the first order model is $$\\left(\\begin{array}{ccccc}\n\\ddots & & \\vdots\\\\\n-1 & 2 & -1 & 0\\\\\n\\cdots & -1 & 2 & -1 & \\dots\\\\\n & 0 & -1 & 2 & -1\\\\\n & & \\vdots & & \\ddots\n\\end{array}\\right)$$ and in the second order model is\n\n$$\\left( \\begin{array}{ccccccc} \\ddots & & & \\vdots \\\\ 1 & -4 & 6 & -4 & 1 \\\\ \\cdots & 1 & -4 & 6 & -4 & 1 & \\cdots \\\\ & & 1 & -4 & 6 & -4 & 1 \\\\ & & & \\vdots \\end{array} \\right).$$ \n\nIf we look at the eigendecomposition of such\nmatrices, we see that in the first order case, the eigenvalue\ncorresponding to the constant eigenvector is zero.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport numpy as np\n\nprecMat = np.array([[1,-1,0,0,0],[-1,2,-1,0,0],[0,-1,2,-1,0],[0,0,-1,2,-1],[0,0,0,-1,1]])\ne = np.linalg.eig(precMat)\ne[0] # 4th eigenvalue is numerically zero\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.61803399e+00, 2.61803399e+00, 1.38196601e+00, 4.97762256e-17,\n 3.81966011e-01])\n```\n:::\n\n```{.python .cell-code}\ne[1][:,3] # constant eigenvector\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136])\n```\n:::\n:::\n\n\nThis means we have no information about the overall level of $y$. So how\nwould we generate sample $y$ vectors? We can't put infinite variance on\nthe constant basis vector and still generate samples. Instead we use the\npseudo-inverse and assign ZERO variance to the constant basis vector.\nThis corresponds to generating realizations under the constraint that\n$\\sum y_{i}$ has no variation, i.e., $\\sum y_{i}=\\bar{y}=0$ - you can\nsee this by seeing that $\\mbox{Var}(\\Gamma_{\\cdot i}^{\\top}y)=0$ when\n$\\lambda_{i}=0$.\n\n\n::: {.cell}\n\n```{.python .cell-code}\n# generate a realization\nevals = e[0]\nevals = 1/evals # variances\nevals[3] = 0 # generalized inverse\ny = e[1] @ ((evals ** 0.5) * np.random.normal(size = 5))\ny.sum()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n-1.1102230246251565e-16\n```\n:::\n:::\n\n\nIn the second order case, we have two non-identifiabilities: for the sum\nand for the linear component of the variation in $y$ (linear in the\nindices of $y$).\n\nI could parameterize a statistical model as $\\mu+y$ where $y$ has\ncovariance that is the generalized inverse discussed above. Then I allow\nfor both a non-zero mean and for smooth variation governed by the\nautoregressive structure. In the second-order case, I would need to add\na linear component as well, given the second non-identifiability.\n\n## Matrices arising in regression\n\nIn regression, we work with $X^{\\top}X$. Some properties of this matrix\nare that it is symmetric and non-negative definite (hence our use of\n$(X^{\\top}X)^{-1}$ in the OLS estimator). When is it not positive\ndefinite?\n\nFitted values are $X\\hat{\\beta}=X(X^{\\top}X)^{-1}X^{\\top}Y=HY$. The\n\"hat\" matrix, $H$, projects $Y$ into the column space of $X$. $H$ is\nidempotent: $HH=H$, which makes sense - once you've projected into the\nspace, any subsequent projection just gives you the same thing back. $H$\nis singular. Why? Also, under what special circumstance would it not be\nsingular?\n\n# 3. Computational issues\n\n## Storing matrices\n\nWe've discussed column-major and row-major storage of matrices. First,\nretrieval of matrix elements from memory is quickest when multiple\nelements are contiguous in memory. So in a column-major language (e.g.,\nR, Fortran), it is best to work with values in a common column (or\nentire columns) while in a row-major language (e.g., Python, C) for\nvalues in a common row.\n\nIn some cases, one can save space (and potentially speed) by overwriting\nthe output from a matrix calculation into the space occupied by an\ninput. This occurs in some clever implementations of matrix\nfactorizations.\n\n## Algorithms\n\nGood algorithms can change the efficiency of an algorithm by one or more\norders of magnitude, and many of the improvements in computational speed\nover recent decades have been in algorithms rather than in computer\nspeed.\n\nMost matrix algebra calculations can be done in multiple ways. For\nexample, we could compute $b=Ax$ in either of the following ways,\ndenoted here in pseudocode.\n\n1. Stack the inner products of the rows of $A$ with $x$.\\\n\n```\n for(i=1:n){ \n b_i = 0\n for(j=1:m){\n b_i = b_i + a_{ij} x_j\n }\n }\n```\n\n2. Take the linear combination (based on $x$) of the columns of $A$\\\n\n```\n for(i=1:n){ \n b_i = 0\n }\n for(j=1:m){\n for(i = 1:n){\n b_i = b_i + a_{ij} x_j \n }\n }\n```\n\nIn this case the two approaches involve the same number of operations\nbut the first might be better for row-major matrices (so might be how we\nwould implement in C) and the second for column-major (so might be how\nwe would implement in Fortran). \n\n**Challenge**: check whether the first\napproach is faster in Python. (Write the code just doing the outer loop and\ndoing the inner loop using vectorized calculation.)\n\n#### General computational issues\n\nThe same caveats we discussed in terms of computer arithmetic hold\nnaturally for linear algebra, since this involves arithmetic with many\nelements. Good implementations of algorithms are aware of the danger of\ncatastrophic cancellation and of the possibility of dividing by zero or\nby values that are near zero.\n\n## Ill-conditioned problems\n\n#### Basics\n\nA problem is ill-conditioned if small changes to values in the\ncomputation result in large changes in the result. This is quantified by\nsomething called the *condition number* of a calculation. For different\noperations there are different condition numbers.\n\nIll-conditionedness arises most often in terms of matrix inversion, so\nthe standard condition number is the \"condition number with respect to\ninversion\", which when using the $L_{2}$ norm is the ratio of the\nabsolute values of the largest to smallest eigenvalue. Here's an\nexample: $$A=\\left(\\begin{array}{cccc}\n10 & 7 & 8 & 7\\\\\n7 & 5 & 6 & 5\\\\\n8 & 6 & 10 & 9\\\\\n7 & 5 & 9 & 10\n\\end{array}\\right).$$ The solution of $Ax=b$ for $b=(32,23,33,31)$ is\n$x=(1,1,1,1)$, while the solution for $b+\\delta b=(32.1,22.9,33.1,30.9)$\nis $x+\\delta x=(9.2,-12.6,4.5,-1.1)$, where $\\delta$ is notation for a\nperturbation to the vector or matrix.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ndef norm2(x):\n return(np.sum(x**2) ** 0.5)\n\nA = np.array([[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]])\nb = np.array([32,23,33,31])\nx = np.linalg.solve(A, b)\n\nbPerturbed = np.array([32.1, 22.9, 33.1, 30.9])\nxPerturbed = np.linalg.solve(A, bPerturbed)\n\ndelta_b = bPerturbed - b\ndelta_x = xPerturbed - x\n```\n:::\n\n\n\nWhat's going on? Some manipulations with inequalities involving the\ninduced matrix norm (for any chosen vector norm, but we might as well\njust think about the Euclidean norm) (see Gentle-CS Sec. 5.1 or the derivation in class) give\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\leq\\|A\\|\\|A^{-1}\\|\\frac{\\|\\delta b\\|}{\\|b\\|}$$\nwhere we define the condition number w.r.t. inversion as\n$\\mbox{cond}(A)\\equiv\\|A\\|\\|A^{-1}\\|$. We'll generally work with the\n$L_{2}$ norm, and for a nonsingular square matrix the result is that the\ncondition number is the ratio of the absolute values of the largest and\nsmallest magnitude eigenvalues. This makes sense since $\\|A\\|_{2}$ is\nthe absolute value of the largest magnitude eigenvalue of $A$ and\n$\\|A^{-1}\\|_{2}$ that of the inverse of the absolute value of the\nsmallest magnitude eigenvalue of $A$.\n\nWe see in the code below that the large disparity in eigenvalues of $A$\nleads to an effect predictable from our inequality above, with the\ncondition number helping us find an upper bound.\n\n\n::: {.cell}\n\n```{.python .cell-code}\ne = np.linalg.eig(A)\nevals = e[0]\nprint(evals)\n\n## relative perturbation in x much bigger than in b\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[3.02886853e+01 3.85805746e+00 1.01500484e-02 8.43107150e-01]\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_x) / norm2(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n8.19847546803699\n```\n:::\n\n```{.python .cell-code}\nnorm2(delta_b) / norm2(b)\n\n## ratio of relative perturbations\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n0.0033319453118976702\n```\n:::\n\n```{.python .cell-code}\n(norm2(delta_x) / norm2(x)) / (norm2(delta_b) / norm2(b))\n\n## ratio of largest and smallest magnitude eigenvalues\n## confusingly evals[2] is the smallest, not evals[3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2460.567236431514\n```\n:::\n\n```{.python .cell-code}\n(evals[0]/evals[2])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n2984.092701676269\n```\n:::\n:::\n\n\nThe main use of these ideas for our purposes is in thinking about the\nnumerical accuracy of a linear system solution (Gentle-NLA Sec 3.4). On\na computer we have the system $$(A+\\delta A)(x+\\delta x)=b+\\delta b$$\nwhere the 'perturbation' is from the inaccuracy of computer numbers. Our\nexploration of computer numbers tells us that\n$$\\frac{\\|\\delta b\\|}{\\|b\\|}\\approx10^{-p};\\,\\,\\,\\frac{\\|\\delta A\\|}{\\|A\\|}\\approx10^{-p}$$\nwhere $p=16$ for standard double precision floating points. Following\nGentle, one gets the approximation\n\n$$\\frac{\\|\\delta x\\|}{\\|x\\|}\\approx\\mbox{cond}(A)10^{-p},$$ so if\n$\\mbox{cond}(A)\\approx10^{t}$, we have accuracy of order $10^{t-p}$\ninstead of $10^{-p}$. (Gentle cautions that this holds only if\n$10^{t-p}\\ll1$). So we can think of the condition number as giving us\nthe number of digits of accuracy lost during a computation relative to\nthe precision of numbers on the computer. E.g., a condition number of\n$10^{8}$ means we lose 8 digits of accuracy relative to our original 16\non standard systems. One issue is that estimating the condition number\nis itself subject to numerical error and requires computation of\n$A^{-1}$ (albeit not in the case of $L_{2}$ norm with square,\nnonsingular $A$) but see Golub and van Loan (1996; p. 76-78) for an\nalgorithm.\n\n#### Improving conditioning\n\nIll-conditioned problems in statistics often arise from collinearity of\nregressors. Often the best solution is not a numerical one, but\nre-thinking the modeling approach, as this generally indicates\nstatistical issues beyond just the numerical difficulties.\n\nA general comment on improving conditioning is that we want to avoid\nlarge differences in the magnitudes of numbers involved in a\ncalculation. In some contexts such as regression, we can center and\nscale the columns to avoid such differences - this will improve the\ncondition of the problem. E.g., in simple quadratic regression with\n$x=\\{1990,\\ldots,2010\\}$ (e.g., regressing on calendar years), we see\nthat centering and scaling the matrix columns makes a huge difference on\nthe condition number\n\n\n::: {.cell}\n\n```{.python .cell-code}\nimport statsmodels.api as sm\n\nt1 = np.arange(1990, 2011) # naive covariate\nX1 = np.column_stack((np.ones(21), t1, t1 ** 2))\n\nbeta = np.array([5, .1, .0001])\ny = X1 @ beta + np.random.normal(size = len(t1))\n\ne1 = np.linalg.eig(np.dot(X1.T, X1))\nnp.sort(e1[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([3.36018564e+14, 7.69949736e+02, 2.24079720e-08])\n```\n:::\n\n```{.python .cell-code}\nnp.linalg.cond(np.dot(X1.T, X1)) # built-in!\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n4.653329826789808e+21\n```\n:::\n\n```{.python .cell-code}\nsm.OLS(y, X1).fit().params\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([-3.44697388e+04, 3.44991618e+01, -8.48088284e-03])\n```\n:::\n\n```{.python .cell-code}\nt2 = t1 - 2000 # centered\nX2 = np.column_stack((np.ones(21), t2, t2 ** 2))\ne2 = np.linalg.eig(np.dot(X2.T, X2))\nwith np.printoptions(suppress=True):\n np.sort(e2[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([50677.70427505, 770. , 9.29572495])\n```\n:::\n\n```{.python .cell-code}\nt3 = t2/10 # centered and scaled\nX3 = np.column_stack((np.ones(21), t3, t3 ** 2))\ne3 = np.linalg.eig(np.dot(X3.T, X3))\nwith np.printoptions(suppress=True):\n np.sort(e3[0])[::-1]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\narray([24.11293487, 7.7 , 1.95366513])\n```\n:::\n:::\n\n\nI haven't shown the OLS results for the transformed version\nof the problem because the transformations modify the true\nparameter values, so there is a bit of arithmetic to be done,\nbut you should be able to verify that the second and third\napproaches give reasonable answers.\n\n\nThe basic story is that simple strategies often solve the problem, and\nthat you should be aware of the absolute and relative magnitudes\ninvolved in your calculations.\n\nOne rule of thumb is to try to work with numbers whose magnitude is\naround 1. We can often scale the values in our problem in order to do\nthis. I.e., change the units of your variables. Instead of personal\nincome in dollars, use personal income in thousands or hundreds of\nthousands of dollars.\n\n# 4. Matrix factorizations (decompositions) and solving systems of linear equations\n\nSuppose we want to solve the following linear system: \n\n$$\\begin{aligned} Ax & = & b\\\\ x & = & A^{-1}b \\end{aligned}$$ \n\n\nNumerically, this is never done by\nfinding the inverse and multiplying. Rather we solve the system using a\nmatrix decomposition (or equivalent set of steps). One approach uses\nGaussian elimination (equivalent to the LU decomposition), while another\nuses the Cholesky decomposition. There are also iterative methods that\ngenerate a sequence of approximations to the solution but reduce\ncomputation (provided they are stopped before the exact solution is\nfound).\n\nGentle-CS has a nice table overviewing the various factorizations (Table\n5.1, page 219). I've reproduced a variation on it here.\n\n\n\n| Name | Representation | Restrictions | Properties | Uses |\n| ----------| ----------------------| ------------| --------------------|-------------|\n| LU | $A_{nn}= L_{nn}U_{nn}$ | $A$ generally square | $L$ lower triangular; $U$ upper triangular | solving equations; inversion | \n| QR | $A_{nm}= Q_{nn}R_{nm}$ or $A_{nm}=Q_{nm}R_{mm}$(skinny) | | $Q$ orthogonal; $R$ upper triangular | regression |\n| Cholesky | $A_{nn}=U_{nn}^{\\top}U_{nn}$ | $A$ positive (semi-) definite | $U$ upper triangular | multivariate normal; covariance; solving equations; inversion |\n| Eigen decomposition | $A_{nn}=\\Gamma_{nn}\\Lambda_{nn}\\Gamma_{nn}^{\\top}$ | $A$ square, symmetric*| $\\Gamma$ orthogonal; $\\Lambda$ (non-negative**) diagonal | principal components analysis and related | \n| SVD | $A_{nm}=U_{nn}D_{nm}V_{mm}^{\\top}$ or $A_{nm}= U_{nk}D_{kk}V_{mk}^{\\top}$ | | $U, V$ orthogonal; $D$ (non-negative) diagonal | machine learning, topic models |\n\nTable: Matrix factorizations useful for statistics / data science / machine learning\n\n*For the eigen decomposition, I assume $A$ is symmetric, though there\nis a decomposition for non-symmetric $A$.\n\n** For positive definite or positive semi-definite $A$.\n\n## Triangular systems\n\nAs a preface, let's figure out how to solve $Ax=b$ if $A$ is upper\ntriangular. The basic algorithm proceeds from the bottom up (and\ntherefore is called a 'backsolve'. We solve for $x_{n}$ trivially, and\nthen move upwards plugging in the known values of $x$ and solving for\nthe remaining unknown in each row (each equation).\n\n1. $x_{n}=b_{n}/A_{nn}$\n2. Now for $kp$ then the leading $p$ rows of $R$ provide an upper triangular\nmatrix ($R_{1}$) and the remaining rows are 0. (I'm using $p$ because\nthe QR is generally applied to design matrices in regression). In this\ncase we really only need the first $p$ columns of $Q$, and we have\n$X=Q_{1}R_{1}$, the 'skinny' QR (this is what R's QR provides). For\nuniqueness, we can require the diagonals of $R$ to be nonnegative, and\nthen $R$ will be the same as the upper-triangular Cholesky factor of\n$X^{\\top}X$: \n\n$$\\begin{aligned} X^{\\top}X & = & R^{\\top}Q^{\\top}QR \\\\ & = & R^{\\top}R\\end{aligned}.$$ \n\n\nThere are three standard approaches for\ncomputing the QR, using (1) reflections (Householder transformations),\n(2) rotations (Givens transformations), or (3) Gram-Schmidt\northogonalization (see below for details).\n\nFor $n\\times n$ $X$, the QR (for the Householder approach) requires\n$2n^{3}/3$ flops, so QR is less efficient than LU or Cholesky.\n\nWe can also obtain the pseudo-inverse of $X$ from the QR:\n$X^{+}=[R_{1}^{-1}\\,0]Q^{\\top}$. In the case that $X$ is not full-rank,\nthere is a version of the QR that will work (involving pivoting) and we\nend up with some additional zeroes on the diagonal of $R_{1}$.\n\n### Regression and the QR\n\nOften QR is used to fit linear models, including in R. Consider the\nlinear model in the form $Y=X\\beta+\\epsilon$, finding\n$\\hat{\\beta}=(X^{\\top}X)^{-1}X^{\\top}Y$. Let's consider the skinny QR\nand note that $R^{\\top}$ is invertible. Therefore, we can express the\nnormal equations as \n\n$$\n\\begin{aligned} \nX^{\\top}X\\beta & = & X^{\\top} Y \\\\\nR^{\\top}Q^{\\top}QR\\beta & = & R^{\\top}Q^{\\top} Y \\\\\nR \\beta & = & Q^{\\top} Y\n\\end{aligned}\n$$ \n\n\nand solving for $\\beta$ is just a\nbacksolve since $R$ is upper-triangular. Furthermore the standard\nregression quantities, such as the hat matrix, the SSE, the residuals,\netc. can be easily expressed in terms of $Q$ and $R$.\n\nWhy use the QR instead of the Cholesky on $X^{\\top}X$? The condition\nnumber of $X$ is the square root of that of $X^{\\top}X$, and the $QR$\nfactorizes $X$. Monahan has a discussion of the condition of the\nregression problem, but from a larger perspective, the situations where\nnumerical accuracy is a concern are generally cases where the OLS\nestimators are not particularly helpful anyway (e.g., highly collinear\npredictors).\n\nWhat about computational order of the different approaches to least\nsquares? The Cholesky is $np^{2}+\\frac{1}{3}p^{3}$, an algorithm called\nsweeping is $np^{2}+p^{3}$ , the Householder method for QR is\n$2np^{2}-\\frac{2}{3}p^{3}$, and the modified Gram-Schmidt approach for\nQR is $2np^{2}$. So if $n\\gg p$ then Cholesky (and sweeping) are faster\nthan the QR approaches. According to Monahan, modified Gram-Schmidt is\nmost numerically stable and sweeping least. In general, regression is\npretty quick unless $p$ is large since it is linear in $n$, so it may\nnot be worth worrying too much about computational differences of the\nsort noted here.\n\n### Regression and the QR in Python and R\n\nWe can get the Q and R matrices easily in Python.\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = np.linalg.qr(X)\n```\n:::\n\n\nOne of the methods used by the [`statsmodel` package in Python\nuses the QR to fit a regression](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.fit.html).\n\nNote that by default in Python (and in R), you get the skinny QR, namely only the\nfirst $p$ rows of $R$ and the first $p$ columns of $Q$, where the latter\nform an orthonormal basis for the column space of $X$. The remaining\ncolumns form an orthonormal basis for the null space of $X$ (the space\northogonal to the column space of $X$). The analogy in regression is\nthat we get the basis vectors for the regression, while adding the\nremaining columns gives us the full $n$-dimensional space of the\nobservations.\n\nRegression in R uses the QR decomposition via `qr()`, which calls a\nFortran function. `qr()` (and the Fortran functions that are called) is\nspecifically designed to output quantities useful in fitting linear\nmodels. \n\nIn R, `qr()` returns the result as a list meant for use by other tools. R\nstores the $R$ matrix in the upper triangle of `\\$qr`, while the lower\ntriangle of *\\$qr* and *\\$aux* store the information for constructing\n$Q$ (this relates to the Householder-related vectors $u$ below). One can\nmultiply by $Q$ using *qr.qy()* and by $Q^{\\top}$ using *qr.qty()*. If\nyou want to extract $R$ and $Q$, the following will work:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nX.qr = qr(X)\nQ = qr.Q(X.qr)\nR = qr.R(X.qr) \n```\n:::\n\n\nAs a side note, there are QR-based functions that provide\nregression-related quantities, such as *qr.resid()*, *qr.fitted()* and\n*qr.coef()*. These functions (and their Fortran counterparts) exist\nbecause one can work through the various regression quantities of\ninterest and find their expressions in terms of $Q$ and $R$, with nice\nproperties resulting from $Q$ being orthogonal and $R$ triangular.\n\n### Computing the QR decomposition\n\nHere we'll see some of the details of the different approaches to the\nQR, in part because they involve some concepts that may be useful in\nother contexts. I won't expect you to see all of how this works, but\nplease skim through this to get an idea of how things are done.\n\nOne approach involves reflections of vectors and a second rotations of\nvectors. Reflections and rotations are transformations that are\nperformed by orthogonal matrices. The determinant of a reflection matrix\nis -1 and the determinant of a rotation matrix is 1. We'll see some of\nthe details in the demo code.\n\n#### QR Method 1: Reflections\n\nIf $u$ and $v$ are orthonormal vectors and $x$ is in the space spanned\nby $u$ and $v$, $x=c_{1}u+c_{2}v$, then $\\tilde{x}=-c_{1}u+c_{2}v$ is a\nreflection (a *Householder* reflection) along the $u$ dimension (since\nwe are using the negative of that basis vector). We can think of this as\nreflecting across the plane perpendicular to $u$. This extends simply to\nhigher dimensions with orthonormal vectors, $u,v_{1},v_{2},\\ldots$\n\nSuppose we want to formulate the reflection in terms of a \"Householder\"\nmatrix, $Q$. It turns out that $$Qx=\\tilde{x}$$ if $Q=I-2uu^{\\top}$. $Q$\nhas the following properties: (1) $Qu=-u$, (2) $Qv=v$ for $u^{\\top}v=0$,\n(3) $Q$ is orthogonal and symmetric.\n\nOne way to create the QR decomposition is by a series of Householder\ntransformations that create an upper triangular $R$ from $X$:\n\n$$\n\\begin{aligned}\nR & = & Q_{p}\\cdots Q_{1} X \\\\\nQ & = & (Q_{p}\\cdots Q_{1})^{\\top}\n\\end{aligned}\n$$ \n\n\nwhere we make use of\nthe symmetry in defining $Q$.\n\nBasically $Q_{1}$ reflects the first column of $X$ with respect to a\ncarefully chosen $u$, so that the result is all zeroes except for the\nfirst element. We want $Q_{1}x=\\tilde{x}=(||x||,0,\\ldots,0)$. This can\nbe achieved with $u=\\frac{x-\\tilde{x}}{||x-\\tilde{x}||}$. Then $Q_{2}$\nmakes the last $n-2$ rows of the second column equal to zero. We'll work\nthrough this a bit in class.\n\nIn the regression context, as we work through the individual\ntransformations, $Q_{j}=I-2u_{j}u_{j}^{\\top}$, we apply them to $X$ and\n$Y$ to create $R$ (note this would not involve doing the full matrix\nmultiplication - think about what calculations are actually needed) and\n$QY=Q^{\\top}Y$, and then solve $R\\beta=Q^{\\top}Y$. To find\n$\\mbox{Cov}(\\hat{\\beta})\\propto(X^{\\top}X)^{-1}=(R^{\\top}R)^{-1}=R^{-1}R^{-\\top}$\nwe do need to invert $R$, but it's upper-triangular and of dimension\n$p\\times p$. It turns out that $Q^{\\top}Y$ can be partitioned into the\nfirst $p$ and the last $n-p$ elements, $z^{(1)}$ and $z^{(2)}$. The SSR\nis $\\|z^{(1)}\\|^{2}$ and SSE is $\\|z^{(2)}\\|^{2}$.\n\nFinal side note: if $X$ is square (so $n=p)$ you might wonder why we\nneed $Q_{p}$ since after $p-1$ reflections, we don't need to zero\nanything else out (since the last column of $R$ has $n$ non-zero\nelements). It turns out that if we go back to thinking about a\nHouseholder reflection in general, there is a lack of uniqueness in\nchoosing $\\tilde{x}$. It could either be $(||x||,0,\\ldots,0)$ or\n$(-||x||,0,\\ldots,0)$. For better numerical stability, one chooses from\nthe two of those such that $x_{1}$ is of the opposite sign to\n$\\tilde{x}_{1}$, so that one avoids cancellation of numbers that may be\nof the same magnitude when doing $x-\\tilde{x}$. The transformation\n$Q_{p}$ is the last step of taking that approach of choosing the sign at\neach step. $Q_{p}$ doesn't zero anything out; it just basically just\ninvolves potentially setting $R_{pp}$ to be $-R_{pp}$. (To be honest,\nI'm not clear on why one would bother to do that last step, but that\nseems to be how it is presented in discussions of the Householder\napproach.) Of course in the case of $p2$, find interim vectors, $x_{k}^{(2)}$, by\n orthogonalizing with respect to $\\tilde{x}_{1}$\n\n3. Proceed for $k=3,\\ldots$, in turn orthogonalizing and normalizing\n the first of the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ and\n orthogonalizing the remaining vectors w.r.t. $\\tilde{x}_{k-1}$ to\n get new interim vectors\n\nMathematically, we could instead orthogonalize $x_{2}$ w.r.t.\n$\\tilde{x}_{1}$, then orthogonalize $x_{3}$ w.r.t.\n$\\{\\tilde{x}_{1},\\tilde{x}_{2}\\}$, etc. The algorithm above is the\n*modified* G-S, and is known to be more numerically stable if the\ncolumns of $X$ are close to collinear, giving vectors that are closer to\northogonal. The resulting $\\tilde{x}$ vectors are the columns of $Q$.\nThe elements of $R$ are obtained as we proceed: the diagonal values are\nthe the normalization values in the denominators, while the\noff-diagonals are the inner products with the already-computed columns\nof $Q$ that are computed as part of the numerators.\n\nAnother way to think about this is that $R=Q^{\\top}X$, which is the same\nas regressing the columns of $X$ on $Q,$ since\n$(Q^{\\top}Q)^{-1}Q^{\\top}X=Q^{\\top}X$. By construction, the first column\nof $X$ is a scaling of the first column of $Q$, the second column of $X$\nis a linear combination of the first two columns of $Q$, etc., so $R$\nbeing upper triangular makes sense.\n\n### The \"tall-skinny\" QR\n\nSuppose you have a very large regression problem, with $n$ very large,\nand $n\\gg p$. There is a variant of the QR, called the tall-skinny QR\n(see for details) that allows us\nto find the decomposition in a parallel fashion. The basic idea is to do\na nested set of QR decompositions on blocks of rows of $X$:\n\n$$\nX = \\left( \\begin{array}{c}\nX_{0} \\\\\nX_{1} \\\\\nX_{2} \\\\\nX_{3}\n\\end{array}\n\\right) =\n\\left(\n\\begin{array}{c}\nQ_{0} R_{0} \\\\\nQ_{1} R_{1} \\\\\nQ_{2} R_{2} \\\\\nQ_{3} R_{3}\n\\end{array} \\right),\n$$\n\nfollowed by 'reduction' steps (this\ncan be done in a map-reduce context) that do the $QR$ of pairs of the\n$R$ factors: \n$$\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\\\\\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)=\\left(\\begin{array}{c}\n\\left(\\begin{array}{c}\nR_{0}\\\\\nR_{1}\n\\end{array}\\right)\\\\\n\\left(\\begin{array}{c}\nR_{2}\\\\\nR_{3}\n\\end{array}\\right)\n\\end{array}\\right)=\\left(\\begin{array}{c}\nQ_{01}R_{01}\\\\\nQ_{23}R_{23}\n\\end{array}\\right)$$ and $$\\left(\\begin{array}{c}\nR_{01}\\\\\nR_{23}\n\\end{array}\\right)=Q_{0123}R_{0123}.$$ \n\nThe full decomposition is then\n\n$$X=\\left( \\begin{array}{cccc} Q_{0} & 0 & 0 & 0 \\\\ 0 & Q_{1} & 0 & 0 \\\\ 0 & 0 & Q_{2} & 0 \\\\ 0 & 0 & 0 & Q_{3} \\end{array} \\right) \\left( \\begin{array}{cc} Q_{01} & 0 \\\\ 0 & Q_{23} \\end{array} \\right) Q_{0123} R_{0123} = QR.$$\n\n\nThe computation can be done in\nparallel (in particular it can be done with map-reduce) and the $Q$\nmatrix for big problems would generally not be computed explicitly but\nwould be stored in its constituent pieces.\n\nAlternatively, there is a variant on the algorithm that processes the\nrow-blocks of $X$ serially, allowing you to do QR on a large tall-skinny\nmatrix that you can't fit in memory (or possibly even on disk). First\nyou do $QR$ on $X_{0}$ to get $Q_{0}R_{0}$. Then you stack $R_{0}$ on\ntop of $X_{1}$ and do QR to get $R_{01}$. Then stack $R_{01}$ on top of\n$X_{2}$ to get $R_{012}$, etc.\n\n## Determinants\n\nThe absolute value of the determinant of a square matrix can be found\nfrom the product of the diagonals of the triangular matrix in any\nfactorization that gives a triangular (including diagonal) matrix times\nan orthogonal matrix (or matrices) since the determinant of an\northogonal matrix is either one or minus one.\n\n$|A|=|QR|=|Q||R|=\\pm|R|$\n\n$|A^{\\top}A|=|(QR)^{\\top}QR|=|R^{\\top}R|=|R_{1}^{\\top}R_{1}|=|R_{1}|^{2}$\\\nIn Python, the following will do it (on the log scale).\n\n\n::: {.cell}\n\n```{.python .cell-code}\nQ,R = qr(A)\nmagn = np.sum(np.log(np.abs(np.diag(R)))) \n```\n:::\n\n\nAn alternative is the product of the diagonal elements of $D$ (the\nsingular values) in the SVD factorization, $A=UDV^{\\top}$.\n\nFor non-negative definite matrices, we know the determinant is\nnon-negative, so the uncertainty about the sign is not an issue. For\npositive definite matrices, a good approach is to use the product of the\ndiagonal elements of the Cholesky decomposition.\n\nOne can also use the product of the eigenvalues:\n$|A|=|\\Gamma\\Lambda\\Gamma^{-1}|=|\\Gamma||\\Gamma^{-1}||\\Lambda|=|\\Lambda|$\n\n#### Computation\n\nComputing from any of these diagonal or triangular matrices as the\nproduct of the diagonals is prone to overflow and underflow, so we\n**always** work on the log scale as the sum of the log of the values.\nWhen some of these may be negative, we can always keep track of the\nnumber of negative values and take the log of the absolute values.\n\nOften we will have the factorization as a result of other parts of the\ncomputation, so we get the determinant for free.\n\nWe can use `np.linalg.logdet()` or (definitely not recommended)\n`np.linalg.det()` to calculate the determinant in Python.\nThese functions use the LU decomposition.\n\n\n# 5. Eigendecomposition and SVD\n\n## Eigendecomposition \n\nThe eigendecomposition (spectral decomposition) is useful in considering\nconvergence of algorithms and of course for statistical decompositions\nsuch as PCA. We think of decomposing the components of variation into\northogonal patterns (the eigenvectors) with variances (eigenvalues)\nassociated with each pattern.\n\nSquare symmetric matrices have real eigenvectors and eigenvalues, with\nthe factorization into orthogonal $\\Gamma$ and diagonal $\\Lambda$,\n$A=\\Gamma\\Lambda\\Gamma^{\\top}$, where the eigenvalues on the diagonal of\n$\\Lambda$ are ordered in decreasing value. Of course this is equivalent\nto the definition of an eigenvalue/eigenvector pair as a pair such that\n$Ax=\\lambda x$ where $x$ is the eigenvector and $\\lambda$ is a scalar,\nthe eigenvalue. The inverse of the eigendecomposition is simply\n$\\Gamma\\Lambda^{-1}\\Gamma^{\\top}$. On a similar note, we can create a\nsquare root matrix, $\\Gamma\\Lambda^{1/2}$, by taking the square roots of\nthe eigenvalues.\n\nThe spectral radius of $A$, denoted $\\rho(A)$, is the maximum of the\nabsolute values of the eigenvalues. As we saw when talking about\nill-conditionedness, for symmetric matrices, this maximum is the induced\nnorm, so we have $\\rho(A)=\\|A\\|_{2}$. It turns out that\n$\\rho(A)\\leq\\|A\\|$ for any induced matrix norm. The spectral radius\ncomes up in determining the rate of convergence of some iterative\nalgorithms.\n\n#### Computation\n\nThere are several methods for eigenvalues; a common one for doing the\nfull eigendecomposition is the *QR algorithm*. The first step is to\nreduce $A$ to upper Hessenburg form, which is an upper triangular matrix\nexcept that the first subdiagonal in the lower triangular part can be\nnon-zero. For symmetric matrices, the result is actually tridiagonal. We\ncan do the reduction using Householder reflections or Givens rotations.\nAt this point the QR decomposition (using Givens rotations) is applied\niteratively (to a version of the matrix in which the diagonals are\nshifted), and the result converges to a diagonal matrix, which provides\nthe eigenvalues. It's more work to get the eigenvectors, but they are\nobtained as a product of Householder matrices (required for the initial\nreduction) multiplied by the product of the $Q$ matrices from the\nsuccessive QR decompositions.\n\nWe won't go into the algorithm in detail, but note that it involves\nmanipulations and ideas we've seen already.\n\nIf only the largest (or the first few largest) eigenvalues and their\neigenvectors are needed, which can come up in time series and Markov\nchain contexts, the problem is easier and can be solved by the *power\nmethod*. E.g., in a Markov chain context, steady state is reached\nthrough $x_{t}=A^{t}x_{0}$. One can find the largest eigenvector by\nmultiplying by $A$ many times, normalizing at each step.\n$v^{(k)}=Az^{(k-1)}$ and $z^{(k)}=v^{(k)}/\\|v^{(k)}\\|$. There is an\nextension to find the $p$ largest eigenvalues and their vectors. See the\ndemo code in the qmd source file for an implementation (in R).\n\n\n\n\n\n## Singular value decomposition\n\nLet's consider an $n\\times m$ matrix, $A$, with $n\\geq m$ (if $m>n$, we\ncan always work with $A^{\\top})$. This often is a matrix representing\n$m$ features of $n$ observations. We could have $n$ documents and $m$\nwords, or $n$ gene expression levels and $m$ experimental conditions,\netc. $A$ can always be decomposed as $$A=UDV^{\\top}$$ where $U$ and $V$\nare matrices with orthonormal columns (left and right eigenvectors) and\n$D$ is diagonal with non-negative values (which correspond to\neigenvalues in the case of square $A$ and to squared eigenvalues of\n$A^{\\top}A$).\n\nThe SVD can be represented in more than one way. One representation is\n$$A_{n\\times m}=U_{n\\times k}D_{k\\times k}V_{k\\times m}^{\\top}=\\sum_{j=1}^{k}D_{jj}u_{j}v_{j}^{\\top}$$\nwhere $u_{j}$ and $v_{j}$ are the columns of $U$ and $V$ and where $k$\nis the rank of $A$ (which is at most the minimum of $n$ and $m$ of\ncourse). The diagonal elements of $D$ are the singular values.\n\nThat representation is as the sum of rank-one matrices (since\neach term is the scaled outer product of two vectors). \n\nIf $A$ is positive semi-definite, the eigendecomposition is an SVD.\nFurthermore, $A^{\\top}A=VD^{2}V^{\\top}$ and $AA^{\\top}=UD^{2}U^{\\top}$,\nso we can find the eigendecomposition of such matrices using the SVD of\n$A$ (for $AA^{\\top}$ we need to fill out $U$ to have $n$ columns). Note\nthat the squares of the singular values of $A$ are the eigenvalues of\n$A^{\\top}A$ and $AA^{\\top}$.\n\nWe can also fill out the matrices to get\n$$A=U_{n\\times n}D_{n\\times m}V_{m\\times m}^{\\top}$$ where the added\nrows and columns of $D$ are zero with the upper left block the\n$D_{k\\times k}$ from above.\n\n#### Uses\n\nThe SVD is an excellent way to determine a matrix rank and to construct\na pseudo-inverse ($A^{+}=VD^{+}U^{\\top})$.\n\nWe can use the SVD to approximate $A$ by taking\n$A\\approx\\tilde{A}=\\sum_{j=1}^{p}D_{jj}u_{j}v_{j}^{\\top}$ for $pj+p$ and the upper bandwidth is $q$ ($A_{ij}=0$\nfor $j>i+q$). An alternative to reducing to $Ux=b^{*}$ is to compute\n$A=LU$ and then do two solutions, $U^{-1}(L^{-1}b)$. One can show that\nthe computational complexity of the LU factorization is $O(npq)$ for\nbanded matrices, while solving the two triangular systems is $O(np+nq)$,\nso for small $p$ and $q$, the speedup can be dramatic.\n\nBanded matrices come up in time series analysis. E.g., moving average (MA) models produce\nbanded covariance structures because the covariance is zero after a\ncertain number of lags.\n\n## Low rank updates (optional)\n\nA transformation of the form $A-uv^{\\top}$ is a rank-one update because\n$uv^{\\top}$ is of rank one.\n\nMore generally a low rank update of $A$ is $\\tilde{A}=A-UV^{\\top}$ where\n$U$ and $V$ are $n\\times m$ with $n\\geq m$. The\nSherman-Morrison-Woodbury formula tells us that\n$$\\tilde{A}^{-1}=A^{-1}+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\nso if we know $x_{0}=A^{-1}b$, then the solution to $\\tilde{A}x=b$ is\n$x+A^{-1}U(I_{m}-V^{\\top}A^{-1}U)^{-1}V^{\\top}x$. Provided $m$ is not\ntoo large, and particularly if we already have a factorization of $A$,\nthen $A^{-1}U$ is not too bad computationally, and\n$I_{m}-V^{\\top}A^{-1}U$ is $m\\times m$. As a result\n$A^{-1}(U(\\cdots)^{-1}V^{\\top}x)$ isn't too bad.\n\nThis also comes up in working with precision matrices in Bayesian\nproblems where we may have $A^{-1}$ but not $A$ (we often add precision\nmatrices to find conditional normal distributions). An alternative\nexpression for the formula is $\\tilde{A}=A+UCV^{\\top}$, and the identity\ntells us\n$$\\tilde{A}^{-1}=A^{-1}-A^{-1}U(C^{-1}+V^{\\top}A^{-1}U)^{-1}V^{\\top}A^{-1}$$\n\nBasically Sherman-Morrison-Woodbury gives us matrix identities that we\ncan use in combination with our knowledge of smart ways of solving\nsystems of equations.\n\n# 7. Iterative solutions of linear systems (optional)\n\n#### Gauss-Seidel\n\nSuppose we want to iteratively solve $Ax=b$. Here's the algorithm, which\nsequentially updates each element of $x$ in turn.\n\n- Start with an initial approximation, $x^{(0)}$.\n- Hold all but $x_{1}^{(0)}$ constant and solve to find\n $x_{1}^{(1)}=\\frac{1}{a_{11}}(b_{1}-\\sum_{j=2}^{n}a_{1j}x_{j}^{(0)})$.\n- Repeat for the other rows of $A$ (i.e., the other elements of $x$),\n finding $x^{(1)}$.\n- Now iterate to get $x^{(2)}$, $x^{(3)}$, etc. until a convergence\n criterion is achieved, such as $\\|x^{(k)}-x^{(k-1)}\\|\\leq\\epsilon$\n or $\\|r^{(k)}-r^{(k-1)}\\|\\leq\\epsilon$ for $r^{(k)}=b-Ax^{(k)}$.\n\nLet's consider how many operations are involved in a single update:\n$O(n)$ for each element, so $O(n^{2})$ for each update. Thus if we can\nstop well before $n$ iterations, we've saved computation relative to\nexact methods.\n\nIf we decompose $A=L+D+U$ where $L$ is strictly lower triangular, $U$ is\nstrictly upper triangular, then Gauss-Seidel is equivalent to solving\n$$(L+D)x^{(k+1)}=b-Ux^{(k)}$$ and we know that solving the lower\ntriangular system is $O(n^{2})$.\n\nIt turns out that the rate of convergence depends on the spectral radius\nof $(L+D)^{-1}U$.\n\nGauss-Seidel amounts to optimizing by moving in axis-oriented\ndirections, so it can be slow in some cases.\n\n#### Conjugate gradient\n\nFor positive definite $A$, conjugate gradient (CG) reexpresses the\nsolution to $Ax=b$ as an optimization problem, minimizing\n$$f(x)=\\frac{1}{2}x^{\\top}Ax-x^{\\top}b,$$ since the derivative of $f(x)$\nis $Ax-b$ and at the minimum this gives $Ax-b=0$.\n\nInstead of finding the minimum by following the gradient at each step\n(so-called steepest descent, which can give slow convergence - we'll see\na demonstration of this in the optimization unit), CG chooses directions\nthat are mutually conjugate w.r.t. $A$, $d_{i}^{\\top}Ad_{j}=0$ for\n$i\\ne j$. The method successively chooses vectors giving the direction,\n$d_{k}$, in which to move down towards the minimum and a scaling of how\nmuch to move, $\\alpha_{k}$. If we start at $x_{(0)}$, the $k$th point we\nmove to is $x_{(k)}=x_{(k-1)}+\\alpha_{k}d_{k}$ so we have\n$$x_{(k)}=x_{(0)}+\\sum_{j\\leq k}\\alpha_{j}d_{j}$$ and we use a\nconvergence criterion such as given above for Gauss-Seidel. The\ndirections are chosen to be the residuals, $b-Ax_{(k)}$. Here's the\nbasic algorithm:\n\n- Choose $x_{(0)}$ and define the residual, $r_{(0)}=b-Ax_{(0)}$ (the\n error on the scale of $b$) and the direction, $d_{0}=r_{(0)}$ and\n set $k=0$.\n\n- Then iterate:\n\n - $\\alpha_{k}=\\frac{r_{(k)}^{\\top}r_{(k)}}{d_{k}^{\\top}Ad_{k}}$\n (choose step size so next error will be orthogonal to current\n direction - which we can express in terms of the residual, which\n is easily computable)\n\n - $x_{(k+1)}=x_{(k)}+\\alpha_{k}d_{k}$ (update current value)\n\n - $r_{(k+1)}=r_{(k)}-\\alpha_{k}Ad_{k}$ (update current residual)\n\n - $d_{k+1}=r_{(k+1)}+\\frac{r_{(k+1)}^{\\top}r_{(k+1)}}{r_{(k)}^{\\top}r_{(k)}}d_{k}$\n (choose next direction by conjugate Gram-Schmidt, starting with\n $r_{(k+1)}$ and removing components that are not $A$-orthogonal\n to previous directions, but it turns out that $r_{(k+1)}$ is\n already $A$-orthogonal to all but $d_{k}$).\n\n- Stop when $\\|r^{(k+1)}\\|$ is sufficiently small.\n\nThe convergence of the algorithm depends in a complicated way on the\neigenvalues, but in general convergence is faster when the condition\nnumber is smaller (the eigenvalues are not too spread out). CG will in\nprinciple give the exact answer in $n$ steps (where $A$ is $n\\times n$).\nHowever, computationally we lose accuracy and interest in the algorithm\nis really as an iterative approximation where we stop before $n$ steps.\nThe approach basically amounts to moving in axis-oriented directions in\na space stretched by $A$.\n\nIn general, CG is used for large sparse systems.\n\nSee the [extensive description from\nShewchuk](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\nfor more details, as well as the use\nof CG when $A$ is not positive definite.\n\n#### Updating a solution\n\nSometimes we have solved a system, $Ax=b$ and then need to solve $Ax=c$.\nIf we have solved the initial system using a factorization, we can reuse\nthat factorization and solve the new system in $O(n^{2})$. Iterative\napproaches can do a nice job if $c=b+\\delta b$. Start with the solution\n$x$ for $Ax=b$ as $x^{(0)}$ and use one of the methods above.\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/units/unit10-linalg.qmd b/units/unit10-linalg.qmd index 17e9369..7667130 100644 --- a/units/unit10-linalg.qmd +++ b/units/unit10-linalg.qmd @@ -1010,7 +1010,7 @@ diagonals to be positive). One algorithm for computing $U$ is: We can then solve a system of equations as: $U^{-1}(U^{\top-1}b)$. Confusingly, while numpy's `cholesky` gives $L = U^\top$, scipy's -`choleskey` can return either $L$ or $U$ but defaults to $U$. +`cholesky` can return either $L$ or $U$ but defaults to $U$. Here are two ways we can use the Cholesky to solve a system of equations:

    (*=0HBG1$uCIo zd?9h9BbFu5OPb~?@;$LNwkR`$ASb~;3^_#&hFRxQqmJ9$1!6DwPUs?B&+sR}yQzXb zP-_L2aY#~-4(vO?F?xH^mZOs&7g=Aj>o@*HWvd{N&Zbu2jKiu! z-*WA;t#nO7Z}eN9@aTY;YhTw9#nDuW2_llWbPlYz#ws0AP!{vr?iA{7zZmSU0&l?v z+WCn12jzG*Hrj%6f=+3>8HiP(%ScU?pL^yCi&s15i^v@-U(>Ic$ zUbcKmHDBOv`~$N7NZP2$VDUx*C7#$n4&;hj6SZq8*M9mSIavAN^sOP2ygkAhc~RyY z1z;By=*yb$!_Hu*4k44=3@0c1BA{}it6!;z`ZuAVRRAWFJ^Uf_C{d9%%9#Sv2VR?k z+du5RcY=kc7>xE^8c#Deg+lC_j$|6{uXhR;-{9@eqj>cz(?N&$_OaVr-dwjMUikIA z<*cBkZUE_7WEh4SGnkA}y&&Xr2DztTEv2WderUA;Wyu}{puw;Z2W2Lx-u<)v116?N zA$PwXLK+YJ$tTqYIn7z83|6W5;TCECSvD^Cz%tNjMxn3d%ZfF62vXgUOk+=atGaSo zg%`6g>0Oh2JKafwM}rZ@DSCq;ZiL;Pk%PTtCaO4&LCem|#ZQ~t;|KajCYqzx_p1hc zKA3-?HkX+W-rZD)cn)B3fxz1)OklDCBS0>Puc0Yk(-ZUz;$Fbt4HkXn|FyExy)1w) zU^YFLXqJ#811?v!@5T-hR}l7+CpGw$L4EqsENy>$Y8|a|6X>&bwCy1#Hf5j(Mi(|I zX(C8#mGWXJLOmoeKK($PUsYmv!OY#+;%GGwYPE*Aeu~-DDBa<&7p1VR*X1G2DwWtZ=5=EXN`3Q`>;0=NY z$Dl%(cv2!?=h;ZP1w_G%TE6FZyAkr!PY47Rf#hvCv^gh2eCH5y%#*plKD?sSwtM0r zh!~=w#L;-2tq}#PCj~LzonHR;J6Mk#CUD}BW^Gk-QLPEnxt)jrRp0HOG<0wb#s9rv z`MzrYeSh)+Wp{apydnF3h~P%PRj}EDy>pi-Kty;f--UTzt9JTY^8FrGq?s#VAu(3< zXnmssae{r=X_Hb=4w|F=QP?K$!`{ND7=S$afXW9tbftL90kCCq|2_tLC4uR8B*YbB zx)T1$xlk~Sw9Rfa%oEa6KlR;$ThNk7fn(MV@DWZbA`^WWGTjT)qJ`Q@V#;FYoo}5xX5T!!J2QCTX}(!J$e$>fo+Zl*ygFR%JdI0k3VeLC zJ-`S|f76KWC88E2>B;MiLS~EgS1g|t`zJn)^_^t!z_YJ<(d02!s6AQNf4NwU5a5NT z1%9Ce-uJ@EKgU9#g1@|A1rx#VqX8&dONOrQH-Of~+aql3X|Sy^eXF?AY#TR&6~fOdfn7sJXJkv< z=1d^#^s3G=oNb1`rhQ3&2W$I0@8lGO7o^-?3~z_^mrPGb z!bIfoGuoFrlyd-RSesCJTa*{!m9qjmA=GXsotut(>96tP!20@skydDt%qHk|d)dro zjTc$^OkK@*dyyMVHV$d)-o2xl2uKb%FVvHR5|4ejG{J6fz?}%L6dCY!4YfP4v;z7J zG;Y>p!9%}B!+A=vyArg@`J_vXR1q-==P?z^gQa}I23c_PgF2&g>WuSMTc8Ctp3TNgY*;V|DK6GTl>5NU*F6cPWhCAf`V;&-{b%B@(YCb zENckn@zPL4{+csESw9yz9YMPDQ~q{)y3}jNRitHEOvF=o#|%##&%qlq2{W}( z`6`BJD4783lNdZ9=+ZtxEdbBin7dmgH%fm(J4z7YJfx9fv*RK)WOw4p8H(&c`7?z< zHePr-U+ikq7X)uT9g{={xyUUwjLY6&Kei1fW@G#e*tvYx1cqUzdDmm;rx1E z*Af2U5yGipfmEJIWG}YOD#F7ms!8>?!JTE54GIvNc8>ybEQiIgb`3$u&EVc^B6-n+ zRL+w(=uhIQQV3{ab-Hb$f>sc4R{!LxYEk-;FY$Hi9YNho`zN@g`RFUb>wLMJ2Brh1 z{zWr>Co9dud|hNVOp4W2aT3ETO@E@~gkB(6Lj+r5FiW~kRa`lt`xwp&Vti5BA-p1< z82?dL2wtt4|AHWK$#!v)`*x>0NB#5XfoWA~^xM2}md|Nu&&Ae=qjo?#+#v4=SzX5+ zb>@S=UWOsp1L&sKZ`?(FKtD||1GCKxGZHZAc6M5e;u}ZPKSW4NPcL38$L)qRwb?L1 zGto%h&Lf_s0hrjn;mLOHqG~mWiXgAH58fB5my(j|%-Bl5$o>}cY(~6Ga*2QPNdB$V zlbe~9NZX~a&Y3yu`fmR=DoJ2k`f7YA*X44W2@fm?cp`dYZKiC3w!A!GSoWG6?L}yu zlHLhzg27iXW#ERWfJByC5O@6H`-GM4OL*9nH=KP=SntME7l+!w@wrqNC)?hSIJjMR zU=vDdi<@TH6OYF&sdP-M8pvHI6&ibrcjy>)_pdZ2RNa3hf;}K%kHFvPi^&P|sc*|C z`)$|O)Af+IzzD-LmcJc#E+a8Uwq9L6SIeYvb!k}UJG|i$Fp`I=h>3^$DuWu6vyj4A z7Sj)XCEiaMezj!5*0tNYv?5p4WXQ}+Q{N^nqVe-_Q}UlLH-PC6Qv$r@Zp&-ioI;R_ z$gqX_J?!IFVV%h8%2NHw$IK#2LCZd`zm-3AzCm>5^r ziSVSt&p}8V>W)bPHK3tUD^P#;{rxsphT|?M;;sz6W&}v53X59k)7hX=TzB~wnV-ST z6{1k0^OmX30|d(WjsHNj#xhibrC=mxh#n|YvUNKU}dXrK_ zE;gGx6AJQRt_~=wfpfX@Aoz?5%l+vi{_0yY7^j{Bn{HjHq#W^!lzz@X2VimW*|?rP ze(j!{`CB&lMwEaiwZZK|2C&;Qn}eYd_8rj?C3d6&h*I(UUaKziw^F-`i9#`brr($- z4aKup?ql5rx9CcoCKPoyDy8EG`DSvVB`Nsv6sq;9`lbtJsW)Gl2rZ?uZP79o3>bLe z$?^{_M_Fg)hdQr$F}kBOlW|MsHTn_Rl%!aqhu*kca_83B&v?vRARX?Hj~Ixue-n*E zeFpu8SPZwIWJD}tDD9&>PVAKGP3|kxAqwftSUP5RP1;`to0RR@mTx~_IKZ^NMpMB`y+y+KvY02E z$&cUHm-KN38yQ0yA8qrcVt>CAi^R-8T5i<%_ZQ6>GD%Qv4CQE`i^)VB9~}-BJ}Fy# z!( z*so+{tFQ7X(HQpz+qSGOjh0?!p-Yd3KG8ieM^8O|g|28iPKnQV&EZ>iO-hSp$T>4w z%?^SnPbMeJo%?aMuq3#mnAN6yn9zFFBaAkPKZEg-hxhhQ-4hKDBpVe4*yUe#U;fAP z@G%5!^5_V~1YP4W>1F0CRld#cT}%w-jC96SSA;0x(v;LZu*<`JOPBrVES+S=zg*eQT=2cWo0}isyTlbg{f?^@ z8|bO}@vN&+UUb>VDNDlxHsw^6sfOjJrF!*+HrW>5H)-Wd`C0MU6oQ82QF@z+HAcA^ zPX6Ndk24mV_kPwa+oG?Fmvg_`14wkj5k+JNK`i5OaJb-AqUhWXeS zkYO1nx!r(_jjsjI*Kf>LBq^?~6NuZ4{#%WwY*dJdVHrAQV#^tKBbqcnJ+~iJ=tl=` z##BFCD5KT%b>k;;EKhKZTU676J9f6FX3YnKE7HS%wEEc%5 z-*t93Kh5aUz=6Fwta=%m(_sQjhaL&QMGCm}PIyQ|{A_7+$abI^X$Dg3f1v2rW>m8M zPk4gIoIhxMwunK#LDgsH{ff7B&55-l(dmR5(smtyA;^*`VP?beBW_pVGpgx3hI?RQm>=NT$-+ZznS)?8*@_-o*S(qHgc*7iW+F#9ZLg0=yD zR)@`uU~UuP<*~>sx|Hz;%)C8Mlv0-k<&hksFJkTwUT2qC)BH1a?*d!OE*te6NF+83zyx+s9UvJ&K8@Dq14I~f76-=Yczy3 zA-mlc;yT!hS1PIXQdNA~Fp|m-f6eC;>u_3!3_{vo6?yzLfX%r5@XGQfTJ8Y(NQ9tu zKNQ~*XTSPomxP|J>2Hwpo z=?L9Olg+X``buEnKfiyhoPYX-x%J+iRXG?$MzP?bZ%N$xd+Jxf8$sHqriVOGd!Ick zbHhaH)FnCiw`8wN6+T%cK_FSp=$OtU52}P`c}uL(-VE=5jr;Lb5Rt00%rBWcd9wawvCA@#k9smL}^J|^G2f(wtEaD zZy8@vj(J08+*oQ}VnX{L#BEvRZ6#OxI2@t=4$J<;^0lm`rM}BxnM~eBBumyd#DE?_)9U zVF~<*bWwEKDj@exx$jghGkj99NPSIwGj>h-E$`&U0suE zU0t3iaZ=VdjeNFl!$13=@l=^{i9JYe@7iH|beN~XB8!c8=l3-77x+M!3trgN^0C18 zI0sYQ(E(v`FC8DHBr}cUo(#R8(xh!XGon##CgFz{0;+u6w>}FIjr<@|@QV$eS`P%t zlPaW%>8k)budxXar!gP7;y*=BBUOs;Fop^He^A9=lQ~YX&y_NIYeI0mo7hl9LR{eO zIUbP)nx;#=&@m}%8~sZi!sYfm9Du$u-|M;PJDZ-LA?a#E--m5lBkCe}aFe5@4%lnj zL~ZdJ&BHn6Y0(lH#(pV{f2->wveUs@NgN+}fn^B7ef63mT0Cux);8G}or_N2F9&*$ za{}-}sPH$d@id7IZ_B@c9$0eZ+6g3Ma$*r630xz|4waOa4=~e>Q7ld<{hy#xqgVu~ z@!1Onok7mQ_!DF0?Ca{_yRvn0elW6VuF?~zt71v6U4<^>0GZ!4gs}P-dE4;?&Xo-x zNenIr+*NU({myRF2?JwAHcrV4JFh_szu-di8pf86zv7m4T^?}yZP}fawd8Ds+k*=P z*ISuu%Za=TUi^HTeFRL2M(t|?rZ1pBOnx5c=ROD%thx7m25`dt6xAvaU(QX_A{`3YkhHmx z4}`}YdovGI#$|Agd9d*pt^G4y;E!d&hG|Vek}wv2+dB8Cb$IM}Mt}i#Qsg<w3<7{Fe65%|>AtfZw4$=Xa-@=26WWjLHez!Y;Lz}e zR(GTz0ewY;%mJV03-JvPCzx49qvR*308bD2pjAr>L!g5@&{Xb|_~PX*#>l*y=m=yE z3d~a#)57l3&}r$8ECU-h4S*Bq$YrG)U7qiLWDzuYiRV8JwUnIP2`=GmUNjnjXk@-# z%wg5EO_)xr0TAhFtZ8LkgVgo=tCOIplcF6ju0#%?PcM6JE@1_sk0jChY|a2(BwM%f zbC7GOptR})`<-2Rxu2J93#N>mlINry0C)V(t_PnwCX*7~P!9SeV%-d>Tx3?2(^--D zS4o>t0x*=#=zdn?;MJNRQPAemuDK#PHs-&WuuDSbpnH-ueZAB(v3Gp?5k*VROCfR!deakD&sm9OrN8#yvkzdBz4Je zt8u9j#V;8+3rTr(=KY}$tOqO7SW&qILHN;Us3N{koEE*_Uj&?i7bBfCO&O0pSzctz z>-Mo+oB?E9VbV6txU|YgCxnE=S*TGWWrt6Y?P$w;;x-WB@XUjW6F%U%tsRS4P5HBm z#7o9qC4EC8{(qMluRx@@X+Na&yXALSw~N3=8ftF4*etvZizCUoVhW`YQ#Da9-g198 zyuqx`gge8#qPmEly%%1e^Zi^ckP}w-hpxH5$WE{`2^uN6-qk>-qx{}WwjlIg?5uW1 zXd|19n*Ia&3L7uHYv)H)rV4s5l3(3p3HM4E_EUEDk$Cd^Ex!0yEQ$^t@Jg~0KHq;3 z)Vsb4VOuE7pgB>Rk$j_*=8s&(YKzl`*z{J|7&4Haq~%2L#MVt2{{b@3lSrB*_6Co^3xC~vq%OAmfqOw0NpWVZPE_LI1v|XOZ zBmdv`@?SyFW8|o@{m5M*tiUF@QLnggFqmNNfXFmPqXxHzO|32bA)N33pC7iY%L~Vnw#gbk6;f1bMCQn-WeSm2Y!ikL9W>GlnHp?w zf?S9^FJaA79Z@2IU~`+m>V#SOLo*0bS@9b^rEk1_Sw?lDl`JON&vX64`lEqmTBBdA zW6TuT&%@+rWKliVobiet;~Z>Me4W`q246mIJT<#UVqqhr7i#H6_LHmG#lOK5fXiJf z^pgJWra2rOae=2goKKQRhx}y+driN23B$Evb=X>~_&*r7@Z`ic-G|ekZlSajw^>JLEgrskz$V7%E%h9PVAHv{$Gu~R)iF`9k>%`8TPk1~dJThuwwbsM>A1To zXW!MJ0@^6nMW6aBo_%!St>$Ux!J29lw|XAcr+83P{7p@Mw3lRjek-hqoa$ZS`(_N1 zbu>V)mot!EG5eNf#hBa0sAj~}A_(mLmGW(0K=o8q3z#(WfjB)-B`D~C37H|H?SyOb zOb}DQ=jr@oQZ*J4@@F{a4pcV^pkccu0fQShd-rO$tm6gNL9XcScJcOOR@lR3b;$UM z?>hD09W#s$XbCGdz-)t24{;>4gyd`cjz-DR@v29St-;Y5-G~D^ibO81rc3G?K|%#~Qvy7gGo)j-9Y6gTUno_-3QQ^Klu1^iI=JUHdsvQeQL38O z^*&;|o{DwsXkF%u#vLu$p8LZ!1f|J&onDw$QJd<{HyPmq!vDY=xxhe4=H-{ z_OER8uj1$OV~0r}la&7m1lb6szU0;A5S;zeB>|}@pDXZGjsT{texC&?faY)Nc9sjo z2@5v|u((Bl_*CqJ%U$!r#|k?qNg2I~3b_n^f#Be;!Nv$^#l?3}Gi~?hmIx+ZBP9l~ znUE*!Oz+eE2go9VoqqS@{0#leC=9BWs)6*b>%U9z-&GeM3^8C)>&X@zqXhp=(5dL>9$aMm<5C8YTFeN7;@QA`5C3vZa2-JD9XZe4kjgo)WFdCEiGzk!IwF$*nXg2s-$ zGX?8_cbMEf?W~20ZPxEZlAcXo7F9JU0O{#a%WuU$4dRb+xb@ztz$k??*4lWEd+j={ zZ+!Y*4Q1goytG~}X5{@bL_dVd2OC`cQ?a^Q!lmW+hu+dQ%hm6+@+3Ln^_4Hs3FU;~ zwx4E++wSZ@)FN2!W2{($e-P7@e(V2UMwFoM?d|J~Kn#&xn0fQ^Q3<-XGG@NUgu+tEGV zlWUTV4L{0xEes)e1fE6)$-hnrp_dCBf;bC_D9(U-)g7XPrlvS9kqb(fMOP_0_+lst zs;dH}ry>6mJ6;A9B*-HEoN(&|G`uH!>T)`BhFF&(nfklhS9_O2uva$NY0yD+=~~!AAM6h+FvU4;&;raw+#&QdFOe5CMUoJ!-7JW0af(Jd9oQdY;b_~YKkXtGY2zwbyEww0`9z`_`~B|a55d4)j{9P@(6PA9apS*Zl<)Y250v4Nw%K(66tdCBa7eqL`w8QX zGBI{rSaF*`zxJuW#0xYQ5n-D>+M7lK&s{nnG9vk`abk>_ z3<$EJcCd}jXT?yP6v0M>*>CDM@AyERj6z4ZUbb1_=LYXIZIRfS7%9^chzzcB7_@|{ zzW0-TY>^ZlCEDsu5b?Nn@RyGZcxK^fye={oaK(FWh30oJn&<5jhqaF(=dbT3>jM$d za?I0p5z^R8Qx5BF=61bVQLknoA|Q9pz}@1_4CTV+Hqc)t7;!yAZSq^+)D!e)nK7S; zcw!I3!!kS#WI#fs6Q{^-BDgaCm;Qqoy%+TbTVJny_CO$|q>7WG8Q}6MRuF@9pr)%& z52=4~U$|6GFmck1!Y*g(CuI<2$g-pE6TvxJ6~7~%WO?}eD^eYXsXVG+0exV*o6Vur z_=B+YjdtR)(mJ!Iy3srm$WiydD3o?2vFJYi-HS@-7x^`4vW4@c+r~jwC}=laYZ@!Q z5s1!(UiUJH2P!sPd4B<-q||dlxt4UHlS&f>^pzhm>2?iaSyzMR<3oJQim#)eeVLq8 zZ`jQ8+dY`L|$`S(rb`AGsv}jqGRANs2LrEm34;t7(%78gCs)zzdQ!$@Qp^66R!x%Jlbm zsu9O-ktT}^d`~@a?!VTpi@y{3{fn0^w<2Cl|Lt%fiXm(^mjieAL9vGLrpX1c(j@-wbg9 zV^9J@4yU%8Nt(jfScW<%TXejqij=DF#FVFsumhmFwVL>Z_8J}m{a;ya{hs{fR@hL~ z1@gHt0Hn$~&LAF;MZ)vd(e~>gXqJsa(a3lVV2e1@ zm*OLCM@s5Hk6MJmE%kFzpA3hpLOsu{gc6RLW~XoR4e6e4FB_jEuAa zG`}cmXv9*!wDEHFzI#W^U}AxqT+xUos>l<{*1xD{QL$xit#Zja;FIvNHP>c|Ig%_A zjfx?F71beKoL0)n1j$IszdM8b;2B@=$$cHkMfa7Dr^pTZ$Km@a<1gua`(dHnyLag= z2Rj!xr=_mV5h8$2?cv_qZup;j!otKPptR{&p1r4pS}Nd~wixfLrUC{e2Zd&XBLtw? zi9aG^a(@c?rZf3*)1so=6YRRFye=uiHgC3pj!K0{zbicz)Yl^|PV{v|L;$(18|oRc8{|Y>#XlnVdGv{n=G_dXf-(-|-sCbUgXQ*3YUH%VKD5c5 zE&Lp^0VDrgFC*QN290!1b*qM!ERngvj*Ve6a0{AiPYNY35PSq$$)5L;_s$}w%vDGn zUM?S0h_j&9k*|69C|9TzY2~C9u_#(F1Pb*@2&X;6Iu1;Wscip=>~PrYUs^#pT65I5`@i62^f>_^FQnV+%A=GkQCS;@v{6c ztg>&dy8H~H(S`i8e3ncteuHa(50(k*YWP)t2BmAAPx|}{-@b0&$sNw-3&DKir!5{ z5}WLsXm~?NdmxBr#7;T<-OuvpPLrH)90?=`w2-VWPnx-JgKspfUj_4YI2uAuW*8e~ zP=FyYlvB$`^)s?V70#GJ(^Flx>&fRVe@;eH9d~I&{=5t}VyY3cwYo!}Y z-h$+}$PHMNU&4Vf|LjXuMFxaAnGw?=$Ooz1N;k+&8NC{G3VkKCEM78*ZGr5teiMBu z;v)EqfH5KYPk~P{78cpPy4pMnE9Syg<8rr=BLc#UzF=1< zrhX0Rq}~*$c@gKEBzF;(M$|(0v*7(K$4Ar8oKGj*80}m1J0KbyWJ>ujj+Wwci5nN>}-S9mkDxW zo<7l9`kLZcE3cxrOIvTrn|EObUwv;1?a8q6z~aJYO%teDD!3N4f8%vOhe_6Ssk|h` zS^Y+qrLgGOJ1ItsZdfQ^=!;_VyuK#^nlX78iF&C$QVK%L>7Y^k&V~@37cb#FmkXOB zuY01O=RG=me*ebT1L3Zx!F)}AE%#?-=Ept{=gapx;kgz&zCAG%BkSJXIQbj@q;%gE z^AWolu{OxF0R_tEwg=azvA%!zwJVb2S<7dW0T@SWxLdm6)kj@9ZiByJ5#s4}e(AUF zYPf-%@Fy4g_|m&|b&Tn5{QrdEUHYYT6W^`L`leGrTAwid?rJaetCF|uXTx{bYgNTz z*)c%#XjhrYKxuo5>||^ye3a%=Rp(#dJFWX9BPlc8#`Z^Y{)N)mL~m(|1@G3Jq^>*# zE#e8n1=0mr2DI0-Z#t0(rS*3Z_xRUFAv?^qb0+lY{7V4@#I*DlG;eKppEdG;cXp*K zk(_5WN3>mvrkm;O1D+|$-_rFcW_J)^bq#f(Lcv47(073}mAAA)u%F*$s^f8%Kt|%k2*~rA5WZND zR2DiybQXB-u^#*SKeXN5sq(|iyGGxOgQk{cz+8C_{GN?X6tym@nM-NtI{``)#aYJ?TXH?GK__2+jw#(WC)9e17zyl-mhj+pdyv8-?zg%0tw8S zp^HhfVr1?RGI_D$edl3A*>(sa{+DK1G09I5!eJ1f7;5n#@oDr=Y*pVTA<4A6KQc(( z3+WS$DL1GfrfIZ46k+LqG4Ny>1j`&}Cl2g1(|h8Q?yg3(ZK~CkY}4jc#d^6i4yQpTd89g}^4eq+1dz(zh5i*At}#v0Hb(maU$xNXN&o=M zoDA_P7;y9R%S{8jEDnx0C_@~4%3^$P*G{*Uebb`Jh2;<2M?5oPREc_#Ose3YfkPPh zv41y&K^I?DeE2y~fP%M&`)$(Zi*DzYAJz{y_ zi^oi5|tnx$tr6TV;F*j zW!McNCzA$I4zez5uLE$!;&z3f(R9m=zs~FIyZn4cDGeeV_o;uGJ)!{xv*ubB!}md zh~i)KL*ek-`=8iy+dHVC+Efu?i%njL>g8s-gh6_54@GLN=sFb>TA-2Ama15Wz)-qV z{f57T@O$MS1s^tG`%%#4tHTs>pCJ>psKLDOhGgsR*Op#b zdvO7-2{-(s8&Hz4BkS=Q zu^&S>%-x-JUiRg(>QnuOvt`c@^QX7W7sNgiJf?VJ+Tz`DI7%vWaAk8Iw)<8LSc-vff-^Y{O^&#PF12W> z38WSS^{V$YmJ_Z=YKc@10D~24Eb`*u?@mj{>6;hpdao1 z{O0UwOJ6un3bGW2p=M!a^@?i#_O#wlBtk0a54pJ#rsD2E<@_Fo^3Wgid|teRwy4oI?`JCvtHu=WGq;-=65*KWEAoF%w{3%m{9wol zWs9x8qBuCTaKA1f%j;OqW5`-xvUbU%_-wh@VSj;t`(Zd+^x&-dSV|*+ zmpU{!B*GeEGG^x~+*zZm)~1ee81+6Q(w|4<8}4YIFbY9n_w!pJQ+DVOL11M9{0;g1 z*VOOK$1%*6cGyPfJ87CmW1>pJ;l&+hwfPNN_Nmk(2UL>p{ev;FGT}&v!P<{aT2+*R znc}>-t_@%jvPzx|BtltEARGU%t*}9 zqXB>s0$H0lf&gm~!Kz2cYmwvFAKTlF`wbDKhdFPQl_ws-TG!?eyV+w$Ydzal*>^0> z|J2Jq`Lw>K@J{&8I{N+xAt-?;az!6bM3qmDn9cK4srsq)qA50OW9@I;(Rw0kIZ1N9=Le`#C0|1+Lz5V)m!D!tlKdg>6qAbfinG-;MedDmccuBm^C7 zD81y&%*;9u!l##sMjjr5MB4iL`Bzu&Yar!`s8yEY{xHPS$jHy<;KFC*KESHn^TO_+ zhlTV`e6R$!(hGB79Xc37{F#x$6>@PTqanI)wy&l{Hei z6vF$}$(>IN=Y%jVk-Z_}Hh#RtL_}|iS9SNhQ~=r zLsF@6Gj%U^kZ^c+b%o&tbNBml`PeC|HENSG;~kq0&CD|wC%q7vb9MmQJ`E;uZzozO zZ+pTGPoKqfi+o|q>n_l1)gq86ndE8E#8($mo2qU&$3x1B1eS`+S(3%$Q#e4W07CK=#*8W@Nzve+DO_!iO|2)nG zH%sTXyOu*LZ?R;I!(6_;nJIZy8V@I2tljm>L9G5dGuT?@gZDBOAJ6*@E$o$99;7vd z2&p_5?x;lxpcuk%9BIXF4665@YH#Jl)~=Fh-ON7c$p`3U`EVSaIK~imGJHCV*8GBg zZ&pN8tk_kZ$=!#L$Ov;=X%|4a8(W~wx$@{PNS=@vGj~+x{EMTEZkWmyj4nc31=jr{ zdwX*b-jigmEA;k<+J=<$^!e+9ni`%i=J-~MJHh8mfPOU&{6MgVqi(WoKA$zdUD2=5 z;Vfb1yX8(S(TqON4;cECgXjDU!0X>=J|D#BXqd(A!B!VSA<8a@5A)(8c|Xxzz^-AU zZ8Z1vB1{M*Gr7d0F8uk>bWBF#r4v92D*VQmduF{S`U9X&!#dX(fL(ejhm*E_nD(v- zKwpUzhSQ$4tpJ7>2q2{0d^c_1w%~c`@qqx`Q0I*@+z-pV1`npFIb0F#LVnqM9q%=- zJU`Im61Po#*9hE!#t5I!B;B4QYU&qy?SY?i26z87x4(pt=e~;m5npt&IWl2?zhMu) z`~PSUgM*RtA*Cp$pE|gz({RRmN&VZuDU>f;Nc|2CmARN-qSPRiS7s@t*Kc*T8+UU& z#t?xf=)qn^yB~SEWxaBoWP^(b@0LRgQ3vahIa+_9)m$!s75Z89HELVQk(z7iJ@>a3d%ZwLJvsuRHT9e>t;!+GRKCb|kS1R&hf3V76 zuv`$D4qAlCrEb4rT!K=YccRNX(c+Cjg^yE+KbNG5xm|85RCn1t>;Vgp9*7VLp8eXW zSr9pRd=h3FT@R*wvtNCbxS9j3QQWbOw^f#~%Mj69s^*8ggMtrLaunC2At_36?7MR{ z%<*f4DB1t`>D>D7`O_@&p}x94@a%OAo#(KNI)&d4 z)MkH8kKWJq^|&)CZXS2B5XHz}y-9tEm-_mn84$z;2if{D@xEHOK%M%$g^}^6;-2!& z?-^2+pGy2wlxMFL+jrC^k0JN>@e#Yr4wo`W;JWB@i|Rh%7@Utqk84GCFoe9|@WICT z97b6@wAG8ng&V*9nXOE{z!YKv)5R8D<<|!5LA39STQj$pp2>5rVz`sx4#F#^+Y>qu z-oU&1*ZSgMSy@Ud^G(m(<0vdza6gAW+v|T|pC7eLRu4u5uUz*tPF*)gvM;Xn-P?a& z2BH1(7*Q@?w&KP8e^i}iRFq%T_GcJEVn9GTrAs=MQbIbUl^7bNrI8p!kra^bly0PJ z=x!yXLqd>LI-cYIdDeQ@`@wH6muv3(K4uI zH6~fR9hI$3>MTbwJNKAir5cgHnCDSbRr|@q2ljIJG}(!|^CS9WAhp>;QoR^1trCW~ zs3y@0V*G@V22;|pe?%x#+v;=QHaa5JF}b0Sq%c!SJzLalEtZd-U;@^h%lV;cN@ixk zmoLnZv`(K(T@n%!8o7Vh>HTo_oYwojPwR;Lp4gc8r_;ZBhAw~?Zv?y|ZrA57xo3qO z$M#`_4!s?oH)}Q9u*^Hj-^r<+OcG{4nkz1ujWkb0_ z=!P*3Erm=LkrE|4csJQ_9p;AgJSWUbaLhBtAi06vfU$=U+eW=k$z8sd!H_`Tz+mq3 zAiJ*uZ)$2@6@4D_kgWY&?(*=XlnO2`?w_~qXKzpGw1XC#!(*C;iRy0Mn%LQA);47s zb2Om?`v~bNCX*Igth;3y%DZK*m;!V`rI!&IPU#y}x3g=IVZegnhDso@wQ@$-wFnOd zRxBEAT)(Fis7zbpA!6kp<36AkM^+)zJ>Faz@wBJ-ujdj>Dix^TZN{sgbVhsHLJm^3 z-a^ROp$@xOImdzm=^4shqPVk|m&0Blp%j(rZOD`bDiWg_VmGs@n!iq4y3Ic@E2BDz zNXt~iX(ARmY-U~PvH=dkfDakFMIZTXnGNjkYPCCk&4MocCP-^zRZk(Y_tNEZZdS8x zNja?TfHnMRSPiDyRyMgL^80OP65EzPwPSBUn=JSSHYpQNX8B>h{E2M6kzUJlf$%59 zMB_eoDOQX*7Xzf`^h5*eeq89eDU8I0WuwxvwEJpn&Rc}{2gP6!*&`m6xQwiaU5NWr1WdFjmf-^u z3&<8=!aCw_f`Osc8-!F7Kk_Hh_^(xZrenNJ!iWQ4aPp^0O40%_O=Suc#y2tdG5+Zy z7lr-;yZ|GOvU@Wy`5VKU;{gK`lLC{wza|AhlJq-xOGooq+t*AO9}$788eMR9&%+*4 zPbte7Ugo&!U#bE}=+9cd(U(N#@8!-gmVLx=)PJ?qiDOHf_Kw8p4)c1RK0&#ye;RAy z5Ck-S6Pys*u)ss?e>Yo(WPG-7DQ4GOj-BH18Z^G_y*qW4?XC#q1RcPdb>-sg@uf!L zbYs%D?@7fTa^q<0D8_;)5fy(H_&OJY%E0RliKc>lA;3oqaaG#or`tm+?8i+qj_;%!rIjPii<9(YZ-8BNCMMWCYV5Ok7vt#b1cyFpz!=AmTxB3Q;7Z*3b0%@ zrasRmA*6i_`uB_zd65$zt6vk1bN@1#br!2-8V$FI{<&j-9Kfc+OSb&t^+M48BUpp` zO+e(HD<4-*C?YhG_49XS+O)`}QjzDXb>|h=I;Q*+8O+Lvg=p65&q)7`1&&x3mLJ!n z=}Xd2&f78ZR!XT*)lb8ocEDFqkWFVx$k6MyCecWOzhQT3bz7z|fwGT}YEFrTkyW?L z;Guu{`&0ZOBZI?@Brmcx_a$LDR)i0ISy>soaq@L*kte7n{%agN2>k#1L2i1Tu7htr z3Zeia?o0cVfZLYo<%S5}cwOGR)?9SKS6<(6J(GcbF~n*II($R?9IW|84rwAz%=PsV z{Cc(kNq$F5%%+3-ct!%MM$+T&*chCj3@xatWV`7#`nvV&jvR#>LxWonp0;??YCMbW zkGd;zvW~=Jn7vw{x{+v#ODpiK zKYb4r_qO0)(A@@RA2eHi9{K26a%skrVQ%Q8ioCVSCmK(K4$s(1KKQ)fJE)Wq2jabW zk$0;{xNc{DQdw95Z!**#xyMxq*}i_`bhS6v&_?;!mRtwuhdeF+AT3W0T4Mi+!;1(0 zB7V0gnd)AD%PT6T-Y%Vhw(7sS`Z&HqQ1WzPfm-5fZcMjrbEU%}f2DTDSowJrZSCc? zj$B4{gC$I>lswe3ijVWvkfnXs1hlW)1?0sK&j@0aR7E(OLUK2LC6oNU4M*V39e2t#wGE_kDVkRT0-FU+Bx7(arBnP ztZ`~e77MneH+tt%VvweRL#IlBl*t~f&*#N!nqPvY= zy1PBos+r6CH$e$~zrgD8`v>#Q@@V=K0q?O=(^uD%B;DyCW4T=yT^Jeu7ZQw^H(v?U zs0vMLsrUZ)Cu*Fhv#+|;WRZKIe`3qqbY6e|ke!IOrGhtuY^U2g zO1H%?Pip(RT{ly_)?2evQck}>qJyj6-~I+Kfdlw068Bq9)Ibk?&~~-`FWL(QBN*SA zD%cq^x#j;4y!H@&nqKYg;$xePrm~ShaP(A7ZMOSUE7^jL3m{t zc(V$kjiS&cspc4hc+|KZqZEV~zlJ zQQgHS=T87wyX7HSAK#fxw4yPU{W~rVo1x5D4}pQK#cij-KS^qhB$0Cir0Ie3W2;6} zN_9tp7~ZZ8+xfaBgcCN{`SXcGET%bxCxNC zh})e6DgVRp0ebeYcao+z$SPd}^DQnU4rOkmfG`ty2XH?Fe9~;JLN_lM6q>gfmi;9h zD;S`SXxz0`#@-f}K&n=puoVwMMn64l*q*pcRG?q{oefQ^eP6T#sl~Pbwpslyyfz8D zjpy)=rc;&zFcz%mJ5kq4`_QzVK1BbEH9te3v`<0x>U13eSYelQVYE}_vCq}P&GdUO zBR%SN6?H*kneA{pX$=k=f^R+$aGXC02!z^)k3&dTf~g#{{<|G(EBsV1Q`8D%2qe$x z36q6D9n>YPKSR=O1mjFYpA=dg1XSGAeD%T&a|6QZH=P@%zd?p$KDXYS`?m)alFqwozBgyXZlzJTZX%5?q%G{UZ8$TP)3q=?X=M6uKp z>($%OfBZ1U(rx;q2Nb>lBe6bb9tP=a6|6DmkS~k&^qc}+lM>za3f9g) z8e5I^*yQca)y{vhVjwW804OWoask~h0|(Zo+44JuYy<%ZFv?yv5q^*EKY^KX2j0p!pp|bqauY^$SDq*(& z;!(LLakxYC_biE;9-|?4h2RJQj89&tg{7d`$MK^T#PVcylJUs93FSDtk zjPi%QG$o6YJuan@9nJ^W7uM8y%_aeU#bayc$4yQhkcU^UEQgp4R1Cl&}W8+WKrk@F~N^du}Cvsn%vU4|pC6julLRek4d4e_t z$Fi_1W@UptbF6*udPs0a^Uc$>8>*N#dND^{F@k$B5yv}U;7#^X20PJw0s;}($s_M$ z(A|#wOAL?#=rw;KYA~`*VFq=e`bPDYj6zN)Ap3tV{~Yd+>>TI`e}jV!f;l@Ye&bvh zL=jKy#mFK||GM!Po(V0g>v{5b(N*{Ar)I=C6PwFd@iAMpC?ZVWLYGJ7PhkyN5*k}~ zAZ{%g-IM%XrJM}}_b^|iHT2(g_VVS+9MATv#XlEg0g|iVo7>vd{tZDxYy=eje{!1G z`tCJ0ius(@WS04kbOd45-(LN&tN4=pJnE(2ZSgxr>m8;n5-kJUcO1e!3$Z-nAV>H| z*A=gEd>85=D-9sVqHIz+`X;A}`nd_(DWr>Zw`OscvA8bJ$hRfPAhk_}o|? z4D&gLkg#5XkB<=B?U24&|WLK5f^() zPbV>P+!{RH%TVS2I7*=)ee#s7{yVZZ! zW=-w1Z`YI;Rbje=D|yb<^q`*Cc!H!(OzV|zIw%0QrTlJKUuEvr->x0l0>MGgC_w+* zQ}~Rrx&jR*N>3kfC{!mo_VCPM-WXunk(TfkQsE>_`*VejyH^$&85oD+SzFcj?2MM; z#A+9^hfasdTMH`A2hdBQ_8RkuUoT0#NmbY3WL)k5@=$>VLhqAG@+==g(1O75UaKXqudjxWB#H8qj4tNz=1heBl-g>UA+^DFI7J?yvRA{Cuk5gcx&` zU4C-hFFFUEfvj^7D*W3wn9h7}vx@P7R~}+5@?MKfoAJj{L@O9ysB$lRF8jId&GP*V z3fKlZ(I4P?Pc}ZSPMiSmfD!n-QCO0w*+y`a7qI=XNNT$naT>jt(j%+8wJyeVNrA*D z60ngva^G<|asPxGTF4Q%wV?_EKo436{Tc@6eo}`G6AfeN43L+SpIaXEw`PErncZWj zK;fs-v-AoOAB)i&Fd#TwUkJ*UA{m>%^@QJiIfVpw8&4jFuItZ<^I>NQTdM7H>TMIV zQDkDk8t##{6$k3o2?YYC9#fXl7~kNA>Es85jMV46h$@3A;B@J(Y~P|`tyabH6BYm2 zbuxqnCib^(XBb+MF{SgYq%+uxi3iu`_1kR+84c%c`)7>%G)g|sK;PuZy#t16H9*7 zAGc7X*(sbIPnM4GedgzvVNAwUid!(BUsrj3gV|6AH70bpaAm-Ks`O(Hfwk(qRCs!uf1&cytl?=a~e~|12vECL^jib5Z`Xn}&b?N|4A%mJ+Ney96`P z_KHtX!*8^O4iH>_I(^iR23W~pTmah`e-Z;O65XzT*H3}-vj_k{LGsb|---YUKXATg zgDG_Gc9cHn>}6)r2JX}YVTbDlQCPz)=HVw>aEfVN_!ecEmE;LI_l;CrqPRDyYR+j< zH$L?D1|6<%@8|4%V++emO&%new1gQ3DJpRitb`AE*Tl7iGD!v7(WdPWg8J_4ThPc0UW?*b zK&~o-CIY|vD6d1Q$x-(LXi;mFtoRjtoC={58TRTii?7O2t!fF&*?-3{!2YQXZ^J}L z9-m1wd%{~igD~`M%~rM{!9 z*{?{Nn@Lr@)4HR@IcczNN)r%{C{#?j7|)t(k_h{v7InLOrp_K!^6cNUc>tcx^p;q+ zJ3m-v1V7x#JDFjbVGeTB1uW4EV{zm1C1*TR|0Cb%LsyktH!!WLx$a}9$ z_R0ssIU8EqXt@eikp&=LdO)E zw^&|<)_RxC&s1v|m=09gT8%-1Ep)5pU2RRzu9O_EPjx!FH zfMKSr-4*CwCuGwlEFImg4R7A|546q#NMiM=82anQ-GDci_QV^q)i208sOIx6E-zYW zb|pXw^KjBfgimAHUiP29L0mDRC@mnAB@WVCgC6WX{@LOvs~J}`b|%^x4~#GgrurQP)x-Ot!X((exLV|gBKx#i5U`F4JO>!0GS_=_BsbJeTs@=zMz zSJIcsF8_s$0h$4GF563P8bUe3-(UYgtuR#jWa+{!lH48wr#ipjdqtZtbOk2%eb-jk zW5_7#ESxoxmK+5FnCm;z^_HFAgZ%|Pr6{|TVYTGc>s%Ei%Kf8`Jqn zP9$!8uo&86+A*oh36oIEDc_;NQ9i@eksN)vMdZK-66XN5 zNWy=LcD*}nRz1*}7H6=@46A&-y0#B1)jgzChbBoX6Bvgtivr^I-y9it{(S)u__j`S zEBJ|e*CG`S!N#8Jgaa-k6%)ITO>yN5BFeI|JU+jSeO9&3DDNCVB}TX6qeU{EjjatU z>BU0;KJFk8I=)?((t+iFm{;o)`j}XQB9KA5@m|DIt3JRnPI`5KtoqNr??uXUopKbI zG4<$fx_B$qdvH+ew__cT>Cq)wf4;fIbfyqT_8g<+3Y{?MR+yX@c|qOmdqz)dZ0;Tz zTf{h+)W!do+qd_Hv6PmblsJ#&5rpLhFY*f<(fZjGN&P+i4G?J3q9>~8wA(Wk7@;F9 zp53@-17Fn4w3Y0AWAl?=+Qid<$5neDdP3QN@v4j4XU%?Khv**k}jjMOPI3U z74z(a;{6<_@ie?3yJ+sykm>$y1qpDTG^d50oRlxf@U)*o{BEDHZV&p^{MjU<7P5#Az%?A^ACz+D5+@t?$ATb_@?gZi6bNgZus>S5|>v$Ev#6KpnUdHvx4)HD%jk5#= zhO}V8?XeD2J3=u*qv(L$JV8QW3OipBr}_a7q!UB>tCt-0j+7eIeeYM_5@x$0AgtL8 zgN3M+>l;%>JtLDC@AH%&IL`bZtwAC@j68$Na7=j)lAtI}_4x>`yU;j}O2gprgN~M) z*0tnFUIF`VzCDmhH$Yah>a#gvZbI_tPsXwKQhYR3 zKZd$bQk%fA#h62ILok*NF3Wt@l-^7&kXjpj5R&KmPid_;uRb&GRMF`}d;>ylQeJUE*IK zdeWSVCqMVjC7ign;55z6GKcKWR&2K#%VAa)V$=3jecOD>lId$&rcBiusOj66luXh0 ze)ho&c(RVcDx0!LmJrVx zc**)@&|WeTaD5Ko?xf`6MaKTSpe@=O1N>nAqy#1cIWZQG%w#&)fiBrDRb2O|oH?_E zVK%dVswl5 zEJ}62?yjaZVtphB_lKn_G0>$a+Uw&P_~WtXB-^}Zv$>3gSVD3_s+QbEE9s-buP!s> zwx-HD#T-kee*J1x>$?u-8AQ#57s0QM@!+%0?sEz(Ob@W0mi!$F;^!U=9A3yC3N34( z4Y0yyPyW`#SW}}F+-eGsV&uOW=9m?BIge{he$&NPCF)!fk;sA^go2A>m zx(I!K1$w7O(cHhU!CRg1gGXQ%vaWy^6rrsH^)&Tin1D?G#!b5^Hic}VxQD2~(@cr9 z;Uu8#PCY_<$$*#rBXg|OZTmCLWuQldW=-8h$Fr(mPm+|}KQX2RhcR+X7cG6IMUl?~ zdGCZKcti=U$>ejBQgd<(i!C|Ig<61MrG#LZcqs-v6K8tnD5017xLn{e*}S@>x-COf zdBk*ICEWqAe86W>2DK0A`qnm3gZ|Z4z#Wvq{B;2cNP&zE1S6tV8X?L0zSP2Amv_O?|%xtiH0Tvg=c*}6Alcp`@qR?;#IKZ)s z`?{HnIV;9sWf+oCZ3#)`1Fj>huxHxS{61_Fmfs*&T6a6)lH&fLBz(0*M$Ut0meWCR z#XtP`;1tOFty^^k^ZpA+B=U3Cuc{gxLkT-sGysjq!R{Lg9Q_ToE5oV;(BdF@SN7DG zmOU0FF*bQ_K7O|L0EbKLFesfW_z$qP`%sQbY?VXmqdrwvZw}|0=q8`iOM(?)$y8c# zq=2JYUM+7dl!{#L=YpgJQXL3C3%@)vgd`^NhCIf`ljAoIAC-69GmNr&qhWi08cn%# z5^NJQRn`?1t48FoSA7|W|8fzMeDYRYo=I6u)~tA66k`kHzpr63zjmYfoElldIH;G6 zdoLR0F{ob4SHQ038eHTx@f3Tzi`f>k1r8>oimybEuV)$mu}~3;ogd}qo^mDl#XL<^ z7!1E4!nWCrtZk+Eq4c+s{^=H!OU(bf0bUOHaVfJH6d4HJ!14sD2oGLY9{#%r9kecn*l^eYWaRiKjc*7&r!z` zh_(_DqLGVdFs{D?|6EcH8g^)w+o_yjQx)l+$!nmjtz5<-hTF2i+q4 zYdm=UW0ATT*Ic5@$6z(^h@^_k8&PhSSdyqShsk-8pnC!T;lnPFd|!`Xg-9^7x_iMQ zTtt=mg{^nzw}3Qn#ZFIKAqL9Gw^#25bpK2hz6fM;O7cPefG`Jzv5`j5!9?dElFep2 z(7gssFqQqAQF81@_kj!B9jdo?`1Z#B`XWR)btU($2_t{zFWnBn4mwGj3g9MgEPm{z ziHZJ=BJJUeHa~vO!i_VRF)b2jzK`Dpz-9{hO>i>0o7{}iK8$OOOeeBoO4$mINNC<% zgy{NyQCv zLtBMkYz#K_dd1)&=Bx!0kmVQm-#_{l>x~{EVSjV3O*CN}HkDtRT7%;LAtJSNogo=$ z&-4d!h!Gb+nLfR$`m*^$DjX*GXT(x6nYj&1wvA4>ng`f%_Rgwzyhb6kG05QH_xs{0 zm$LnmCBs`eVIv(kxC2|Yc*_&orymuiWdgav7#J889w82hz+9bUX$6S4Vx+VLF$+(P51ZxZw@okUJHF` ztX8UxEJT3l0&IZju6ydvkbxYO5s3-XxIpI3ebvz#&Xu-$r1psHLkl^ILn`(wu1IP% zrDc!OhW9wu^E$p7t4L|IrffFZ-FF@aUGHlgM3!B1dCqJqEngG>!2Dnu`K4im0RB5X zH+D)?=_;cgWH;G@zsPN_YPVbaC=$qA*Ozg*`n<9fxbsgYV6$NPCI-rN2>E1wA%OzW zuI{bRHA+(o($;%W`-fu+OdRLu?1Sr%H$MwDJ*bOer>8_a`dvW=Zb4mkkh7V*l)Ac~z@fBQd5uGKMbPO)Ife(9kpz@x{K@mWM?;;#g-J z4UGvwoC^9i5|}6;Zy69A}v#LFOlWDr{!8NA+kJYtU2AsBe zKkOd~+jr#M3c?Y8=+llihWfwMivvI10-3m@3T>`b$lUE-$w|{R8N7oWxXJ@`MK%K+(F7VrYz9U z_&XCZWf6=z+=xswJ8ugdHKU0mL(f-OsD#-fpb=bmm%{CaHvysDe~lShNVk z0a7D?11?(nq3u_GJ0k}xO#ig>s?xPspqSz(rZ!Ony&ZEF$WLcSlND}cob_54&F`tT zK)p!7z<=ct&9IF}`N9OX!;;GoxDtO2kyZ%CBC6iqmB zM?RYnhSl7A9fR4A2EY?z87;jT+S&~x&ufwmZF2PCKG?b8==vtIglT!SnxKdiAEQ~t zS%&Tw#<1F{9j?aX)V_S|quzAOFQ#G+K=;@-%b!DpZ+&HDIYqnIiYR``2+v!J%FlT9 zuFWi14C(iB(bFTuH9YMiL#=|E7>ngw{Z;swXP(gnS>JU&@Vj*2$@@2lOv)H9k6pL| z!F_*Wu{scQ5L*7EBuqZ71l?_k7R5nfCwZuwj>%ijZr}~MB9B|aLttUse5D#Xf0Ca|l+A~jYeFu`_%0>+`bZjLjXEqQ!9mLYJVLPEMcDuertl4rx zf0wKT?IsO<y^zAiuCrN7qJfoaq@{?To5U|H9_zm#i;B|H{K0+>~XU{2ZmG|YknVK>5Ypf6=$wf+%alizDE?C_mPw6=#A9qe0q(5TQS>%`=6~;ywvM%acr%&OG zaUStIH8ZY-Un&U%EapDl_?|~ad-yYel0G`%FK07*<0pncYu1SgP-lFL~g+I^l|I9b{jzE3BCP5CBbf4^*V zoBE~j9sTAA-Q(VxA}roS>Ek}g=|~7W4{Y`+T9dUDc~-3b&@*E`dipHG!e(?qy($WgKCsXO zBRQ!BmQC5~77pet68K6DC(SPcGt2TJtOr!d1RdrPSz&yYj#|Bea(Ww^(7hdlCt< zF=nM7EpZ>8-``b%Kk)(LGMrQrFMt0LxeLfu=S&~DTi%9mHz|9Lx3~V@`LamW%8$fA zCo^c(x3D&SoOCb+Bd1y^KH$-^r^;F6QoE65F?y7UJasD5WsN(r#lLqSl@OWB5mJy` z+SOSIXiZ!|C_7KBKH+?wOL(glFIxPceY+UWpatp&QUa~jI^+Ny3N`YR&nC?oH=fx{OjI3fVt=a{@hp#VkRL0@Mk zc8PBOFH`;L%)JwV#O&j!r90wFle@L~A2WV;-9*1r9H!d6d!|a4840}pLiYQ5Nj({! z;2PT{e0z=_252sAvaVEbT z@|ctQ*ua{)u-nw@dI-V4S19Rq`(p9j0Da<+Xa0cS3Q`f(Lbor_R*E@zFXFo)1xnV3 z!X{3C^kqU~2w9uX^3(3)Vw`FXYKFC9AxWmJ(1x&RN74H+^;nhtR>N2-RO$vnBD&qn z2ie5Rf1aD%KJ@#&DllB{-8x^eZmmmv*GqvK*dm!(dnh}y+(KCaEG}U3FX`KMckUEL z)qXl3WmGBYZ;Y}t>w@&2umPm#vHwKY`<=GVxe~x*s19b2xm|cb0Rr|={C|1WLa^}= zRN5kw@IvaO2ae!Jy<)I_A#Fj6%3xvkgGvzym--=@kr73yabvUF1QGdB4ewK$9{%`E zko5Ia4sA?%NXDR!%XHE8q0Tce&!TTQmuc720*kKLcE|m!V zx1r{fN&qXlL7uYC0ZkwspEv zFVmucGW%Kt3AQfWRU4*;Xqr+szqF4vvp=^WGvEGoZyhi5I42j;)stcNfa^M!0g2C@ zKy8b9W33*ErFDv!ws~sIR~i_(Ng^d)t5R{@+CJA*U*2xddb2qu9)CNabHx@0GWCjn zcAtq=+ogPG0N~dKXj(i?1ok0i7M8Oq9s=t69n+4=5Bw#|^_ijBIZITNJhLW-%Fb2L zY(pJGbq%jh!uZc1Vd*d7wjYL1WNV&|$TQL4aDeE_Qa*dFEBuv0$2=+xv01ggM&UI# zUUvEf@abS-R({H^yEr-R{r(#svJv)TzRz+gabTCr3bNj6E=fHeWqxWziBt4i$8{DQ zCF@WwK*SP-&6Y!3Cg`+%-Zbs;#+;fNfBwv5v~f`S*drc?Ne}Saoz;^W3Zr_}k#FyVNd``=*@z^p^t0HAy=SHkQX6Gqvi6%_q+)vHS(^5_^ z%T(v_JX9w_t!l?g@ISJ*XG!{?^dX~bj~q3pC>_Nh0TZ3K3*|puV#>meRwa8F#_(E% zD)g@@fCGICzpcQcRot^&z8>(tjK4cy{&zo2&IfF=yU}9WRY;;f%8kpsOdu}fzgxbh zM0xRK+xu(&t@tXry!`e}jQpL&-8IwAn3N~U$k$ZCdB=&lc=)Bs?e#&Oe|vGiUbsB? z77+Tq-!|3274ur8pE=9ioJ#h6Bo^<)rX>5@Y2Q9$;b=cc19S33T!-=GKDYsg_L8-*)=%1dzWeQQq^b7U2J(RWL|d z3SFQZ|D(`$c@`DM9N7N1-}{m*;2QFlRP#1Dq@ot|c=Jv1>HuZ*nIHKm^XNeQUu__k zc#tzAbyi)LNhg*XcaUI|%1=)N6ZNLW3Ywk$_b39rzuGU`2{OEvjkD=I!>ZDvv4&Hw zJkDG$3dJ1QtPhKLZuy>RuD$-z>t!hQ|FtRI1_O{&cIYEEdH~1RdBYr!I}Xtu&}@39 zC*GH-GqBAD-gsfSA+7%Ea>+Z%?|w5051K6#kjSZm1X!>A&sI1F0acaMME4|=K+P;vCWC%;S)rk_AOH(ln7c4pl&6LtboE3o*J z-WLmBDWH3)a2;`#rBqdHv+~$UK$?XzVO7Yg=Hc0rv<96{sT|9DeBu?KqO05DWnim& zWM?>ZyEt=E!ujl{B*GrSd6IMKN9hC~-MB|I&af@~Ob?S+nTzUI@V0yaLdYQWcodxY zLH|OFJ|lH~AmO-E5l5w9&D!Z5dEA&y7!7z^h*kPN^dcO2HR%xiM!^8MTb|D^3bk74 zc-@50tJTe>g60DhEnv}koB0DaYohhw%WUG~D$l$Rq6 zHjDqiFZ3&H8y)FPt7^446hpM;t2#_xbI2AwH1fl1VwTzo7t@-)k!64_Fnev{Zc+^H zW1-eiU<(ngS)6y2#HPDleBk=Al3E;Jmd`!vQTWAx=>{ z^4XSNcgsBIuq^JqLQdyp?$^#GY?axQfeL7kUjceM+7AuB0vrv#Y{G^<8gM~I0_>H& zYY0{@8$T_-`Gut1rKZg(4sDsq=~V);=~2%2J^~$LogV}aH|6{ z-FNUWb43;vGA~BRCOI=)qG{~>tL60e)6MTjQzQ5ZRv0Kyl~x`@nq-RW;27%u)5;nH zZDBleZT_yXuzvH@zH~B4BpNDi3vS24p(Okn+}&LJ=$BtecUV39{=RuhELHTYO%8uw zgo-d+Q@gR2Gn5NK{C7|st(P4qW%esnS``sHO zm=fmZ*(9o$fBC^B@5C37sf6}UQl)LxP9>@=rTnwd8+Sa!=p;$z^EAV>6dRiYGP%r9 zfu7=6(L@@Sr&88}3X~}OP7!aew0B%DDD!a+e-HH}$zovaZ*z*sdV|^z^Uwends}b} zvfo$?>L7C6mI?y--OXi7llwi-==g1)ci^04gh?{Yalfj3$`Ldc9BJ)qqIGZz24hDb zMmzI=A%falq2`t6RuF;BT?KCKf)1+Q_W&)uE^77m&hFY4MhR!p2ti){K82YEKqRvRX2FY)vr2H>$+r=yYGGKKT5};ho>+YP#&#Ioazo zCtv)VpY1+`im={6t(>gk0`wrq+JQMh^!qchM!0UCDCQNu4AMSHir=P%i=VKg-YS3qq}A6Zevo zS~eqsp@#1PoV$nI-12JcFC2J|K9ogNA3{ibSeq!**ef3f!r?SwHjq?~iaE%xcK^mG zaq%T;Sq66A#He_>Erdn3eRmT~W#gXvJbfQo#0@ts4$}tukQN??B1{wxLZSW}+V?|x^9GqhHtjvRqh92xt1cqeuHJ<{W-*Z2-q7-bvKnp)D#TVk1Tx3r zShx?qrG0ueKHji;t<4|pN1i^DtynWnf~pR__?A=O8kS{a(k%mdFr7)qo|tbbgw@ER z5g^o;B5b-=CV4$$kemMM9bo@H%dzkZL6g|I1>~>d5Kh@T>7ekpT>An#v@Lw`NUN)P z+1OJwnZ0jsp6_7q2zXQnvcr=6+HfR3wj@Ni@qRiAzw(%2@nlmPFe++|Qw+l?qMG8-!1tg%DBQgVkB`)9sH;=vf!@$~wCHhS!M#bC6jnom$%Er&6dIxV_$!PFBRE0IzJR{g&E?#)4 zor%x;{NI>INoI?c^Ifq`O1}O+6V#|0)MXIe${53rYhtRD-Y=`01+fW4e8^4^aIGY~HN%|E%rlAy*K@?4WiC+%ghU;ZQ|xtUhBS=WPV*2;_P}Dz5 z$1%_$ZvNE_g{cngzyg!_>bS-ou(Y~gJ|G-PiF-48qV$t;tdKh_+eEVApBxwqXjaG`(3IlXa5PaCM zg$0;%KAs%9;Br@8wG@K*9+AD%`26KcJK1|gA$yZ~kS!xw zWtB}C+530-e1Cs|$GP11b-%~!^?aREbM^=Ck22@=V1*h7yi419%MehLXIoUEo&!oi zo~YfKy^(%znm*nZihrCgK;^a)EDCoRM8vzXlTSK`UMh9YR8mauKPhkV#0PT|zEIqx zK=HP@_;v~!xBf`|5MDSw1wwsworiz`*@0MEX`^qkV)zmSy%L?7tAX26ue|RvzdL(! zajSyA2C`O%!0mE*I5l%#k*nqHM{4J*^8rM>dggsC$IsxW6C}#bX1is3^=XxZOwG|@ zZ{R$oM$whLQzBzeq;ymF-^($3n;2DaMpyn&uK%G2z*d#9*j0A0wu(Ds^QdYFhYGcP zYcaV=B?5VBZ+QLLm!t=nFyh(p%to4C;I0`BQP&TI&btLA;K9&qod0ZkV?omQ-1Y&c z^wCL)kD|6#A5xMtwpUo%h|%$m(pC{Gf)d^Tjr{ascrVf)nK&P0=P<}Lfrr%6XDGk3 zC)3@=*3Fa`Z2?g%d=YK0unj1j>zIfoPD)NaftOo*z5Eqt-ta1JoQ*$JPh+5*@ubo? zgXxiljr7fR3A0>)0Ucx!uyVGGQh3oaS;cOKiHRA5-Q@k;>tuivnY3;(#%XcgIR75g zEmjO=2>`r(M#E$$K`w)v%(5`bM|n~IAPa;6&wcTuQ`!%4)GOZqvlD{$mH_3B^71pH z(>xb(50Unjm(NXqcn-q&!VVV2!mc}>YPQ8i67Vo`lWsu`-*ysBdv{5o0uBUIhZVQe z3u(W~GJ>zC0H=8d?lOOnlA)1NZ>l#1KC^1$9QCJA%O9>fYE~BD|&oy#z;<4ca#TwoBHxBDHD+49(_46G;DiV^_No5!G(VTMo0}!h}z6WV##iD}IYcS&i1~Js^UO<2( zpoF!<{&kKj3;?sa&I*TdF}9QDJcNsV)V-W_>B#4tzWS1%s6%Mz{y}GqDA<$DeevFv zTw3PP*K|W5=MRRqyx!Ugco%N}W=${AqYBFd^R`QU3Oo{cTES`QeL^GzC`N6A{IW3* z&1@hf@e9&gE0cC^hQ0oZw5(AK9s$U}&OzABGvW~WbukB4Xl$YbxSBsDHQ>4qe1VAw zzz>2)0!{;giMGzglF zG>ruaDJmxW5UcSt^cO9itgkg}qsIb6>tj=nws$HxYy8@`zdQro5P#aR_1E9*;}8`h z#L^M9H-sO@MiagV!ayFwPJd}~MCP7wD=8RnQfP+ZEs4SxqC!RkH5mfy)xz+Q0E;e# zx1_|BH^hH0NgsbS5O(TN^)FXut(Vo< z9LOC?jM0IXJxDY&s8%vo&xc!5eF)K#Bv`5iMO=KHp+TPgLQN!Q9m~T5L9EO^G&YMX zU!`!n?it7F2j%8$u#nn*biN(>->i|akC*1M8{G`Y7X4&xLSw*pO4d?PwWD5q^^^FGQW=5t(JXMq-FzU^rdu?Z520loYX^EWT~P z=h2Rn_5`W&Ib4b1F&^+%8PcKyZfrEfPxT+J=0*-%gz54PW4n#Lkfd0L{^_N?!Y><| zW(T_*252^r8AipypkUU5yG@O577yk=;<~&BlBO~#V>n+NcxJc>R-5zx_t>UBsDyqk zRsWEF{Qc1nDU1w?MA?KqPg-SGHsuUDk?cqsFl48MxlZ<0oZlBJd`|x_812fyt^zb< z`z#S<>=O^DD@o4zbsSuphsUr)jgXoG3(1qiKa#{+7~W6ATv9S$q47k zF(>Guyw^(z2-s7X>P~XWb}*5PAhsII>M>Ew9qn3L=EV#o5mBGVCnoupHx?FBq3f|LsN<7T5MgkWP0wQR zuVeXJ5`(QkyL0C2po)diOGB1mbZcui#^Dx>;qg;_DaDh^O{O{6A2jpqT(EYp%A-9h z(()Iwd=G89iJzyiPVJ}m9*&SQXyd!Rh{@p|}j%UV>ST~_@={l1#iT3j)# zBDcV~;M0GbzSAx(gQ`KohdiX65aZors@k$GFdD>iV28GO86S@T`$GuS*X5J+x=!OZ z&TWxke-d-F?hf7QbHUj#ODpi|lzB7=pH+~|^wNxe7pfhNV~B%bPa1&Dgg`Hc5!4`N zb7SRd$@PI&IEy!=+nY~?7QKjdwx0V#xX7N|1zrVWI~H%cB)*vhoM4K%nWZmW4RjPG zDsF#zn+hU}dD85ti%fR_z0&|^<8aG}p@(O_nZ9MsQth?RDnIx8*=V2BORebFUgywF zyZ^2lt*1ZmiV;f6vqU7Z5i>)mZlYvL0D)!ID%Nx3ASMxwRZU-$Z1A~ zl^n+u|KNo#Xp~=$e z@W!a1es4?%OBQ}4#9X~;g68{(Pn)|snL}E}@hy-IR`D-HT7}}Ix6Rdxc&z`r?R?4i z^;gab%3yshZO*u!wO~h_jek6-A$sWFf;05w-@yrp@y_9fk19*`|!rE`5Bm|+u)Dz@1$0E?y;^nT(?L>Y(9`-a5gc&|y|aJUH|R3o8fL9^3obk#3OF)5Ut?U~>>YYD{yux++w_+G zAB^wC9(6QoR1b!xl1%H)p3tfRbs<2eMOr24**9N7fiXUs-Fq{o9-38-S?AAA!fX}8 zoQL<}F_qn9S7xBL{zVXUN*08Q8CEA51bX8$s(I+cp@vf6NY`vaG?{{O-f(#UVd zS>rn!)`1S!7O~R;{A>OnY5Eov)c3XQDCD?$BppO&P3r>nwj3Fn)Jwj-_E|2#^*V#m zBPGQT(dg6kBG%z=Y{{6u|69fmTFk4F%ADQhyDsGW-~VFUwKVV^4X*5iD29w%c|xa3 zoG?m#)m9N;8BsmNV~c)f5BCoyxZ;Om&f(x5%ZT({DmOTbEq)shrz}8nX2NIQNy_Ek zRU+al3cEK|=gWgqe)ZA|I&gQ<`|w%*f|KXEz~8_lG}ep-DP9i)hlmLQvi{XGb@8uU zV7Urnmj8&NR5@9&!@o`COyeaHTM`1;KiPBli$bu@yCTGi&PHS`)=U?3-aYv8vBi2r z1J*;Rb8!cOhBl>QFW6i+V0(lBB@}v|uTC$el{YceWlDkb=H) zd7aPm8mxgOwiZclR9~tEVR|0E+Pt~EURbo~XTTS(YYS@%#zWRJ@Z-90W^6+J!K6zJ zTcd#z9rsLF1ZDTSX=F3+AEX}3Zi>v)K}PzaWrwa3s15Y~O+Y+MA*G4>& zoq}JwV#`E^K&~=PzU_yCrsN=cnBIPlqM&&`7Up*%OX@lHyIoS#7?kL3BY>l58%-io zf*bIJFw>APJQj=Zmr8jmM&I4Q24*Va7Ayzl7BGM2IDLorLu3wtcb)y2^SN=h6kBCqL>JbEAdrG~lTpyQbtv>a z=z&ErHoL8s_*YWg*6KsVQf$ttXobhTg&Pms67iTR%>ZuJ-&9}novRjBVhK9KcSBnd zqW*G$o!^_V!YyGHRJJVthQ2TnSH4(n*Cj7xwQ)-~**dI)5sF)sD}#|kQQVrJ-@pUj z*-}KsFH!+TXVo9)CoxoLTjJ-|%y?791c)UR>dE^pWmb}iDJlEY8B!1HMw20T zU8d03CGnHY^^fBbHYa5Z*pwg5Dj%nrz&uT#c;Q(F|Fw^(F*}QOggb%jgdA_Fiz)9u z_#Pk=+vW9LhMzjgkAu9c`1XN*m%vD?iuRUf0~2*+??SdhuXbT?*m+;#3(GJ&!QjVD zbm#9-;`QI@-8vMc#fevkgigYX7r?jR*TKLf5l~4V+6f3{E0@JsDF1e@l_LDFTsHu^ z56fTd(~QE7s*PixqAEll>OTizaf4@Py{>EuGRkisHK&x>&ekI#!L6gven;$`DKePaOEyU1pL+_JwCU`fA#XhjcOAdj=qluz8zvMyH%EQwo zazmi4S-dbxbGZF+DT>deaG{fZK!|4Z`gVklsVT>PCZ3KpgDydD^|~q7LuqR#XsWEF zAAwBHuR@dW5>?>dK&wHQWANhgry%&c?_#>A9+duWhWCzX4>{_!#@C3v#sj6~TQ8%-P@e{N^ zcx79VY1o~a2W!Dpd|7&i);B4I$HQTLoRiXDfZfxXTK9RKkH25>n_nlwk=Z5S+~Nx{ zhIx&3pXN27mj(s;6RWK?_)%m^qI1Jrvydsryb6*emahamUy+@V*VLGp2Ktoyenqb# z2N=Asce>y_LT{NP@4&wm_TY=Aip1+br>o6JO%xYM-Sp9UGV$VhI+;fK@BDy$GdB%t zgxb3(`F0pUD&j(0> zgK~|Wb}h1z1D3YC`*TYoU0hqhGZr>6 z5eawVd;J84SPBsRoYk+0znfKv75DYo{j|2el9{5k3sD`8j!tTs3}42#%SyS)0FD~p zjW9b9Nm>2m#f$1>6vl-+#nYmj4^D@>bC~jq04aw7D3K3oJ7iZE8feiCK=&r&>Tp9m zwsE7lk_xrYYy>fpEn&{o;*5HglX$0RYP-)m+(3-StlgMO)gQuH7SN0S_i%SI<>A2? z9|EW~vM0z6`8yWlW6BUll7ay#nAVzVh+0QC{=#HdodcIf{p)`%pMsuT8U+y6q77Mj z&8T@|fUxq|NCy%1uaJ*YPb*i5%dnI=uQWv@l`0E_d6i=ar(JiLTsZ%JuaKo)lg2cHqIm=@FUZ&|?$D6-TEjowD^J!N~uU{aqzJn8kNif}z80&v5~`&2X{6$I7NJCbt=U1*w<+y6~dZd3m^b;8iT)XZWW# z#-;lJIwIr@bb#ho?FiOX;0P#&cwUQZ*tASr}Ny=5t-HNO#K z=Ks6KGl;@mVrudo3}*4;W5~wWJ}`N2P9;L^xuFij5G#8_F<9Eg)L^9q-w~MGpI1M+ z)ueeJ>?U;dA@vSV`iGMgB*BBq^R71!LQYkeyGLt3Q8!;!!KraX2@W z)c1{dZzu`$u;Q1-4L1#xv;0&%@Av3avjnT4zO-o!X_yUSzO10opO@jc_HJU9np^%F zFc&oNNeP2GJee;Q)gXUwpI?<`r=Y|lx7KcuiXRALn;3aeUS&ZSZ_7gp9)=K)QSI_u zV%mk^Qaj90(m6DPT{5sMpD>*(t+C!H)loIZ6z&aW=Qstdml#j7hewh27{))hkC6V5 zf1wf51w3oW+~gOtFSJX&*W$Am7W#BByoKJtt7v8!?ezFj)lhq$H2!fVd~bx=h)8{? zBaTfDaA4dpJajm|r%=IL0ZnUsHMN%IYX{j~i>63VI@a&Eqyl*C?4f~9ln z=SH$sV^@(`)pbD@Y^v^Lz9kzRSO;$1AdCei?)57p*@&P?0Gd^8_ZHpX?bs_*ocSOg z1cdu@!Z7Hzn85i2bUImz9mi&miMz=&RC&;ut?+M-@=gFC`U6Ewdl3#y@2LP2m0Yb< zql7$DLM&V6GhCLUQsPQst#p0+ND-_KHD=2Gn&2%)YcoyK6-UBuIesO5_8HC`!1qd~4-o5lINToFW=|Ns`UV zxJTgD-syAON8iVqasif!i|(N^reD-ZSKntZSyd_*R(}V^2oXxh{G_Fnjn^XMm5keO z{sFDW68~QKj~|qUe+y%!I`*w!faqM%QLgO>gz>@0vA;(z&|_x^2XC8z5Vn` zGcv$u0{88!xQ`jg-rxN){Q1QXJ{6Rpi&!aA*SS)$_e9EYo>YqH=nVo|A5C5Z$yf0N z`FLyxu#od^JHoE6I%~drk@E&;gA{>GmdL*w<1YH|5}N>&E?dE~)8Czn--0MVXqGw* znc=gSJLiu(wS$0v-->r#)GN#sy!N^=JX^ALsJ*eO=gQox{FEl1 z$$Z9^!q^3Ca?3nTVX&T~)aG|Uoz*zN^gaw*P#0ATqQB{&!@Vh{{wPzTNtBJBGx6<~ zCgF%DA8m#0w}6umDHVwN<8B))V|W@KJ;I>Gm#lrAZd02clFR*7PV_EfP?jcI7+w|F z!BgX*1%rq_02Yll&KOVINvy+DA4J2jDC!J8vx!GMeCSbYnq^o8=dmjccVJRox;p#S zA(nG`*39^HV>Wf?J1ur@$2evR>*O!$qEJ=Uikbn}1Gv-KZmLo30K>24^=V=W>rP0H zy&!S*^G3Q_%!Ub=stf?9;QAfEu%IOlkWTY#<$X*^B7 zPK@+U0h`%ZZO#gPAIP%!mXpb&wFmpcnCAqMTF+}vARei)E-5H04eh&dCy<$b2WV{h zGd(H0FkYN&1s{Y8RC|C`BJ10?VpV0-)+s%rc;aXjxVe5zDrmfMbUNa?aII?ib$lgTNdxNe zQuD&9C&e_qyRWdn6F2c>C`wu{LxzAC2PM z#LLSu3x&a+KG}E( zmI56aLVKIg*11lo)XhFUK0E_};ku@_h(iT>PF;`~(kqqkwSlJT>}@GU#&WQ)z(sSVK$@71e>wYMSt>7yEPC z7}S~7U286i_wRwC`eZrns!iosR@^i1`l&r3aI)_&$|M$-**K_gjH!MO1vg9a&U>J% zZeGSw#!XylAGhr4jK< zzNy!o{zdB8@A@~NE30s_nL+(g;?xyzu&8$Y6=>Fdet(@+x5`x(f&{rtyZ$BDq{jh< z@PHZo1RbL08Av*+9o6^O?Lx`xJvkmScA9<1k)Pyih~dWTsu7XK=ITkMtA)g#iyLAh zkd&HB)TwX03Pu4u{h?q72Az`qYKc7i|eL!734YB+C_|bn$kHNFJ z7^w89eSb7R<^_osvSEc+^^kt7*yqK!?_ifoc_%Bx6*14xRI;FDDX1wQfX_{c#&kQzYNzLs>iP8n zKn;{lHFJ$LopwKx5|4#}!?o|WkPp6em6T*AO42^mXaNn(v=7W6%*+FLF$EDzlU$y2 zjb~1a#eJ{ukz}{cAZ2kj?C{AaAPbgD(BTik9LJnLcre|OcuR;J62L-%$u@B=-4-ba zJ3uN|)4Htx+`~J7`(7*6{bAr&^YVe%xy>|G zIPwiE#&1B#{!V#^2c*<}B=tjL%WH90d^~tV*(I}u$OP+Eb{3M{AF;DR&^ekf-@|tc zH2sL~FRtYDpa9DetA|Lmf{n;ja~?cO^ICf2f4ZBcgnak@*%6F^sijVz+2~S_Pk1$5 zx1b7M2Q8WndY=-_<@rnVm^mzOq}*fk=DKe}CMnynXawfj&G&v)iGTtuYMHOY(3oT- zdYqTasse2k`cCt;@v$0bj3o~=V@u&Fbtt2673B2wQ>6xA|t74*GfN@3Ea& zh{vd{nh~;}wD&2$Nx+)a2#_!S9{xb+U9sot7s8YHVS1{^Y@mQm=+3*@)y7^g%ORS| zQXPkgzqf%fdJU2SIKE74PW0nXpk3SEw|leOR4jmO=QKNxdZ1xI^&DO`{FWb7iT~9q zcJElt{+`}BwES_k+zaW2*8}&2()W@hd(G2mM1^{WD0KW{)#?{fKK&o^MM>Gu3Fj(XM?4TV7n;1K^^(t&Lrp0CO^vI zZNI5NGGn#;Ojn7f9 zA1*m&Qi-n|0Y+It58sfAHfdwJEzW*K*sN76nOH)E=0PuGd%RnzYg0X4;ThE zuvt?`I48QF7U9yMtck}s2ELc8wT@4vVLW3mQW5O=gC8RN`8R|nQ9z7RCtrCcYJY|Wz;fkW1;07Eh@Gf zH9ystFrZg`BxJb!9hqSN5M#3D#S1fM_be^w>y90@-|M3{-8crj$Nc7<=KJ<_Gu2HC zmS6R@{w|gheeeRlm!6FOUj%mt+3GF!1u!Cp+jL6b z%qvp`u}Dstki&uu^V?Qv(b}mf@~l2<%cUE|FZzWXGzH)^>pAEsLA$FDJEcQGFAt?X zrq$dX?44a6`VcI=2&d-~O|^-BFm&baj{h>OD%yLRnlBG8mq6X<{l=37Ts=H~U|VO@ zqQ>aOV2RNnvH<&h`h(k$TJtH0NAfR8r-w9B%imC+*`K}1BRD-mAP?Ys=#Nm&(>CCc z^D_h}Ad$Bup|)!UW<3xU;Z^b_iu~>ULJGqjCOhuL8td)9lq&EPy!=jLU1Yx62Q5k> zZuYl{+^4rREuVFk&BK3IF3oeB;}jhM8ftp~4zjB}k98LxOA%bJi27Yr;~o}FaQr!% zA|At6iUY1LHfXse9m%bGoCLp^@$?Qcp^HNbGh3L3G zqe0W$hm1~o1XO4dPENDCe@Wye3p$o3?j{7V{05>JP^k5cn(LiT(Sx6XNSkkNQVY8s z%98!j0;`R>2fO`U0B^=aT6zc>(Z?_-Lg@lMo4(kur*S6om%e}LfxPZl85t5 zSy96DTw>ji4DLS;BN@0yiB3zL0%rSZ^v6hJ-TytfhF7ODp*D0-hSztxmmG;OR%^g8 zKq@;O{He`1*>k)JC>7px<^jnP0?21DjOE_L3&dd`boyud5dp%X z_A~KW{;-|-L^(+R*RqQt^NqFKH$a&0W7g*7Da-lQ+icBPMacs(6(;DF(L3r#3D99` z5TZ6r=2nur$djB1z(ns*BTM?7ogwbeWt&>5(fOShb?B_BeklF8*Kibcm^rU;I!|EB zT|BQQ`sbw|P+XVNhDib9LhleCqJ1)lweKtKU{xZP(y(<^5XfL3oi`>! zZ#$`!c_y>Fbk%pE_Zs3w1F`C+=RH5wDzVp4ho2}TOHRYVEOkIM!^CA$-1~&1;(cc2 zob=84dgc36!}`jxQS<1ZlJN7&4xgX__&Gc0Y?YnKX;PaT(p2G$nvSF@T5V})5(YG! z(w(fqW{m9AY2wkqU%)v_=M5xgBA&M@LSpxKIg?T+*#~A2#;uy2d>IyN$o3;jAofYh zg93{8Z%VWwMssHIqwl7K-5fAVv!qZ?QIs>!SQ^w&Y2y22mlBp%Bgen?EE~DV^QG@H z!4)GL>2k8oWFN7eMi5BAo&<{jwto{RIfnV;30vc0{8QaDAV#nkCIZ8;;id%?FzQ2-*%$Ij0v=dfN+%y7Z08Bjn(-CAu9>c&T1_-PR8jTw%NMcve z!!2V4m~P`h*V!ElY)3cO{ay?|5FU$e2dg9CDz2gs)Hbrr(^Zp@%`*^+Ta#nVzu9D# zkiD5u^e-73{S`&S_47se87R$kuufLWcc ze4(DrJMmhhWp+k`>?c6ym;YQG^ikIO(tBSVTjfA4LMlw$TXRSa+#c3A8=%s((~SR^ z%oepVZQ{$^cH_Fp%8-B4rx7?(+KB-K+ej*OT$YjY<)3e8UBPt+!aiqEzlc+! z@ru7bDAmz186OOO$*$g9MlT}i@B>1gUF2*5;U|s`m&$6+qa|`g&%o$jO*~Nju66)M zwMsinEIP;Vy)G>wT6F6Rj?}RYyawT_*agX-_IwZXH>lA67HiQZqhcstq+~=!K8vyd z*e)|c`gWsTe%J=tTqXTH#ll;TX>31y=mywzs)l++CVs!jKHYt!6lTN%yXfse zRPe}HTSi@`!)c!R@IAL!>yhIIY()`%1#Y5mKaGz`&sT!u#sR@8$JrBGY|hVS z`FJeoDCB7>zlSZ@Q;4)QVV%%|9wN9))G-5ifajCs(O_zq!84A5u?0_|m~`_bK4@2O z0&6!ySt8~74EqkMd@fq>mOS}OtBslBTA&iGpW!ef3Z*3;2>m?h*0;ghk!4|E*~3k*b8e zjEw56MC$BCv9Fc$1Lj@#A1OWQ6iQ&X{D_&V5nJ$;21A~~gEea)4nNep7Kj4VM|b1a z8XrkJ!Qy0;ibQK{Fkc}#^)s9e-Z^Z`DFvwacK|M@^bt{%#1*op>v5SQYz~H&zqyEf zP&FA5Q{)`=Oow>v(tChO0QLFRyANr+sJ}FI(p7M$dzumrmXH>QiYF=Qpog)A6tNi= z?Q7!i#m(0`c;DDn9=LGMlGbh>&>-=BRp4X^s0xhR8YUkav!|^Wl^?Ni_OEm^o4e!3 z(7qn=rrO3bm=H1N)gzE^S}-*CTvLKE1vvT@0N`OrOn{P*a0%Y-7-!P?72DuzgnYs) z6{{7fsAxl3b%=6A2?mWre;(iL@-Y-f>HL?uXF!4=5O3+Al*SEg<%uRkfftNt0fc0Y zDv??i41$4piqxk^fXzeOO7%&cyGXSw|5PVy)xI|de@VDCo5J_g-e`|eT$ZFMwm zdmW9wN}mVBk~8akQamJ>w>)_k$D}eb6$twEgqGS}$5Y=3W8t^^#RTN;M!f!D#g+mD zE97k>;TDe$T(|p%pF8#)%KRenee$1!fsyNt_a_$FaI|^9P>K+bLA7&a#B!SQ?%k_U zF>lDp`3u_|wjW8N+MVDV?`k;fMx!Wq&o}!+?x&CGW~F%n8b+wmRVP$vW#jEUurdgt zeg>v^U}&wM$8jsZmlBmMUBSEYhe>0U3rdo zEjSXJ$sHk2`B1J=6Z)d-d98`37sO{bYk2yJ&cKrUWi6KN=ap2*KW~UDF);=enhOu9 z?YaPGmAa;qP`q8W*|C)lZC$HSEPgbS{w?AGD#+p&Z;LSN7Tudv{`+!1MZkG~ihcv8 zvpZ!?n1{$emjS?gl1}Ms$~%Kqh{yDOciL_nHYR2UmiU9BXktlQ68{1*WxQ?4;EkwX6l z=?C2f@kHI`cd|r#G09I#!29IKi+WV})fp#t`Rhyyh2D1Ot(}cV=_6Jt{v_lLcqf|8 zr!Dv34k2pIQ=rzFc>U0|A2i#GkOjfSvW~2m^E2nWPri(b!(ovk%LESHzEBzp%M%Fs zs;jNb6ALGu_++l&GH48dNdC1CBhaD*{kT1(;7tn-7^VLCEF+2|cv*_il)f6uhq_Pm zS)KIZG)$p*IqHU#=EXUcImsSa zE6Ff+5T?;stBx6XEJLl6JOy;I*nQ-~PrWyw_deWh>n_6Pxh_{JWJePeAjWUAyn zkene&+x!^GNC*46^d09Ct1dz2cc=v{#F8r`0vVHA+W%!8Poc3(g#D+bB|*?aGC01s z`TeB`ffiP~I^ll3!cwCLT%vu5RTr?Nwz1@f?7H%sjJ8!T0v1 z({5)Fze0><7vwc^&eUUM3YBd?0bwC#y<~{&0g{6)`Y+mQ`3fqKik)@f#PE)_rOF5 zctE6^&s)4;a-I*GI`AqbbsN&6RAFL?76H`DuX6eNlzpPs{GB*RhzTHnsA>ZS5AypKBX1R9l!=0L2;^M9#juWHtNXv?LgH5jvt~VFd5NAvuOPS!5|y%2V;HtJar#WCbJ()JOHc*ZV)x<@f-gRI{lFZW+6WZ4R`(fH!QMIN z0}wd=p+axiISyuk!IbhBT)Z|Z;ELAgwa37~h{772(5~LMz?eK4NdW)SHiUX=Ck^m0 zazmA6>YjH24G<8z0CURLozj^wP|_d%5bZ z!4FTb`At|tUBsR;F4pbos88UyTvaD)q$^+}oP)RIb`2_9gq^76GOP&;I%!XxR)( zJ1}+%$h>Nd#hLTEh4?Doy$G+hs0+eMX#J&_5G((HS%2c03;AiNwGqSRiAQPHdKz7{X~M2to&VVv7CzYAc|@PSNAMa_R<{En%3KZc-|if{#Q$wg7pu|2f|*Z^{$th#|s zQh}=Ty;@UJdzrPs8er`Gl)KN*ai6;FBfu4j2%q|%f=TFMVCX~c`gKtdEwNZSMPpR1 z_x*Vl6yNbDnCY#B?bDAALl zF^}Jl>NoXnc8a1jWzbz452?MSWH%T3wrOze-LK|A2VM6hRtb!XXL ze?*?l$_%gzp|-#Mw@eFi?`F}0g|er-HeeG&^;saFKB~fLfBQNAJ?5b}uyN`Gx<(+> z*B@w%#!IhJ95h0%_e3no$(R8$H7FqG^E*I_yz8EVdfiAJX@CqMobY~w1`bqDNUAni zgnnSF^CLI|v2D-R#_eHADDf(u&5z)}p~STxyhYtW9bdD)G>FgQ(#SxK;e#*K{WD+g zOk^s)3j3WEUIk4F#Sx|!+{EXU^J?R8aB36;)%ov-G3xXYJ{l2c!Q5}6@dLcgR8XC} zxlHVJLWGWHq#nx6V=^bcPGC9&kl|)eE=3%hyvh;M9C=ojx8}N}WWUuAu{{UX#IiBRcq;~E< z$%@-;U%p>kl=7zV83LubH|c;52g!FY6%Sc|vZrjgA0zq9@~N0zz^kvqW(Ts_+Sibe z!70AKb}{aRRG9e(KMn+$JJn#OtV~{vueV1B4DyBe>XprR@yR*gcw-POVKC(>&fVsU z`3a$%9lyNSzW-aKFcA$|*o}rFMmrQQ^XwsZe!i>Qv9GJ-Kishl766*Dq{d7<4i_VR z)cT_P*r&I}#@|WQsC@r)Truq*4CVT(Ww`Y}V2`<&sY-VXM#Ctt@CKv6+o_CuKh4vY z1|9Yd7`58AXe09FzY+?~Fv;c)F%1B3thuY_q3G*Fc;rg{WJDRUvHiEW{7>m`aoL0| zzWsXNxj`2L{WA`0s!+-=bK0)uG7Xm0WOf*KsObDD(N}F$?f4K#G%O&F8$j9d4&`xZ z+%;;&Av_hb?pDX9OuCW_!ze-Q9O#Yuy(CiwxvGHgVw6OY&t@k34`3DM;w-zn7ytt! zlEtXqdaAofDbA=C1V7#XZEZq}wwL57ShvWZmG@nfDr>}K{4H1@ioJ0Psqf3GuzDo%A63IJhkr_1}B6aB2 zl5Qa97tu^!Rf3U@Eu3h;{pn^?B+v&^6pzAJ%IB;O@Q*S+8+PDcvcn&FNszmW!^LbV zjx|JuJ_8Ac-|5IHz{c8`Kk4?NG%Rv09ndS~;`;zpP?+SWTg{H8a5p31_T&BZE}XN= zq=s$Di_!rCa@&SsX^N62pu-dRR{xZY7OfQ37W7pJoafMEFHkzn5MGJNvQ5GC%3G~q zy^x9}wV=CA*Pso!JxVIjPRPgGg(pB;5eQ@)9`YreXHa6-Wag67cHnt7t*(oW$RCN4 z=gQAnG$wliKM#cL?AY<+dssg9Ol9UtRjq|j;~hnM!g}xKUapx(VxQH_^B)G~{xJ8u zr!K85_}Bcdv1H7wnJB2lE!cg4ffrue3jL^}@h+Xsk<+g5SfImEkm1L>%aI5uC$%Wg zKS&DQ%SlNc!EauK4vl|)wmPCcr92j^pl|Pz%l``lX4U4Q(AB`3We^6C(;SeaBjkNp z%H5j35mz8nN;SU0xA>PJ26xjoL7qZMKp2<3+f3GxP_t2D#vmG`3JfI?xXE)sW1Xe` zYe2BU^?jnsIWBf{<-FC$dzGmx`e@&Wb8oV|UjkF%SKPD756ZZcgbvwL#+=6$aR^iA zTpzH)w&Q*n4xD1+Bbye%=UoP=z$Z=}TdcM?(~7c-e$-+gA&QO3%9>Fp@XZiR%j?|% zSa|rr;5-SnGd%+mDHe6};d@F_c850Y4ChAbOSI^px%-D2e2wzV(0Ms{Rl39p;S5B) ziAPq3mKx3T;5YTtVsDIdmI^?{TX-6r)^N;50&W`HgLU)8IVLg7n|oKw1C|U7-tE!> z9}!66F+k0WIR{KN^WaD#7%7`mwUz^BIb;el?hU?w4@sg6?`Lh%@Bx(6i9g^ zrOT7fjFE_%;z7->R4~oN;`=3XPg2LLEgn4- zJ)Z?tfl}jYFb*G2eF>PNqs1q_S85esjMd9q zQBI<2`mvOF-ZO-dvP1DkJxw|xD&vq|yI?`t`(rmJs3Q2DH}_}prqdhZPurc%M>5*A zlauNH^CVE3ZQ{cPW_d1X^-3G57T)GZTrX!j<`ekuhXcCPx1au2qOb1XnKs=)J%HX< zd*%zkiVcMt5keH>(+i$oHucQlRpD?RZwP@|17#fU?M%_f2EtFE{vybd<9&CLnD!s7 z6PAi7dV8>o0J9G=xfzz?gu@yOtxqH7WFKp{LK>I?>%B%WhEdYYO>#f-@UhAut~|2D z(LQz$pGS7kzsqj*caAgI#b=|{_hxyC_m{LD*C{~g(cF8(`f^q(<04lyWTg3w79=>} z9gnIq|8dn3K6hI@QDHI;-gY5N4`+Etu#T0$SZp5Ld^gxi4;havMGsy1I+0*$hkz=33laIFvrVq%$272X$9<0se!V zdij_?pH~|Sxbs!~cM-*-gp{i6ncYq?+n(|1$Bz}6Lt4DfRH(fmEq-*9UNWCk(s73J z>udH6E15pNdN(i3rcGJl>V5ieg@O2mWVl+z$X>e4+IWZzS(NE}?AZ?e>KgDYfwUJ> zJdrqBw4m90EKDt&uW~X#Hz*w$aB@1F?>lzlA}5801>7ogJ<6wex{)eA3@@f8S`J_4Fq|M1kW7d8;O zw9zPNmK0160LZ^F#KjNTe{XSVaAappi?TsNXbQa5RndCOU9VEb58kMP9m&yX+whrZ zKGw|hZ?T!riiG7oQwfQ_#^Pi${$=6B$Q(?{a!r0yKH#i9tx0l+l*6L)HQw_|fa0zciVsOIQKPBR=ES$cRHr$AqZ;U?Nk;&?`Ul*>`B+tPsPxTuG#In~ zAaR2V<|z#zEBR6j)8jgwDp*My6~Dzk1*u^)uON^VFQ4TC>a;n`vr@8Vku)pYVH=tS zctO@6xC#mqHxuFqIKQ{(?Y#a4H6(KqoEn1&$zJWGpfr{xZch3d5{MY`!G3sCR&{>e zS5!TJ)BG8se*C&lQ_^CSeA7}PSe_P$ywy~0NGE^7VldY99T?+;3%?_fM}-xyAv8+v zkwC$nVZ+`~o&cRwf{QD_tH8%EgO9QVLmX9|F1csB;*>psfy;MAsv%g0BCAj>k7tQA z40>qxlIkIaQauRxTrn23dsuCMw_+(jfE=)OVleICRUrK9b&Vm`A?T=FMYsF$n|((S zSEs}5L=O07{yRTazu7sqCPkdK8%=jUnLY7Hb`l7Up--9=*VM_Q_%~)Z=@H;FD~P>8 zb8|7OQAwBjO`3`Zu|6$y^75WQrP*bS;2nV7(v28UyA8e&1A?gEbDXQovQ^qun$U0| zm;IDFD!c6UXuwfbvh^52_&;6YGtoWNb!Q_O| zgaca6K>zrARC!qAG|!t#lk13e33ZWT!XWICRlEV%f(Dpp_&a&dbk!X{6&B~PnZd7 zBPLCs0hi$ZlQw9qcn!(d{^r2oP%AE|5%=vHB^iw7=fn8M7^8HG1=ObfUS<$j4MS3R zL$=o1-YO0K8WT%JO_{_E=+q{CHDMTmh&S?CK+Kn`yhrJ$cnmW@B@6D(6qilSN6tV| zFr?{vyx#y$^F4l<8(A8tO(Vea%a^khn_T%{{3K}=ZJTvN_Ezn0RFVTM%?sj_fEo#g zmN9-Vp1Ma8N|9>l7Qyf*b1=+<<4RmtHv~ABZTA-G9;*T(q3!m%oXp`5nz#>73X7#S z%xmx|JYM&Ti{l{~ZurLfSCR!^eGYl6@~@8qrYAi45!@C$1+p|9151Hhe%g3QdyhC4 zhK~+4XH#6-|?aB z8g>|9z~hLI{HPhtPUG2RQyB z$g&61(hz+LxKorXm6~yX5UcOVzhj*e2B+dL$v_o+@QbQU%rG3c3N0)=o8K?_i{TNE zdMYo9{{SL4%LW^@;Pg)GH?KJfbtjDj!x&&VkNcU6$2WH4$KSXbTjbrVUDIVV1_PFT<#*;|@*5kA1#PJd9sGnrli6y6Bq{~4E*%X7iiciV}=Zgl;`lHwep*WV* z_KrLrL`ORvZbRgPYI%a{(6}bqj~Hs?n^O@$a`K^m!G{n9I{EKE>l82w!=cJajEMvl zp$bOxsHfuJWt03B!yI+I>o2hH-M>{=5Sk0e@DK%F(*PTf9%coMV1;+~?k~4Al?e+G zh~mE#*`BJ4YnO33UpfaXa3~#*Y3D!qmgfmoxncr^eI+r#qQ!Z`D5VhZfUQdNQBOED zbKCvR;B9&V)L00Xia%dy0nyJ%Du2^uOAbakKqwX8zOA@6U+;3vf{$v+rb3F446y;4 zr`QxkiOMcxx`r2C*)y*3y?~tx2_FPZLYgO(yl~K>B^i@`gIW9V@d{rq*_lvfuqlZ4 z<9&(+mZ_zK+V_XiG$4NtQ|M5@UO`)RMKu!ZE1n4H(RT79NqU^`7>Pc&6;AU(MLw>_qYzcoSFe#*kFD@;|hM zOqBXW#q15V2P6=R#hm)e!S@=<;BLn)^$l2+f$jpkaK4T(I=~jdn$VI1FoW{Y6sF1_ z^XV&|d92Lk%8IHZz0|&ngC=TJ$X?ZPXFnjh8^{0?F)WG?IS=s9yJ%nr?Tcf7{Pl!2 zQ;cdJ@-v>@x-iAOdp)PsQp9G)wa>6{Wqg5jtjMR~T~LgPSoait`ERA3Y4vMdxA+`C zSdy7GcX7>`wW6R+u|VHxuUFj#EbYaSe1gE*b2tm8hbz$8r!r&QiO-8O)V0PK)y!TI zF{{WHV)1s>KatgM^SNh+HNirH)$$q`o>_8z6NNJdNfn7x=0`FGXO*))3JG0W&rt&p zm|nXx5~FqPMVz~1W_nd~czin-xJ(wZbmsJ`*yoj^@KJwnUO0otlk}csNZ4!<{0Cry zPppVPJg^#P6fkRH-!;Zws7M4KmAfND^Y?)=7nbzJG9@d8ye^C{)(|y=n|UcjLRQQ0 z1VJCcs}XICMlX;*?(IA6x z|F!WjSyl?X(nbdv?l2XSBMLf`qI`OXU0(aE2Zbjex>+YoH*f%$1PmE^0f5nE30(Ns z?CTO+i+HRd6I`lasrOo^J|IMn_6Yc}q&Y%UqZ5m?-ZH(0{8SuCjp$Y3US@@61uy_F z->;vNj_HmAQ;qKy>m5ci+4&Hl+4jcNXZ${O8RyNlCB@IZamB6!+N7QY!me0TQP8J* zTmhc#%kaz|Oe+Xs2Cn+wqBo&^)vNLN$r6tkQ=MPpV!d4MoffM#v>w5d9Wye0>79#Y93~Al^qlD zxhJJ~DWk+23iIjnBWOkb8KjN8=c&-*m5QiB0z%q+>;t38z%G{!R;A7uXdg@NME?V6 zB9R;M*-+gUAJ?P3$<_Xq`+Y2#E1jNGeg^iT-iNh5F@tyy$L zNW59eAR&bKRfhvHlU&SHSY?HBpZN8@hpJogX7rzGy_4g3x3_&2ReB z=Bm(65&!-TmrVk{N1)t)H!mCK{dK7!X-L7LbJRt6#8fbg$D z^9RWgO<+wyD)wZ35x5&*%)jtyBNzM3T;hIDDj>$Qr<4+@up=;}!36U$;f6ZPOFstv zxJ5avvC1%)M=HsqX(v>Bp5hOR??+X;a?niX>g+*8l!|EKy3~1jO$<2eQTzz=3m(8@ zc^YbgK^0*H=X)}mE}HU=ui>V+*AYPHvA{Og1aP%dSrJ!06g|@VFQxj5F*<15d=|*0 z3}5PSr z`H_V&F|XtmO|Xir9lf5L99rKY?|FA_F~*Wh6B8j!IZ)wT37y~&K!^!)v|zc7-{n6G zC|MuA%ZzhzPNQcyIR~-r%8Rk**+mvBXftd~|CsHU%I9a;dO^f9!Mh!3|1|48$AeSn)Brs}L@1^QlGTmf zeBJzaPK{euAo3koMhsq%tQ2CCkHfl4^AA~7-zI)xPmMKX=A8A?O!;f}SVK3t;vI^Q zU_5vA_ugQ=!bRT%`jH5flf?d4UOtz!#zTSRmBR*x+ru}~$Tj_@W+koo?{>*uZ$PYc zfZYs)Cj-lk`nJ1q%@fSWsa6eFF~qyd6^A{Ei7#JS=jWIWe1CzTeu~Uig6}zWMsEj^ zqz_|x`#6CDck&gTz5v3LWaxwcFAqehnrzd`&eFL1-klq~w?Jivo{?Ze;#*dkD@pj@ zEAyX_44Kd%4-Tz*A>VM$tfOC$isV08ol<#hw3qcXk#uTP7jMx^FzwNKG9tP9t7D%< z5rzVe6K!Xh#&i99_2ox&%ML&5aAYf4Mk*)4N!!4Wcn~J-1R1n>bUYZ4D7=Nwa9LEG zipp0ZC1U)!CVeU*A8?3)JX-HmE|Kw3RlZveC zW6&~+f*DYm#z|JffV!i?tKo^^oeXE`@TdIJeSVruU<@1CldfUrT#}e~j=;YV-y!@5 zeA0NRSNjn1%HTED7QE!VC*e4t{@)y(N^+K2R8pw56%mWqfx|0DUqmW$TtNHsYDV=?Dx(^&Lpx#N0agjTgU5VtBaI!efOuY6gV&`#b0 zz@S1W2<{uWjz)@CO+vgIy@mGQxUhNA{B|c0R#9zR;36%oCtpLXRYUCjAm>%{`PDSu zE6mhT3hOOgct{o<0u}Ua1+egiZYvw2o{n<`wz)kW_2vDs9G=CiSnp;$Y zyO|K$GryExfE6D32uw@NzewdKTNBdgAK`*=$Z3uY9z#2rUJDChWb)h3mP6 zIft8hzs)j_+w0TOuR4Y6?@h0mq;Ag#3xnD;cKs%r*12 zTjQUm5y%w@WY59cLp#;C_ymNyCUu$t+GcH>&M|9U}&OJ0lr>4=)i0m;QridI>D(?DTj;+Dg#-On*G z`0c}wcp8>TF7jnAnEjR$l-I9!gJrI_25-3N#9qHW*_x8)4fu<@A#=NStKN1|()L6_ z!Swo{{>I?#)nH3d+p8Z}e=u9N(yzA`HfeRb!wX;H){79eD9?qvR!Z~hW&&=&z6@_B zv`-3gm`pGL1AT+R3f4_o2|=4Q^BDO~h)uGYn7>#FeAk(n66x^zaRLZj0$eI0$8aDb zVFq{<0MwD`4Y_k;_+$_=F8Qwd6R9O|(VC@Ci{1fAqc=_j7I`7RO!Sq}-DqqG>M>Ww zYPC%H**=vhkn;7T9E4EDy9D0~-Z+PJCl#AJa6_f|Y$CWsgL z*`!mPEClqa9d-QoYzjWbY08ld0iv`O#MS`e^5Pi*Gt6iDZ_U?}-iGw5A&lyFW$6QA zBO@awro5(|#`n~f8tNJvqy7t*CQMA?L069gPik`N#BaF2&pvKDacom6OTH32+g`ZY zE<3H03QBUj^n5qjHfE@&_>F)Z06Y`|WQxUyp4m-8Y&a&T5Iv? zbHnV$jR8C;gU{#QQ*9diY|hjEVUY6JQNi{h*yRgWr4>mMMcEt%%lXF_laD*-QiYcO zfTju+p%i9O$Yv5SXWb>Qz}Q0I#BZ2ESrdG_RsKrXj&JMGcA6M`E2wl%uXyY}t%zaN z{_np{{l%>Npp=4wNBcefp{JsAECKyhmYsGE4mIqjUo`@IE^Q~jyE1Gqv~>psUhQ|b zFa#U#jX0jvtTn}wQrg+Am)!VjOImC}w zdo-G%%^=WjeI+)V@hu)I6poK-Kc;UF@3BLd@U~C&O%tx?4KSu(X<~h;KBS)KVK(Nj z{1^LAQ3?u$7}Eyad9G&xA;l3{6uy3&f-Q3M2@JwTI+el)iNNJ1NyTaoFY#$-i4?*d zX-b0nOYnCNkR zJV8o4EZVw{znk-EW_zT;eJvuwt}~WyK2C-wHQjEcw?ZoZ?7KLjM$hZCuYd#PN!x6$ zuJ#r4=u8yhEjM~F`!Ad^yxb<1*?}m{B40E&DdF-HF>$}`RVfM?G7h7xup9t1*JKa> zf0PG5jr2LPW^Cng#+upmG}UA&zCY_FgQ|5ylmO`)_{!Ohgv}s1R`kfLn%WmJZ!wgE ziD2m`IVLY5S*w%sshH!%tghoB4NkAs_3+k6hBD+ZZFL*&;2bcrIo)3(X#UoPfsGG> zE$ERz2QSP;hRG6A74enAP)k5tXL~uldVc$G(Y=H8R{g@neV~$Z<7cckzIy+d?oUpn z488wW75DiXXNB%e9A5D4kUSxkAg}tX-Ii1B!WzT)fFHOfsN>0{aA4^0Q_jK#4)FCi z;0cCCpo0uv#GvjM80pzTz?v>e?=0Adc3cd`ZbbIITX+SrD#Bw9jhQwkudL#`yuIrG z<#FvVqcM0bbCZtNSo{cz>pw4^Pvj_iklWh{;SoPwjj7m@1PqWkFDa%>190afZRnM~ zw1AYP*8#`IuQiI>`C8wGuGgpgTM}moXC8+CmV5Hq?3%PPc-#5%?+Awf{2_bkHD!Gi zF4`Q@dUIS+D87>)C;f!s3Wc>%R}skl(sN8tNKjB-M@PqF<4ej&iODg?#aXA!v(Q}2 zojZ@9brZmn=_FtW=693zN|87^D9l6$=HIJ{&mObkH~B==g3)(vDq$Bu>;Ax>e@}BA zqNzQa2Iazk4Yu9ckU^YzLA|V4UJQH#3H7w}{7OR@>>m{D95M5ZT6@kSd9zVm+cu#} z-zQyUY*d4j0n=yplz2i4(^h#ZSXyr@LAZ%ESNc)l#nE^$!y`A@{U_5O>~=iFYnz+5 zwgo-J>HJQc7M?0793CDXb%?eOUr??MWF_A0UY#G#OFPp0?CV{w7vwiZM6gFi1Z@=b z-n~(1mm{wMl*V#f5UPpLa`E=dGsM}X7&kW9zH70*f1AyO;%kTzW$KZ!-M&?;HRPmj zA%9iMv+7QWY6j>tIPXML;Kf{)(goTmj5idzfK%|!pxGCa1}+j>&%mf$Jq zS13!ZeW#${ucnhGz9UGV0=a&rrB2tULrePM8yg#Cw3_Ce7v68qL1_#q z^VZD`bnY~Pz$=9-pQ}EOGM6I~`M0UK)l7AQ-QF&LsJ_PR?J9 z_}Lq*N)?QBc8~(J83`=~N-7a=?bp$N4}0HzfBE_}a`yG907echi9{YLQcQL1gWSE@ z*>w>Pc5OL+-gtX+x$)<#&QUvWP(t?Y)tXM*LZNrd=F6jQji8Z>$==>xvQB{rjBP3p0$u-)a@}8m7%lUyjli0`6a5 ziq509>#IAkpFE7i1!2s#AU(QWzVMHUSe1`48pC5E5KesJ#>NWf>oA5hNZ{Eo23DrL8JDJ* z`IB$oS8k|!B7hp6w`om!VxwADObuLg{xyUcDgH0nE$PYN}+GUVl&lw z@*nLb5&ZPiX{1%=JwLI0^7TtGg;qNR;FWgudz~PEPp0P6+bFP!<_>PL-%UdBJcMGn z-_~$uDFm7YRj)YHbp~p$jW&&J43Bg^RqIC9K;87B@PPW36(De}NM!ZWl-PjfVpgkrC@(cmp5KfpX?g{aJk5@&n#a=yDr< z@Q$9g-3I!tNi3+g?cuh`Zhvc#?0Jx4{5beXIas0XfV1s!+4BRE=Djf9&lIhDVMoc| zo5OB?1)mWfja39C-CPacW|~}1PxxI1dHx3NIS;pYekAkc=+f;NLazFtA$O)GqX+Hb zQ|eL*W}NeQ<*rL70f^`Kh>DgU2gn{}>E5*ES5R?ldtbstzN}Fz^v<`%sy-Rx8-8LU zKL8<^n51a-fh_&;r~FwY#YfJc!4wYPvub^XOV0X?m#wh9Cb<^iD4)X) zSGV6k4UblJ44UNVqlSvalIYl3*dug>67cLf0!Q=cqhk_6HKbqR=41gAXC1*ZNmlg( zvlOH;Y2>~=NL#V`!N2+QYQWwdzGp_nCYcg3%aW@XMHK?2Md9YZ?qz$Hso8q6+?}YP zAS5Q1)(E{q9|-dY$=@|;JCC+(Wiq5Mrv^v*`l1i_y|$+xTrUh{N$3QQBNiEx5Cfk= zLZ7aRmp5sVRk_DpE_j6CQ{(`!RF(d4U|F#k!J$&^0R#?rdj?p#`sVnSWQzW1Cc5e@ zH#N^P9ts7O^a7w;kT<%vBdq~~06-s(jr_;0KGUuGZ>myOeAF|-oa^u!+ZLd0q52)) zE>N&c>9RmZiTqZ%aUau(S$FqNJ-FvaM65?~mgi=;G^(DZTXx1e`*H^U)5$rwp*q=~ zQNBFg1%Ag)hTz%Deb|V+$hlxS9xCji3_$*c=FQ0R6DM`A6HT4tf>9W!i0cI7FEUUU z9l;)(l{f1j=}ETYyeP=pO)ZozUlq zFZ{oOc#ZYh)B1ZfZ!kS%=^q80?Iow|{vwnq4cLwgI${PN`@iB6?QX^3Rl%H3rZ+35 z1)wjY;XggPewcF`U^fEC*5big_bYF*<9sVnCn#1~b@-F#j=ykJlkr{f&zUg3^g zgeH{8die8NFrOmmIN}2~^qpN?G2l%fdWVN9l|p#;nKd(~AUZx#Qk?K=f!$;I9gRzU zNJK>INnM4i>F9>Xw}ZJg$u+To-QzIcfDn_z^a;)HGha9>nm^oJRNSV6*S;3ejBt>D zuG=qIpw%-gYOpG|jK|%c)HwiJJywowFpBj2B!naJE-wDX zG;G40l;Qp=Iyune2R*Xut~NiS3VWmY^QURv&FtS;XYJeH7oI6(;GwYSePqwl{dXGP zjZcW;dV&jpyI)R4zzV0w<@Wc{iwkjdXK1HsS6bX-J$~jLLD8Mcbuk5cJk*+TE9d^9 zd&OkdxqmY8q@6_58kXKX@*{eI$Wv*M-ED{;+|+<&%#-46JT!nBSY4b; zf_&$itD(k9geZ%Og!1H#8sM2GDxnFaW*<)^eUE~c#v^#rp{0J~9)q7sMa0ejLAQ_) zC4VK|-BOzRF*$(rmb><%#DA6}-EzEuML?_B>cu`hyWwHy>pL}LyY3-=wBy~D5fQPv zwzd)D8jyd?4>mEj>xJ{fwU)qf@%-0-_aKeOWCqzvM32qxWdt>?(AR!VZ&vhy&;XCW zVx%Khx{^NW4smXA%>B7u?lvG~=69?!xts_bBA9+UDlwQTA!`J8(qMOFcn9 z=(2^SjD;)KmV=~<&q+!5#NAMkIq!u)kE8YBKRHsl({@5kz!~`B zcDn|8HU7Odi5`6KKt;W9Ij`)0x>G0Ju`}27<#v=m1J=hlLkSLbFF;bO28Y63n!CWv z)Ao=GxrpEg_UuihaUbMc3Sxep&_Hkye8qHyx+QR09@&NUA+w`*LZs*NZ&mjpm^p~L z9HxPckRFy?{ai>^)fz?hn}G@!m85`x?fh!cj*C=^pC;UkLN`UTyysOF6i(;78R#Uu zqUn85Q1QSEp}_NA(}I+iE$gGX-5_vsOYemcYBpsB(4&uVEiw>+aW}Lqd&wzq@ zRz@B{r4V*%!`x%s$j1qE@Sfk{d*Lg(thhiCZiZc6wUKs}#bqbB2YHT($q{VE;N}d` z$RkV8Km+i~xjgVtL#caMvw{}{5HL(ot z$JAW4(v=mpV62gKtka=KXiS`0uue?q4e9 z%X!avQnXx*ReX~^>6AX<7x(-}Moi4j!{bmE#nX268njdEk1sKGNl9biWusnPi5K1WfLPXf)WF*=3O+|foajR zLRj}_LY_1MGw6goPn>k(2l^%*wV9Z?mDo4X=C>e+8dL+|2-BO;@{SoD zS9-bpJ`~H1gooS!`U%>{Co1~=c)`)pF-o5`SmwgJ{A@|)#uCgz<`w^Ixd{etSu(i0 zJkF8we}2()xHgDIUWpaK8cbebWGSH)O%kuRDfN%gVpEok3TXt4GOj>1D}N}z`k>C& z_%xS0hDF6Ff_ehjLU~|O{gV36lm4tR0aGviBSeTiOphmiIR;4VJTu7%RWNp;v!ROY zvtWj|H<%7pukFSNdaY2rHQN(j5AB10z2dO%TiJUF`xgo3W*IKvn)%->@^m3sCQHgc z`DAxNgV%5P{ra|Ru!PjE?;z&|GyD$`X&HPNTa}&gb^+lGb{}hp_b!cR3IN1dHEy2h z%82W_<{?co1ms%6wvb+@wrWgU$e}y1-v0Njzj44#G8$LsY7(2F#~H^)0cb_Y|T(VOA;)KTdzWnq7b3I;3G4nN?#PRznm36byMl{k-K zlzbfD0~UYdtT<|9OM>MMYM8Gy$p40X+^)X3?XT1agHCETYI3f*`uqAGF}O~Y`&~>g z<7h4Nm4gB_qd(FYyES>dX?&iy{_LN~W116^L>WC6R{<}#QO3VI{0O}tZwMpOr=QUy zuUiq&trr-Ljot1q5irU}LYfNNKrFBaU`Ch1++>(euSe~4-^TDfl%Evk;YMAIVoW^N+lfQIO|CuB@tNed3tQL&=O5Y`bP z1gB(b?i;(knsswB!&wuLYc)2x7TbXuOb;3mg9f_Ob@R#9B*UwfyUjlrsKyF;NKyy%uhq13kh(fMF-w%5+=2B^vc7&)5b++nFI&BQZ#?@d_KW2SU5 z#A7Yh2vI;5*REDgZ~<7k7m!r{hn=<4`wyVpI0(*6$%#ASgeb7tV*#V>x7P7mO`=Nt z*+gTOTz6ZDW0bhB`n9FG!Sf<{_}7BpZ0g)i4^Vw2F|mrVpfKu=w`+HC9mz0?j9lM^gi zuTvSv+0;V==G5>*<>kgl;rn1$u` zk}aVIlC4IgQC`+22X{l?-_I~hTQH9vceCW$zW#uqzjHB&LdJXj`2Z3Ov2%AbMmpMcRdN9bU{pXv&5QyN4IxMQDn)Qpx zRkAUnY0n&T@{!;}DE}DvB>%E3w#a2U5##$pkOZ-_0D=J=)qfp#8rJBIOc#uoW9cMT zkEBh{d-T^&W?T!8k3Gd-FJu2#Gp!HZ|4v93FQL%h{K^%wi%?~v06Idd#@yMDP$y3A zIXi`)F>@dwFdnn}(K@NHKNvag?>1hCfU8k+n#mx`mnX6)tqBVm29~tvU1>98Y-ffq2LI|wafq_}`huNn@!vz{6oTleb zHc!t$O{0pgKJBfo!w6^}$^KUsN%;vK+Y)vWGTCg_tH~~{rKmC$BdP1s@jv<&sgS!m z1*EdL)@$jD(`6{vdrtIa8GLC(AV=`dlWnFbo4ND1J+S(oyW$2VeEp&WaPXhhWj?juvW+rnFsI`%U$lD4~mX(6&SOAnRtjnMOc$@-Rwd#eU&xRkUU)c-Ma+ z|Ak9K7>{wiEG{nY5k>Gmg$MWqjZ93)Z(Kb+ljxXpeIkG}pFhQ--b(qk_9mO{_O8^- zS9P81pd%Ij0~?~|4&XHa6n`?eR6c~F_H?Rb!!u7cDTHJCXI-3&HNm$yt%wg!JfLuy z4TlFpY#}A2xnKywFE{6;&>$G(K|0gm1E~oS1&FttKwS>#%R@|Q@F|)gGaq-V;P2tm zElqoNeT`1F6ZtIv9Nf#$N3?xfA?6Va9;;ctExOxb1N*a=X2rikBu{1czYXxtu)9$$ zZD7r3^k?YG)a3Nu5V(L!X>5nl`6>e-@%w1L^0?yV+&bI%e)seIld8n`(OwX(B5{?y zSnuXgbmiQ3d)cOOI`7Xr2dcQp1yO2z&?9SF2kpwb<0_exs<>ew6#?_bSFaLG_TEsi zn+Bh+q>O?GT(-c*_#z_8cWD69YO(9IxWFHC#m}Z&u2D!FV5OP7pF^y!< zgd%os0bBaOO?wE`_~m*y?oZ(ptcf>$?0ofOs(-O`89><+Xc{@$mhkh05qCXGJj@4D zagP~I5Ct-RPmCQyaU}K@a6v0J-_?g)(vJ!X&WF~C84Mp&uqdkofmZ|6~#r3OfBT{{yhj{mpyC-NQTSyveSKVRzr!{bLgXi1C6%2XcOWMYn`Y;s=;t0r;4rC(sv?^A5rh z6Bos$O0e~7|6Msm8{H;Eadao2(exe*=U!B1G4X`H{TQV<5Roo^1}aZy#risn_o zz503NBcpA|hw!9f7j#SEns2V!>Vk-zHPvPl*`s!#c=%>2iz6z2-GGmQH;j&2IE3v` zxsVL~;N)P$Nru?(lqjk*u^loP>!^D5*Jd>EeE@7p?a~)>D&*qE@0SF`s)hhb6T65s z70b;GvUWGi$|ec?z~!fX9D>~ZqF_IYuj6pcwuLtD>e3^v;}IRFzX#uXrUK=|$gje0 zn+~14FO*IT{}| z0vZjH?;htRm}mKP9%0tKh~ZvAjKxT!!>}`n+)rP9&pLw6QPVOic{1l95YbwI{VOj~ zNSZMsTc-wM#^G>Al;X?~Z{_SqU%TXomsS|o+x99yBEH|TG8Lj^D z-x8@{)XF4Y2{O!b42)A+gQ_t9y|jku%YxH{6fG1-Fc-5!!Jg-Fp8eUlGj3qA3eg1n zxKd?FX#r{RG#)n?7y#1@1M7Z2G-bmaHpu`pVC^)VcsRx($5uy89esm1*bkJ~DA(e9 zc(sQ&PVa>A+}-pQ)z_;f@+3?TlRFGtPCZxCmDpm5d6SGBczxifgYzi{aqbR22;8jY zZw|rq%3B`*EV9(19c0fmJaiCu65VM{_pnWCn6W=#9FK4?2X<{upJauuPXNc!UNOREyChQB6au=>VR zy73}_%L?o^q^aR#KhP2hWM z$XM2j0NL;Z0mRDhXfCUn1ZcAp65{0y0Yc~rDFHNd-Q$sp?$Woay9)5V?)KQDI%~~c z4w^mVQ(ANz<9{pRz7eW33#!gy2g#|nge)ye43DVxv8H^AeG855?tPmtDnCVq%v0$2 z{OC=L)U-fa> z;vL4gb9PUMpdW`0p_!5pyB*^9ILv24J%eW`A;i$0QjZS-HM%M>xN zdfrV+Obooua#{pjB9vMu0?H+!SMb#M6J~9@8L((;@PKXhy*_vXl_yohxFkcY*!U;} zL>ZJ69P9fvfa98hcVb!i5Mc^?mQfgY z{M?%@3MOLMWJS8t|NA-cA>6~FpvJ<$1k?~$hOgr|i-=Ls0aFoE&4&-vP>c~kz}im2 zg}Y9+6%TE8w|T>}kX2e02Hz7=_!X~Mp}b-ZdA|_6&>V~o2PH%)zjlCJTA{&9%^d}G z6@NgMF>LY;l=iiIf%K09RB>pq25>sl+a~`U`j?rq{+5*C+=ry)Hu|lh;VfE&9q7Z_Twt()(*5UPU>zBSY-SgowX+qihoT0u_iF^fgJwbMnY_!V-fWDc`5{Y zry&p@k;sa>pi5zaW2Xh-fms&Wi#&b_X$drT3b0y(mO32R%n^~Q+R*qy98D6_p?IAY zuNRHk)_1rQ|As;Y`BX&!{J_-o*D($XhmGKFbRL)LXTWAP{eeXT)b}7F#Tr}37xIgG zC}Mf-KKcd|<#UX$Y_~gWqq9>Cb3Ym>IiWZ|1;+?vUQ|Z4W}CIl_@k8Z)cWYx6@tTu@ldK}zc?)` z$a~R1p7SN(Vma(rX;yl*RhoEz_*}sL=LW0UDC==5yS|}#$un@a$%hV8RPO=Z6b?Q+ zmQ#UQFR&*yPO7~8dz)RjOp}O!cPN3Rq2DYq>~pnZ^oe8KunfkyQ{ zLD|N}8p}_bY-c+DDd~{nJBZS}=x>U-K>&r$MkTi;gp&(jov}DS)gRJC925Qs0>-P( zl*q)fb&1c=@q#KP^8dS>2npfmSzL+&h}fvW%sWnZ=~GKYA4|*GvqQHT->d(|UsBW* zZV|8r2)CIcXsK_%de6frk}03|b@A7;2Zz>A(M_3;(j~8N0)x#DYzqQ=#TzRqvps>gElr&#^Nm&p|f zf?GwSFTmI?I^&ji*k+DORhNSSOkbX}8>PxBY^gFsoogx>8~**aQ0@sbQ6NM`5e<$Y zKPr&N|DTg&|41J9D6`j_cz9K5KYZ<_$sXGQ7M^CX$8-VIiA^ht^rJS8-BByxJJDQa z6)Vqnfu4by>}DvIl!g3%#8KWy@AScCnrZ&I@nWxuJO82{>AOJpoWCznIDTICV7^B zuR|K3FYudEIistrFHHqyu`RIWXka3@f)vs*k-oIF#IgHv=-}?krT(2{^M}!Q-Xnch z4vifXR#bx$iP8UATA=@TRM>VBaB&egfR0}{(z#rXx>1>TdvF2C;dh19D3v{c8GQ5c z_CM(p)zUVr=BMa^czr~Siz2QC5G9$9CU8JjFzDKab4enelHp?%6Pj!#F1&Dxs%IoG z=CU75f=cFRi<^cmT29MxM02k`#$X@w487j#RtY42~ zwzd+*9cZz}TMncG(56>1t1AO1HRoLoRHYh3M8=nT73=)vZ!L#efJo&AtB`a=;RAb^!}rQt`KfY5t4V3e)=u`3l*6nMh;yT1OnGgG$8Sxhoio?C*C1+{6`^8OAq z19@zag!z|j|FIUHnJQ3ggLeNmxS6odemxzw`R~-l#3aK?D%QRCAU9IvT}vgjltz=m z7WAEYz)c(oNI8{Z2G-^sfN^fw58SU$XpoBjz2q^#g<$!>?uy_(xG@K0QO8736BA31 z8wwz7+3t}H*&aGVy#1yG5l_?3@+PLL&rSz5SO*rm+dchyf}U|$HuwYFn`0YpRbDK1 z(i|XLgma#-iqh-g*ctm|#Hc(n6uzsD1V|4FoBdTs1)3UFm_e(M&GzMehpsemQG2?0 z6y^w;m);+=?+H;S9HbS!4qON$xyCFP-^gM z1&)7n@iM!=0Rti1zf49q3GJ+{C|RQ-Ryi8=XCRv?0wjjABx5lFz|)rb>W&ZO_N=d1 ztLBX`8*PA}D9cDvYBMFcKm*D^$jkB3v^>-TA#4)NDkr6jF~$&bbJr08KdqU9$zIVO zdh!|PKuA<%)pp82e7#D%QH+Wq-T;ZU8DuxT9nL3!_yo=L8lgQIjz@y38xwOGC+R># zj|#~ow!|SiW6=7k@($JFm65;=v2cG4yu;wpTjk%t08sr|`{87kCCLx~tX3M*C=QSO zgsOHqFj^Z(RMLx0ISd7a7e8i)W*tFH)UJ3qL5&tX(;uE}_c^qv+;IT18tnLjZN4qu zX&T(RY%AnUQ4QVC|LwlKV|FdThv+Br0yPLEoKBFm*56CQU~ZjoegDugs%oeae+UbtAE`xO&*T;5s-Ao$;X`<U$A%A+t!^;UkASp0Z-sc8! zZjXMvlQ6?x4P~BE_J!5gvs8m|Nc5CRgOPT^pSHiWw-P%XbK#ZJAMPPtVOZ;TjjH@s)QX9!xoG`V+i3N)G-$1ubltcLI zmx9&2JhlqcEHEuVAJfhWsx6%DH-I1J;TL8SFebgS;Fet8qFxi-@H@R1p4e0ltZlAw z>}(x#Z5LA|>njuVV9?=6$W3|u^ag-2&UNn_}$hm9AIL=ie~S`#q-uX{%MxoT>QV|9cKGAkd2Yr!1vb5*70J0McPD z$P8pivbYALhOi8SLd>94p#RKO3TnD@lX$K5A5<}?7xYbv#vH**GQ}B2c^bYAcN@8#cz%=Cl?jc`Mu9*G{ECVqB^!U&T&%sXKqVFa_2U282ekk8 z1fBqrQF6J%8-e{@AXEguxjJS+h;c6j{X<2ABh>+Dl)U_}@v1KmMs*m6F9GO?BOmI} z!1oBBaShMh9<{OEY;U~tIy*Cf-h&V*bQhQ@k_;)zbqMv;K;|4oCdDYZB}-jc2K9}+ z$U31kJ2U#r7lg$@3;8~d3 zMutx%7xc0-%V`usfdqPUi!k$x{WzfRRLiwpun`Vv+cr^+MMTV>2x{zKoMUuQ7<7G9 zleHu$`j z#k=M@Rjp@Q<2zYokyZY!9M{#&77xKgWrH{OYITK#YMsy6R64>T*t!U7@uE%?xW^75 z$wG*@t)6mp#>W(3907DB(3Nz8mczr?#7$vK2nAoJj#BEh=^YlWxh^(v54ty$|GNw3 zgQ%8-gP<;ugBP3z@|^Ip83c-0)7W0b{Q1E_--b6D2Mx+Sfe@I#;mu{4LFO{n4ATs? zU1=zp~5M#q%Q+j~@B(L9XfX z)~^@)?GGdhehPxSCwS2kR+mnmG|1x<$c`hIZR53^MVC-iR3stj@q@SRnU{B>O0z%}l5A0?C<#NnJ=KJF4rPgwwT!#>oLC{!8MtIpmW(df+ z)$2$WEL$>+-$$OEgM;>|nX{1+6Yl@J#4~1*3{u~p(6oen;O?SC!b7-t<^|5-#(!R> z_htYroOd;(xi6$4ig=s(lPx{+9{RQG4tgZvviSb;Vv>oq^c$4Al?6Cjr^SWfjRLg| z)2kz`1qNQT=#cs9YPn*8bL`0UuQl7`ieePc&z8?c+(U&CIy+x@1OAy@9L<=h5M~+V z1-~A<`O}FD2D;eTm0_h&<1s0FWgtIkrKd@jC}8{SU}tC{BZ8o4pyfD(xZF!De0|&9 zKUh~gpFcb*B|2r{`z;!3yyE}b_hTHXTg5A8YH(TvmisnKTeAIl+{qS!JLCPR_8bFooB=v;7AipJg3M3C^hR# z+A`-{OplAh<61TH^~oAST-=fWZVymH`Py5O^QomC?1ao$Ng2*gC|%|lLo}HM#OuI4ZjLQfMx{kES3uXAkx65av~V#)yMI=%OW3V;QYI{^<|cU8c7 zG3wte&#@M5fEaY-bhhclmpi1tK@L@~`dSeBo|%Lw^I?4OFtssB{idZ2Ei zUa&j;G#iy3z?xQz`|M9Lezny&7K}196ZwC!_SR8Vc3<1*-jqrTNDC-Z(jg&8s30IE z(%qqybi-C3kq{7&ZcvaGgiVK10!m7!AYIZ8-`qaG_dW0V#yI0UXNJ8kX;$)9+2<=rbSxQdw>2(YJH@2+O;wKSv#m?|3)H zEfm=+ikp;b5-Rt_>yWm4#OHojz}`oB=!&o5XVTk5iyOxBQ1ci(%JLT;HHcdH!d6MLaTCBuK6~n5@ukweRjHHhB%6IZe%S<+^L=oUVDGj&0(! zbLcZ(q2n`>X$A>rckWHcxb;-0r>F;N7QeBRVfQt_NPP>tzRL|Y+vr=0fl$#}*gd;% zLT;4fPI~zcbW6dyQW+(L8h}Up7HLIL`b3$LbzLCEroQf*#ZnSk(7Iu!@POuyl*U^D z6w71dC*kzj8u{3|>0=JUFMfWKGx^HS@r|p{V~IOpOPXmo0-lyNKDVppm|dDgZN7R^ zQVd-zp&BOLiWV)D)T`BhY4&na@Glp@c|*?1^2&wr&`h_)#fnKyr`Y-Pk638JU3eAK z=ka)+l{~~HCsr)@B!>&mB6+b|BEVVCxl~zk<|yOR99!e}*nXAoq02yQP28a_H)}ozJ*$M4m~+ z!sGaJrijox7p)0Q7_awRmU&imfG($hl?1a;K3>SiaSEsz`RMB4;o9x4oJHz1)xz<7 zC$`#(W91 zckj;YM##o8$Yy@bg*5!@k7Lc zRS!1!mMtHTIo9snycNLT>e(4u^j^Ycz#cK?gNTE6bVZ%eN7XPK@6)#c=PW5chit}) z&Lm6IKh?gCwvX}7rn2(l`A|BPwh=mY-z~Z4DxrKKY+#m}VuQcxys?4_eoB4qV7z?lWvpUzf*Eh(kFeFR%nY^1{9_j6DSA*8~EpsH?-E zScramcERS$Yl045BzIII7kH4^HzA0hsKYjtbff3}EBo4pzh+vr*RmQ;MR>DRJQ{ti z;6&{707XlJozrtr!(WFGO^2mQT))OymPE9?S25e{5Fovv_2YLL?-;DvS;Y6^4kLo^ z_-a>r?P_EdQ`YWmiNgc;MlZ|n(Z%0_&Yi>eQ}S-=NPVZ^f=)AWIAw{*T0VN`-s|zB zvL*;y(!3hXU6<(-%`ZGVd6SI$M%KDNSIKuG@HtLddr5*_iEIxm*d^AI-VkS#%&s=} z{^9QpPg26e8sJ0PBUN`Mzif{84!iU?do^`v7H_>j&k?~mdb`Dl{4%Q1LbL2OnZ37C zgjt3Kp~=WI-PmE=)i-K~_0ZTC!-^gW1=W)0cfp~$9hCy_?YM7WFeRYuL+S3^xkm{X zo;`2sAXoarWA$Ul@be7bA2p=D0Cd+UiLV)|Qi!-cN}|eAh~!nijx=P&`}5B)mqkS^ z+PZL6t|E2cNao9Jpln^h`$HLzQ)YpXG@&!~1r{hBoaJM^bdX>l@fwaGWaKc8UiamO zTrd3g8JX_;sqS!lzLXd%b4uJ_mT5=PLR(f6pJKCF6L;7eoXHE_j-i)N?3n>h{C)Q+ zr7}2|a4A_p7UN~Ogy|SNP8z?5^p1Zh%^M3ny3MW~4(HoFfBZV@)uUwL;``6ENRA2$}r3)|9y6YVrpDf6y{c>Uv3dbbM+&7Qiys`BRHhROCE-gd1`iyn=&%fq; zv~fMV;J7%$uXTW~M>F_4NJ$nrunEUhE)g+EuY}tRq?FrQy>Jg>=07mhxI9O0Npds_ zm1MB+oUzqtVIQ155dW5)qs(><`+GV(N@X}Ak8=nLKq4oKl!niLnoQo8#BgJe+{ZSb z^ipV}*Yyyl#K5Jsg!U7H9s+gpTVja%@g=nisdUlsCvG=J_}aSZFjIb+&*3sZ%9{0F ztuDo<=jw`hd>mQ7gHIP<>&}23qG9zZGQ}7h@6&Gsqk1`rk~=8H3-d^WS=#tKRwonF zsO-nT<=JiRz9Lk%{qF}A<>X%YlUnurbDiy={luHhAYv5ZPR|8TC;HO>{V%k3ICjG~ z<)!}<NT>Eez7VnCol9%QaNrWm63V_@2}=Jn}` z12;Trx9c$|;^2?ki_9aB&JLsK@1EUmB#bX`$8C{ZzkW;2lPtJNL6#2%?VyxX(~Q?1 z=ZK{D_KWtu!RNm9H?`v&G`=@E;AA(@xIm5AawUQ}9`7{|%E|4cDs^!N?38S3E)!HG8TdRT^S0rC!c7ueU*< z`}HO{)Q=y!Oiy=W?l^2=9XTdVRYGENu6z}e(~WF$Dev_<*tkQj$pea>;!R`5L|qV+mkW!i)vBuW$Mx}f_SSNnQhV{ zc^B)SvxaTlqjO^DOMpv}?(w6HoG_limd>t$WOeGVrpF;tT5Zl0p{ zPd;enupl(vA2^Vj+rQ#iGRR*albbe&glkAz!WZ71^RZgo*>Znb)AggJlnIC!wggHp zvK4xailC?npm+1nhO_Bik)D@Qe&Oz2WlJ}Y7j^=!eet(I@Y)al(-B`2cd7Oa8jgtl zW61jNvW}*!u0|#sxGKMNh8-eyBSEjFH`xAaFRRqH(p4!xUAdl5!zcNch&cY?G)_D+ z`psRXThuo@?l_rpZyw)=dfeoqua@kk%L1s*w=&Sm=Wf)3j;CnF=m*XCTO=`aMi97V`+JDE2$;vHB#(KxsAdf~xg8%uL>cRQJ+ zvs3{CV#&rLhD_uLlCIuT8~Zz%ONjT(hZ<-T7yXh4 zh1L4L|HiR`{`t@`JEA3>^*({khEq$HxGf^5LXTeZqriqjQP-$+P6evVy6=|6;mLaG zPxk@0m-%Ac48!*MkvI1%rfQ3ZS|4nD!u!+U>K?h?ibhR7bzP2n*Y+0t=GRHLrk+R6qQiJ^l0!`c75-^Xvf6 z?qRIzH1bAlC!*!3Agg&noL;ww-%uA=FaFPQ$?SJ}j|QX5%AT`BRoU zS>yhYff8r8jWins%C}Pk$)&}`utZhhfyR60;(fe;rDHB2L9?|UNYPmMN*$T(kKC=< z_`rq|KR4_eH|;-=@^PdP4=axNOp;92&-Qcwh(Ha->j@c|(W0tM0 z+03_q6i1`6*f(Cq!XH-q9Vr^U4y06y5k>*Mir3vYIGE|l8}+0;T1E`h73oK%MXXd1 zIokAdM;Ukgh^8s>hunvA8uX>DAMR0lV~N@l*l4@;2it9D7xR{~%P!q*3A{8dlBBLL z9Z`Q?&G#=0_SXplH%qD$3BNeHTJ3w<%Uh7*AvrB?OshXM=r(26)ts0JpOSpbCyo?Y^-g?^#_rn zPTj$g@x9YNZ>)S z#VB4x@z~#Xwvnmr_m>(IYossk_`Y_(kM)VRL|tU;#o)z*7n4IP(N;N(EA$`W$!nGVyesy#djlc8m6D$&HH}Y^c;!j5?(~vhD?@P?Cec&$X zKRBvQImx5@S%M|%M`W^c1M3lCUO9^AX#$V1GHW!AlsSbN?lTXvMlVBb(Y2~61zTiF zeeFeTRqt^gELs+_9KTVPrA`OSI`&$HRUVbZwS8>_PF3 zLPw;bCzT^r)Q+!oHp?gZnDft4(qG0tvB=4=ai{kixw_b27w0K#+4J4W`xzYO>jW zN$j19qw7zg(XjzJXTMmaCnIh;wS^sWLcxs+TahU;XscA_;oQb3+M>0x=q5MP;G#n3 zj)nX~f<-Jn?8A0scgL!A=v#V&1@^@| z_D__S?hj}dF?yd~{iN0RUv*dXqWPj?@Vx3Lm`6~5trxx;#3@%^FH?5_l?)XqAe^s;%*ho+anFNr(uA*h2}o%YaV$OdBlCFK<(Z3Nmq;*Q}iO5hQ+Uc%g*;0 z+T3EpnPP6FkMkUn*~M1 zWt3VH^T<1CzT>JCa~NY}EW)UkY3^V}kLuLcM>lh$xUtjqq!h~$nZkXsuR5yBqUO@jF-aCDHBm_8M$ zQylYF>>rF*YPiP3*f-WL?C=Tg;7zbtZ$wrgxU^tM+s}bodHq`|p{rFvimHz;rU+XT zP0-&@;3eGphFh+AMY*_QD&Tia%i5*s9m<|MHDq#bB^zV$&0ra(R>FJ*U8~KMeLaB! zB$xZtqoebIWkRaP^SzOZ*>aY1J)^D3;&rvYOD5JH&w0YG>QR)_)h-q5)S>SuB?S@M zC%X7z(;MoiloBuba2MW0Do76cw7bgcWEk(pE$u(nO%2Ms%2{$#d4%UG`_7@{WjC9F z8etbKon!0j8>e-`{lWFb-01|<%*GiX6$x;Xv|tdHY!Uh4Sm_rvtb+&)e`^?s89Yn; z)$Az~D1;)IZuYds!17NlvBK@qnYpEbpNHp$rA``%b44`%^rSLE6Gx}-G!aC!> zw`qLdwp8r1!DS08?^PZT56XC;8eNy^TX)IJ$em-#0vE-@LKZyitg#$AcS2~NF3$SY z#RprNnT&o++VKgrbX_JNahU!{tKL=UXKWrz&n?Ez9qs?@_5CEt zF@K$lVD(t~@-&;WXKCePF5)b12Y>nljlQ(_ZQ{m8?UY|HSU1g_+CK z-#_fRjyyT5-sQU?z$FsfP1$33$K(15&xq(CeERx8!fg7F6(4@&9eyF?9Y<630tfq0 z3xN@SaCL8IF?=#j56d?_!8IJ@`>r=|IIY-V^TT z^%~#gl8JNNnMiUKZdrcNX9Y*xfig4Y0wu-2(?e~MhoI!8jN2ifwRM5ziO|e{na}Zf z^hc3y(wlh-TfmR`5A4^HiUt{r`kz=guIL~Qs+XeAY>*N~rqABc>=hG8>kXE*^gG`2 zkU!IkW%FjCN!#>wOs&R$qfm_SFE+=0cD-zomwBo9eChVf!zYI!JC@vvYD@JmkP}f) z=%-!j$F_c-kqH)E-#sX{e~VcEgnpK)Crx#v8L(u}$Aq)v%B>&z%oedD`v?SuEVKeVoo&2=4S70-A`5D?g7KNE0}h zL@bD=pYux8bL^PCt=BMAqg;~mcSHvmImVT_p&0c)y}!>?_V;!QaQ-Zg{&bPrrm9Qp z+cc5ateSaqYw29uwr_G_p7-GoZM)kKv4#n;oJ$85Gj8q!+%s_7J}z#3NWxR?5;I;| zCWNAL7{>Cx5k97#z=IL)Pi-c%#2zJ3jw9#(VnMf|~Ekw)Al>21n>0S<+F{!+c4O<<}Vl7-|Wv^dbao3C` zGRUZSekE7!em_~`M&a_KiGh@RFY9|oUiAsZSgOss%%bA_yGnXO?;bs7id_67St85G zjH;j&y7hqYP+JM@yF2P>X6n)*>8Fb{V22bsMn%H;cJJgB^Xd6hW!nYrbhbPMaoP?l znXs@Z$cgCX82M-W_8_V$FDdkxujjF3e!u><>nzSTq*UM?dz>kgMuTMBwu29pExigH z)(%I%N@&V!|1-y7j-?~5N>z&6^Gb5+LZ%X%MJ$(bN?&OOq8?@wt= z?m$D+Qx1acul)Vq@k?p;+kP3&V6R?%H!lG0eCobea2g$ro?#@J`kpM7Xrz4e>k7Ld zpR-N(<9!C-5`N3HNj+>)bv3mNh$}}g$EECWG1xM=+dJGBV{6uXoUgt&QP4$Z%X5Cg z8NJ3@ese#~$49s0ba01cexmY4UUlZ3R);^WaY_$rC(DX(&AoA-)sr<^;`)EB&C8rU z(BSTkv7>tW`?zD-?A_8oZ} z!q=`No}KgUd&WApu_!^hrz(nw9Nt%vs`MPFDdT~R>U@DFuZXjs;6-}(dE2+=ir?&MAJC$KMI-<3;igwOiz>J^$LWGOE0gHK*E&KaF+X6L&K*=V@?}g(Gt9#yv;H2G0-W+%%57h6!7B%CBuz z@9)2FV9QQpR&4l|jvm!)UaHO;?7^Z%P+t_|x!pf#nl?}IgrX6*tknYZb+$;u2?g9| zr*FR=8uqzpK5_D?=N0=_QHMSpaz@^Gt<};+zI^=K3tZUH{r^}yY9gRcn-^@C%0r8- z2vaoDyNMQ~zxXttl;Ql*$|^XgGbMsKV1*Ld-&U77x_z%4N897Tq~3|5vH0wKH&C24 z_V_HUs;B5;r);*COiDS~^B_0-X^u{EdXBYn)Vg27AVLfIy_JJkQHH6+Vds)+J4wu=Gu9c`#?WGKj3-sPYhW*eJxG-kCdv z>sVVT-_GdApT7IpV@b>aG4%xZ6V9`LaQJ$NX5|Qj6FW+6bU*X-jsZouRbP=;r`+AD zg~%zs0ob1GKJe80Q9o6OVC^B5_gI|LrJB2=T2U|awn}wAyW4l{A7u@A=eGZh;+8wC5~?MfYxyAI(*XDI)guaG#B?SOg@SuYZp>__$lf-zq7TSIChjeXw`cyxJ9LVItO2USex0JeIX{kFY_RWXuapx#MiL?j5#)U; z?&nJ_vh;g5e+!{HJIVOXfVy{u6kVhb21ILXu@Gu8*yQC2H8FLbc+I*KQ$T^h7BiF$g6)GwQiRVy(iS8%jHe zJ>fd6gK`$m%tCIOLi z4Dtcc@N!fR?x0)J=AqG;K1JTI6b;*-8nL&Run~k885LJ{oX=f0WCRktB|p5?mzI-x zqmm!!lXZLd#fUGj=FgGCkN1uZze)?b^_%Jv=z2R6P5+$zeViG!GgM17;9kn=ocplh zqP1UF`evPGiSKTM7#(q8(c-5f-`pq!UbW@ca2ft|g>V5vg@~(K|E`WmB}btBpLuj% zIrpTWqvk{L*Qr-4*nk)07_(^E2;ef^FGI0jNRa$9UqhtA|1iMti6JLaX#?&fAVAZ$ z!>@g+Yk;KPsE~gc^esN=RrKz+cg*cciuyBEL|r2?7B)yj6R5Ar_Z*?}JI=b6E;zt} z%IMa37uTXfE>K)$FrjFe&{rcqUo)Ju4OPm@Zq;Rt?9+fk-Umr(rl-aWQiD$JREx1t z5iAJ90AE)ddnwYpdE@bzU~RRhSI3KW($nqdQvJi*6O`{c6ZE9@E8ZGdB#Nh$qcg2R z0impG;P~M3wPzXMwzlU+is7g0hhybODk{ED&mmy02*u2m91q@5ulJa8*?2#`(Szmv z$drX!ZonPZ-p13quG9wqARS`i!8hE3Y$#jrrK_4CC`}dL%(B%)c*sHBqzxdU+csjD zuFvWirH4G}tJ!FQ#TTi>D#-k_=A0~g63_cr6h&`htWMGD>yBonH3ot@EKzmN_g@Ai zxq8Z#T-Z+Y#DtB!(>J}|wVwD=LVVf~Wqqvd*Z|k+8nyel@X%b*e8M+}JflHT% z?jBV|?6%l!)2Wj;lFKO|iWgRSdhD0%)6)Wcbj$Yc?K;XdA3)e@Qxz{h(j8|6I{eVc zIuGbDS>uidCgV7INnZZYP*jU%-n9tC;gb-$zBY5SeQLck7S=7KDftH^`N1Uil6U5O z_NC4pj@O9)y-vs1qou5c*RH`xTCdQOlk(R#`p5BI*3^905N@hy`;XI&lgH|k{_xR?NHu8k`Fzr_(O3=&hDc$12q&M$i*>2bCEl>)It@7Ym zq-Kq5oM-jL_$v>yr#h!O*6uCpWj74nJGg9MS6zf)_?gy}5tLj%h31F4j>lV zE{^NiI~Z50Nh3;lB%e(oX%g!Q;7qJ6Zatz|!z++{LE_1ii8P>H7=pX6T}ZG9Wd#5G z(O}!^*qcEy2!LoqoY-QcBxhq>K8f8gKLXocTCbD0TRfhrc>UjZAt`LBbTaL6Zr5<0 zLq*lnF<@)nvOM_iG;lzJa@;Gth^#S1b9(Q!os%Z0n4c1+0c528-is*bqedR{mnOi&2|XklS`BXUO`!-~C)yg~Fq zr(&pCXPFS`XYS{bs)kyKh1)7WpiV%?3J_X|hv%!_7P;E%L(xb|Dz0i1WE*k*teD=> z-0~rUBtQ4^l=WNxBIh5YXiv+?-2m~d+6#;5;2W>AeHZ;~pC|$$;IK?fHHy(SiVga) zqMna3c2HWIH69>gJP>4Qz^?;7+w4I+!c!k`@Omb*2_4!gDabw5WQzI*`aa{}D38#b z;fab!VLuk_7R%VBN8IU1)N@u~`E62f2l0*$J@EZcr-Ixjv;(!Qi?usEa`Nn;g5UJG zgsllx%IYUs!;bxsL#9wjV*2MIpFw)9U@`ai1{rGMO4mBpgqEfnrG6M~;#OTiZON^< zvsMj~>|*Q_XY*wOuK*21oMmMPNB=&)GB6BZ@0=gAK})lxc&u-E%;7oquW1|DVfZHO z27?GZL`ZvE-@nvJ+*OG?oj|?psBj(bi^{a~tWt(-TF1zLIAkyMkj0tB+zcvugdATHv%MizR{fQh<*nQZ2kL?X0vmzd!$VGICa>wm zWn3rB#6&x#PZ8k%M6E;e)i6fCx3G769a6Nr<(J{3tIGs}BYo^$&Yu=ygc`@n6U^(U z%M2wZy&=Q)E2O873E%OW3mELooIJ8xYT>XQ6+@$95h|Ls0k@^oM%|--x}o|xQ6lqs z-yw3#x(80To;Psa&$POxfw-@V!Qv-$9;GX*GZX_2Z;eOtgf%c%r{*T>wOaM#TvjWs@szYLsfmBMQ1v`F2EA?fWKX68@>53O9&-C z3m|(V8Y<)NhFznM(@7;n&Pqf_^BdR-V!HV_VQ@febMm-D{4gav1`$|GE6KjCP;*xk z%MoE>^3V}`;vMXC{=rh#b05U2zTDMmAvUEc^}do^Lwc%xCsCw8nzyIDVkZ=(Hx{)y z-xs@gY#AKHUHy&oUE)cDEf#j)yOO5I>&39c;~ZdK1Uhi$HmBRsY)H3Kp`N(y6h5|Y zHfKBw%E$O`GJ|_o870coz;HYzC~!H%#KY7+t_-^CA(IyBm4PAVk7ESHM+Xr#MFGyYB3MX(>yQKg$1c}vwcTI zQx~DFMU~Vw`pr?m_mNaMj=Xl<2P_=|8-z(ZEq|Gq`&I2UH=m3m`gE7FPHPFTfS`=&!47WEd#*rlGkWQ~YML@Y3d`y)K4&WbK5?ap&ol?<1F zd4}<`u6?DVXdH3dle`8yFK1Ii&yluU!=nXb!omvT_0b&DX9taGxsO$`;>}{tLdW4!1?puzwCori1`jdaHuzT-h%WR0hfkjcMpi{($ge9l#8W_-L*-+M?4 z`*HW{E%8e)Xjg4P%B@6$j?!vQVF81}T+HzM z-ttIpw(1gvQ9JFA4|cjK(h^#EZ$2nl9>yANds+V$vM>O|PpukOk}Ym^itpE8tFRHV zUve{HOqztV2j>|;!vo?U25R~jOP(H4FXL&;-ur_16e(G{`|V(6Qop5H?f$mJyBD#! zL;*4~ZnC;|c{N5C4g-d8@Cxo~&Ve%eU3<{Zm0&S&ReNa`7QH`rTCZ9Cn=m) zGA{qLEI`BpPUE3Fwn~Ss$9{55-!uN~t`WPJ^XhVbwz0I~N86j&SF%F5ypU^Yg3$;( z;f~+RftDv{t*lSvhzmo$=&Drj$#Kpr1t;FC7o!w@;PzSw<#%V1V5I2rxJCSKK*r_w z+6W9UmBd02$^ic(ka%*tTG-`{#zl(8C51&LLkq+rou)2kb`s{!4auo{fOA*DLXIv2 zWyqG|S%B|!93uPO`*USWMU7IYj?V>Ql3KWYSN_@A^8<;!%=!W%hX7x^U~SnLyjV8(E#ve~)bs0q@lQ)DHppJE?0M0*zU4CUR#4gJR01^EtR9*uhNu-} zJBV@3Z9Hvr+V#4syxFlwTe|d&I~`^vtrlhz@hzf&JDqbYz{u*JUQ(|@77IP%NHH7d z&!4+7^s%mH^q4!b)VokA5>+-bi0IPB{Un6CsZ}l%DoqkKU4a zpZOk(8h;FS+4*f=qPrPKYk2}*A`$GSS+;_0@~?WZj{3#z86eGv1_ixD)6w}jigPqz zW3gXP*uv5eze*NNxUkiWMZ1WbK-O3n`JO(F8-zR|6btI6m5;q3$KL3J>Crd=H%jWq znhZ@(eXqW}_efuzCXVqoxBtoOIJ4D1iK2cD_FEFn2vpR&a;!=OStAHjZH4F76*jht zdK`r5X_npqfPF^|Bfl|`_J=ise(;x1-DZaG=cBtc(M6{v^NQIEF%absvb(U72#cL! zn6A9_lj37_IPY`VG?v@AlJz>b%X&Id+{58}q7bL>glqrD+}vQN+13_ospAn(FfQ_* zJ5W|ucIvvl(Cj{DPgP!CuBNR`g=wK@;M~qq;yl-3GsEsWD6gr% zd8Nf@}`=}v#ig!@=a zMg49e7-F1}ZZw?xa~W3OVhA|d6y5$VXr7be9wIX7nHA?xi+HG+4cSMO5l8x0$4?s9 zPBk)kL*m6W$ zb!HvIfM3fUld%6%kJ651JNjVw)SEM{RK}(s-|n4~cD^FeKYdDWy(=#B-=Q_S-`)rt zX3*j#{k-2?y)Cc@gLVM6Q;g8f-(E&0+5c#%#CvzyL8?ub%J2#S70(+;MbP-oC)sl* zxMajCspVjE)*P&!~Sj1Odcqs{g; z5&H&1wb&pU{qV(@*>J{4U^}_5o*K(Hu+KIXan0Q5jc0VvI$X|@T?>dHZ3MIk6v_T*&x4@rv?W5Q*T zv|2^GQALF?sCQ3ypG!%o-8d((D^ObN5LQDHO7m8MTfhw_GiV(D2F%f{$E^nobk)>9 zuh%Vvi?1&ZZi4lLR9h5_A`{b0(2ekK)l*0IsuH^zTsoi9^}CUXm9Qe^uow=`f&L&Zv`#4A#XI>+;u!m7vw24k4T!~x24T%#% zAr}?5=YIf%7PB#_Db1akRe@qQ{V)6P416$L<#M zL{kq6((SHGSIP<>5QU8{2b4Q47E|rQd{WV){p^IE$}7=`b9JTNE;q)^LIUO_685Lf zNeIfly>4$%hF&6Pb@e(SV#G#F#H1pMK#*hi z8gqD@v(O~_QdM5>6?)hoIghki|d;;Ss7m_P7noxPj-5! z#cNq7^+q9j;V{{Pmki>!KGa0M$8XoRB;Fw5%m_KAyW-4NC$H+^q-}8>rO1S<`nd1* zkIlLbKVFO>(Eh=Js?@3L)n|>!%~m?c_rB+wZHy7nbN^0J-QMT{KnhioJz6&+4I9Bu z2ppqG!r$9q^El4T#!WW)sJCz%GDt{sU}5s{@=WG#ckjTa;W&=8<41Ph(3SA>X9kCD zaapGFn!avRf0GUMqn)mAGkuD@_Nr$Lu03}*D;iF@Y3b-@p=DnXI2ExB78%l6Cp$eD z2O~lWF@F~q7vHVuv^RjWH=f$s&Vs9E$dGY>1SOZwWlU4QtkP0}RA_o0f7`{X42|BK zkHACxZa*NsKXd##fPMaZGVP5(Ess+K;@g*=jQeAb#RgTS{eB|j^}lAF{lbgF8_Zfl z80e*#%-W+^bQ|Wo)20f|k$ivbYZUAayqk$Pf2jIj3)IRt$3m_D=}P#LDI03mm3*6& zw4__|xEcCT(^y)rIM4a4m201z?Kea`>CbK<;H|x!ljiUJ_qy})@*E`ocSQ6BJ4^d1 zVV}KKYC$U{-?Qzs2(Rt=mhvGZI<{0#v*J@<1Ojm-BJzeDddeT#r-@BKQ^%>WprGaD zWd|0UAt^bqYbwzF%(^1hxDvrg%5T;jlpMiW;^1cr9~4f-pC)vu{1xa4rd3R4hMDeu zTOM`)XFz=Sd&3*%-B&3=fQ5<4|74cYSjm_!j2Gz^X4%#U`KX!a9?Y_)#={0SeW z_ZaUjoW)>6IE!K|yg@2=HPWqNcP!O=IadYS4!+^x7@#9HDJhB6$+JN}twKGDe=#h@ zeKc3UZR**1SL$rWYldY$R`}(kIGksAE7&vtM}R{h-a5>GParKR!a68vW9Y2x#!MeK zH#cd?dglE4u;2bfRz?OiId`Z(oG&=WG_fNk-OM2IV`o*0?s$+{L`BxAJv8;U9i~nVEIFMtN_CS5eVb#MZR!Iit_8*YP#3x z;lH1g7A9+?S*@H6hZy|RL}EQ*4QZ9%ak3Vc_LH2H>i-Z3@CL{rHphe~yuLla5`Bpw zpUu_y(`^hsT(go8?bc;wWw6#E+~7liWfHWsv=Hs{Nse9BQ{bEl35@Zm=e60_e=bdU z6aV{7={xcW>p%a$E+6>fM=zLBg4DO2ExsoRvN18OH=Liv12|#4JxXkPGd=%&xiFi> zcxrQJf7}Ib`z7PaHNf!43=Jk5c^tx1zT2W(-)_tn2b|jao~{@}VdDsvVVgVss%@~We#DEp zJtd?OU=AdrqZD5&Q#Ww!mEAm;jcBt<0_{wS=s%aeN(Km*uyMBsjs+)X{zb`HE?u(S z-CZvRQUpSJs9E4c=eYy|q?g}<;Xr-=^EqZXv-0ncA+Xv1?@!W^Z=sa_`(h^px$obX zY$nqbcKSKgf8|pS4h~&Y((rz@Y14saQ)S=`TR1LM`iZ`+pU4_nY(`2gK?GMxj&F;E zU)uRzYS{@1kQB(&smxUZ1cK1wl)mXH^1m*g`M)n-PhWo)k}S|+)22XKUEOno3q4?N z<^N$1`~tIzii(U=<7TXkdbPiEAHDFBHRdZ`BzPrOJPI$)yA{J`p&vi?{LIq`GQY_> zPvQ5aHnTWhe+PFvr2bLRHb)wNflU>TriMmytiD6S5dY7C0a;+3Ms3oY{Kbo$^OTqm z@WyNJytcrL3@$WknE}``%M!i({PmJa`0|#Kg?(ZvI9xBLxf4p+(lF7e6 zp_s1!ABI;RPKa34U--|!H@1Qh^6y6<{ePH_dsvw41+V`%7qLX;vd|T#``M}mY>R1y zgoOAV#w!oNfr<{yyXEU&KR`Z#(hEb^HZe}=?$D;0TIi_;5b_5Q_>-+J=+Z`6`7GGI7Jx9_|l zrmA#5(s2oO#W?IGyL8>=2iM4t`T3z89UV3{Hh(K1p33PLHga>M}LcI$W+b$r|Jdsh_$$lLmonm_FbJ8@N!HSN7* z-YMx<5$C2MrD^Es?2L{xa8{^)E&qHN5=LoP%&zgv3nVH=;C2DcjcRXD$W1Jv^zFut0O#5xda|UlfVD`Y7$RTB_bkf#}uNv5vE2lvD!vnANmgg ztBZfTCQrtT%rmq!-eJ|A(K$*Ijh(y}_<=Xbe2JLfZYmm)t$GU9^ET)AZ!f05jKZi0 zQDI?W?Z73jRdw>zlsO(_4CXd69wS;K7}K~oITe9w)VE{m;lqf4lN(i@n=`**8AN0L zdi0G4Z{Pu80hoae==NOD#=r5cMPh$E`c2U9=3sIc{Nx{;r7)+;7?onpW%^@Q_`@^c zzp9W!liFKbTYuk(xD%BuXszO$Ux@BF@Puh8u0ML}{O#@a_8@s;da+xF7$1s5z#%p| zI=W~ec#8gOw#JHD8XC+um~@Se(|m#RieGK2<&dDm>&BEITW{|ZE3Ct?P2i{cm`}$0 zT*2OsU%%Yem)2aegU8S1clWBIN3iK}Dh{7tHYg~%`ua(5y^_bP(FQeeQfLoSFf)MP zn1u{8n^OE+gYu`EsSh4zh|azdjN+~Rb8m31TVmhf_(CuVn5)q2W9}I!N?J0X={*6a zD4+|DanC<{$@*B`A4ed32NY!PYFP8sAI$9Cb_MWvT`8HTOh^WqWX)w6AfUandmkJu z_x$`Z=Jj@h#Si-dsG=~6$QEchPtPZzXL+20(ug%j}9V}}%B*G122(=Px zv>{&CJjKW@At9CvBn-*$exw}3$XZ*HzJ+to-3u%?m~Pwjq+5VQ)av)QaQAZRxS8`F zu2ZL2{ELg@cRH5{GZTh>D$L+Ian;==R5T`S>!WM_RF}_{9x)CV4+H|7FIvHsQgB_+ zcCY}W?F9viuUBSGwYE0yej)Mybh-yAam2I+7B!}3#^gJ*gFnAEn;6gda@yjxEw(X! z9$E!Dq@<*ns;`34(IHa7&CN|l=3PvTEK}sSN>!+!kJoy$!G|WL6<+b@y|Nio&5Hla*-(m1mN7*385Qs;N;&5=P0| zCim^|E~pq=gV|E4ZHJ1&HhdSv`Q2BClNqdyB7Xo!p(iEPhex50&jVzdN6T%2y%%<3 zhOZPBK78fYT<0uQo-ob8U;6xyQP{-tBal4E>-ZhNON2c4QZl~WR>}{<#|p72i-C|P zcV(=2NlcmD42hbGl=Od-N>;Z^_&-fR;Y&)|+tYIyBdm1@Z-*CQq|nWu>Z&boXar~8 zsjIXv@y}DFc!A$5C>?-W817g3J4(@P`Dd=0x;lAGOboyO$pNOMm}#LhUi|~GXji}U zfw$b4$nQIUTXVqKLO|=+R|HufKCl@1AI*NsynT<{QK;9 z^Zan}ovpCWF!)E|#C57bm_&EUizT$qm(2b5$zRy z$2vDmkyV0WV7&gDp$7m?X^TjWJXNz^nFkqbDY9RlHlFj46-CWiNwyM0)r|6jMA~3UmRXtU5zoE1S@8- zR2ZPWws?J4pj_x+m~(DPXsT~Heg@>Y6~jx)%Z28S=P4w5{|hKENr+DIs-h!VQ{NE8 z7Ztyq0{{g%UF;WY{T+JeT|o9$ptrN9`%@7>UMrWflLU&AEG8pC&De?t57x8Gv#nvF z+uc$P`Vm6K->jN;BejZ+=mo952Th&rRg^%&kb#;4BlBYNZ6z2HXB8B1VM=jWKt{*r z-?_zHHe0CL-YZ0#P1brjjabID0O_TM>L%Da)r+-D>ionLeCK9YKX->?YBX5ly=S8T zbNs!dVfR3P~$VA2lp1)qL z!C?Il1giKKfsS4P0x^ewkP0?+xd8}-DK3uJAo_Cp{ebCA1OXXryZLA zw_$&YVGiNI988xuF+}1&!w#h&7YJ+sC}$^!DeHfQp5|&HtdR1bsq3~7t5DPZEscYM zDo?gLXQ4>g*x{e2Pbf$uz~nTzoj1lSh5@I$Yg08~qssKPmZ=6LgMT$55I9t%5Q9TQ zu(Z&2x-#+l7JJ_XyJbMf0|goPjc<0aeu-vIPC*dh5){Re=Q z{{^7$|Iad!ajWbv{m)j)S7A|Z9#5T1GBMR3Pi(Ye6xd`2+sR(4@0_K&jFkW}=nE|g zTt>B(r|!T-kL`h}(4i?tpGhPtl@@B7|4%$u4K}}dYn~$E-~7CFmvBr7VDS49r4aaj zMf_j2?y(pd$Rf)XC2ExzH4{Vr#vu-%n*8DDFKE@BnzB9nL%h$><%bZc7OJjC<&!y* zySaNC_QO`4zz**d-+q6(hfQ+lEk+j$B%~pWW>tQAUSB0!4VzSDr|#(6C6fRhw4^J8 zX*B$1GRONrIK4AP=EJJw`1vB1Enbl<+=@O)NhEbty_=rWdU`!K-N|U3dj^?e7X!xiwU>GQ+1>k!X@^G z-;4qK1Gca1y!E>s=$uNDFn1N~)Da(JG*DGmhy<7KMFd2Yo}B~~1#}Ql1R*w*DpiVr2`VDetAL_ZbtnST+wWQL zkh04;d+*;ppZhuY-ZOth0yFRX&bO@ftYuO}40i4EcNuyYvA)9|i!vqq zqzIzh6}8V-p(6G{Pfcqc&i*WYm-V~XbUbU8x6t-$9UB4Zmds8{I)t`eU_O4yVvl4vMav@|ur|DEheSf*UG~8sbTxG+uT*p|AhF z{ko$j7hl={9-9MJ;LBySC1`fzbRA>6lI!Yupq<$6fNK(7vqb=<%r|Y?WQW9>2sxY% z5PheI$DQ%JZsOCk!1CvT?QcpfQn~s74wQ?)2cw~*3y4)S7@Xp6%E9n=eY=B&?Z*FS~+|Vs*~!9}WbH?SRj>9$(5CM^aDI z1R!8gRD6nftx{f}Lwj=7A?3i+8jek0Zj|%~&>Q_2p{k{)uYWjH%h3X3b_9!g%GS(yDX=1Aj!)_E}{Lkn9?hoxGd?idD#aqq%14-iXrq#Ax9tbKg99`xf>>X_LC<#)8$Qqm5$Y-x2Mbhcir72(EuEEv-{oQ6Ukb6Lw8$ zxGizL$!KulgO#f@1(YQHGuKbxDk&`LbL2e!h<~THG&@iH%=(D(75>lv zJaGPpyu`m12>+{O2VK$>VBHBa0@mFoB_;-GUcx2{icJ6{q-x)DIV7@vZi``*$Z}Uc^?Ar)ZR*?Mnpp1 z6;b-Rytr&p)zNo4X22J|gdlikhl{R>OcOq?Mx<7}c^-EUFu@2;T0VbHDt-BFt*e2% zK8#|suOp{DQ0SO7m$C#cEiHR8og5w@JKcr%Djj-$Szw{bsr}E)$c|wcyEB&wymu^Wc>2lZP9`DXZ;6&nPaA^v!T8PD^T_^bLY}2{>r6M-7k9 zHPVUE5k>Am7P*Mm1oDHV{lM(X<2b=UqS3!LNMKXIM3li&@dk{R53+Z%&GBWowJhDo zum#g{`jBW^GlmQ@lmoi@#`6K`cw^F^VYL6U1fzXy>tvRCGoFQS#c@)o*v=G~4U_g- zV&>2LWe+r*tL;CHti`UB%Xz1;pUtSCI z=7!_Bx5gs()VMLL%g2U1hei3Fre^`GaFyg_i8&Y=_!zI5i@7duep<){aX5%`sh8!0 zB@wu&^ybI83d1tkC)-(%?j6{JMgI9d)^Z^2S>BXzSbX35RI~k%;FfHpCe2`y;WR@# zT_nLzR=(*H8z0DR1PhQiR5#wEIzAWvLwh#}w*Y;U#q;OSU)-t@dk4Ds1O}n;AFZ#Q|F_;H&@dFKy&Qe;Yw@Yl`;k1Nf&KP9CKgvVEyYKZBf}dZU zo!yx={GDE^4)Tb{H{)h_jVt0-KZuvW86EZNk4;SMG!s7UwUsEwQPD+8DZv7cu4?mfMo74Ki zVf4qGdC@Nt59j*psJv)21M|A(!`c0lmg|C~Rx1QR(|L^K8Fr)USflCzkkBH1X-K;@ zV#DM+ou^O^3V^u+0+OL8c0K?P7OK*U86zdaihAdPH(nEIHz+UePb+{iI7rbdgy#JED3*n}H!9SAwYPB@*{acP(fD%Wu{`~wjF6C^|% zH;D~x->_lBqswc}4%8$awZ(*|+<&`LTH40FZAC=LmvIlex9-MXBW>0u&zT(gKJcpx z5R9MPym>EdcxXyDQXt`}G)?L>P4``Kl;1h%0VFA{Mxh++I?=@>Pom5frKB^Io{-Xt zK)a??8XF5PjG?1pNnZc*gBci0Z$NN1=^yCuGID?7;<4FdL+~D0LjvUgNc{EeR2!y5 z4!X7bXUFp>fDdFf2=0c1O?ag z{xxqU8}`6Pf5q!uR4I{2qlcIJw^NQ!7nH@J6YV&ZUIRho*i_u-!VN%?zLh9&74#0< zxB!{nBi)O0wz7i4XH{(lnmUIhuaYmEPWW*2BqPH|@hsLuwaWUn(PtL(uluhgUjBPc zjJz}SlnqF|oQ2qp27(ei*zH8d+Ws4vn($Fl8vq2yKKPrNI= z)F~$;^B9K`3zPC=@5vVjZLzf;gJiuDu><@35=x`-A+?|dQhOJ{o9!VrCbI2_WQ zO%KaR{?!GUgma)ANTMa|^5K`2-(#S<(NhSYF1|%64@eP2q4)#fY(!$)re4;r>FH%z zYeNvM%MhT8z+&2#X~{j-&*~0vnY9qJWPX>)TBd(&^4EcSG5nh!NQqF8TC_G-xXf)B zKB?1hKW=kj3zIo}yYnBD*!}tBfxkmXGW>G_;QAzZDFP;xU9kpkx$RPJ9o3oZ17W%L*_)Lt3rgY|pLIoa^aF{0MvPNa#mpLgmQLy%8j|uYA zvEdC_!yV@cBNOw};xdB3#{6YvU7avk_qsb>*rS)c6I|xd2rah)ZaHh?$}Ue;gT8vi#48%wiJd65g&pZgAqTMur5Lb zk2rMoJ6dUPOGD)C#l^3K?V;JZA%xCg%YqfHa5>#TL%1-$zSm&+kj< zhOfd(6R>*&e&Yjvw6Q{pVYU%uMUV1sd_(RnW<;O9D8IX_5iCnlKdt|#-!fYl zKm7;dfxnJ~@jkr%os{|i-pHSMy#Mpe`+xbEF7&wn%4rp({~@F)C%weMg9ix?VlfFW z+ZDwVq2(}EKG zkFELQ4y*76Xo)9SoD1+FALJLFKy=!E3Y_E(q={P!t}ZkkuBp0y{kk}bT3}G_ZQaNJ zboee5l)oj-DNHoNY~-8D$cEP5_d#j|9K-@}ZD$cPkRY?}M447sK%9$&X%2y8ygm>4 z{I!x(cb+8nWO4X6w%`E|)wNzW^F5k9I?_|rpL>u0K95N#GxGx|VB~{egAjV+3Lp;! zv8Zyo>63}8&D@3-gwRU-2g%2`LAKbj^!mjA)8nFW7^W6+@0D9Fn>DB+S~h$0>rW-6 zrC&;CkJ#-!{>v1qDM080uPI6#sEQX1487*1db`XCzcfosMF|c=_3;}oF;RDvL^Ohn z^ub=1IT%J#OG<_fJU^^b7GnmdeUR*Go&TE&J<=5IDaWr_Cl<&u{yP`>tn;-{A{AVQ z_6&^sNnR>aeFoXUSk*$C;G)8R+;(}*5`67KQ&JdadBJ3D=dwL|+Q?;qMt)4i0*KPj zEi`pmOOsTj)Uz!Fs`4(#taE|i8KQ_{sCpWEj}S68gQ9pGH4eIW`blMeEG5F1ih(sRgx^KH=0e|Y^%=rQ7h8X;TvJL3@FhQ}H*1KwoaESapJbM17? zl_M4wKnviB(#l*xkpjV-Td>+2phrcF$b%DA6el4~4JXzXpWAYJ16^5j@qlfFB02uE2vAvkgmXUnu6NsB56sZ8;up| zO5h;Dh^ZS~8DEF@f1W?|zW%fJFf7|{E!nkx5Mv^IMmjYf2>db0KWVXUK*bB(`a)vy z2+Roxfc}^dqDOmdDy`YY(Z(6FloLF2=CaahVySLu1-ImFFBk58M9>xL3EeK6WrD-ds6k&OkL zDZ?fYbsKFb3L(rr1^CoJn}Wz|e4J8~&}UOV-WDNcE}WZ?m#EW`EU(XTHIZnW@x74u zfe$)yO#`dN15F#&Kv7D`v>s)~M+e^040=MMWH3o!y37EuI=kYr+?iEqzYU7x++6xP z5`4ViM?!wu(*iPn@=1m)!Telk&R#fGy#PJLGB`g#{L$zf4=s#C<*g~h&^Dj>{6h=A0RCN zB&A?DNdP)1@&*2~;D0MJ5OtFK209ZBa06b|5qnIyx-F8h$9@#t!oNS>sd*mbc>T>Hv3T~yCMAcW4K_*T|oxA&kEo0A8 zwq`{wc=^R*V;{U4ktWa2r6>B#l9_M$Bgc;UBBKU3PTH;|gD{6``}tTl{o`K?s~DR@ zdTxANEvWLo+bbyeiF0eOH^q~JVucnFf4hks4gN|0h!iWrTm&*^1;H}5c@ja70LgE_ zf6~*B40PF+awJLeG4b>%Kn?gDA}MHj&ZC?_eKQe#a6_Ubg1On2NX#qg9Y6`6hnjh< z3W9G(p8W4+Sbdi%;0ORKjSamENXK1WoCvgdlSFW|$&B-6*}s zq#1Fnv(?D*oOz<`#}|%Ra0^{J!yhO~yGo1MKXZ96HfHm4>x24I(}_TA7KDt=WB6Fr zwUL*_1Y4(xoY+2s;sM_YtqF==nm!8uCi*v+zXlKH%Qw#ox`>8Qk=Neek7QZ&aBO{w zMMdPPcejG+i;&J|CONrP$T>=*m?Pm0FOuel6(+fnAiuu7&d7PM7 zA^=v|eX_+=`w6uwQu{~(Fany*k0QXEP?<^9TB0bJL2e2MdZwz1<*h+OpnA}2*2?!YpN$S5^^N;8bC^95m7*GP^gOZ zEk=!09WpN@X;V5+zJX5z6;c`tiFQen#GO4mS8@wN@bb#aCnO7@=O)n>NTeW_IdlI+ z;GjfgMVIM#uPOB6xYlBRtcsuhtVaJI*Mb4T>#sfQ>&e~!OoH9we2V``weO>z_Os6H zfykC5fVKdej@2nvFA|W+SV)B*zGO(}+?a4&Q$L^nTFL0&w3&3LpR|F;2;cWLbrQHX z9r$(O&J;g{XDV2-x!9XQes6vYjLyh-^xR2HljkE%%DZ?q5&XtW4YggZB}Hz1iF@J? zz<7lqK;lCc{Bcb&2Y(!@EFwYZwyUx+qr)T_MKItpYa(u16pnc1Ez(pd)5G@54VJNN z;A%>py}K)d)+MOWC#ZjJyy>s)O+if2(ut^U>R%|{+8qONAk|t62w-CAGMDG5=32qR7lucvZ2Y#`x{V0M&#oG*6YBht%Y z!-HXjwT2#WE(uKu{^gPw4Q}ZiM88W-H+9H?^Q-7AN`tfR9k$=n)Oy(GX?>B=){*+j z7o=}}G$15QELM*>LW&jrMNpt%+B{Fbbf}`tQ3EoT4$ngsa-KM4xts#l$sv^t3^1gjsFa>{aIWs3F*nH`v5DhP3yYGhENmS2s zD0Iw@jh8EBBuSk|sm3`=5gX8JDo%5l@|qHNWT~~~n=f77 zXnTOlGa)vla<8?A3qwx9f|C|FuYb+NI8Kh3oT^5}p<}%4u~iHjXRfy9-$mpnETE}E zX@T946YxQ|@?IO(4-JSFK_sPP06JXFPu zKi~PntQu;RR%efoh=1d?Glp z_)tb7vMWN{hv_zfG;J?$BV9h)eC|U^rH)YbD>WXVC^l%@0xIJ)C)p!aEqP^qRUWrI+cX?5e8efZ@y!?7-NzE?@0kiq%0 zj~87=Uk2}DUHY=~{-ACt&TpXLwTsG6NCw2nb3h-GP@0_82wdEGXfM~0sEJSnRhu)c zQuvSax6V{N-Q7eR5UdC)#tGaz4wLFRZ%D>{Y~+2x{W;QF^`_oH0+ zrCSDyPpkZBl8&)G#5?H|z=xQ5}+1|2@~x@MFN=rl<47^ zqDmX7zUXnQN`IQD59voIQk-_dXvvG7Zo0^Hi~%x_N5DZP za*zNgNk-)Qid?-2`fyqX;7A)0Q(z7YB$m7cgb<=(a! z7#LK#*4ET8sVMDXTtdxeZVvvr5XJSGOeJKLTop!aWjr+pB!3qSpbF9FR8*zvLzuo& zVB-B+tZ~|cXU-J4cG%0eyTe7m@maY;Rl!23!`JvHZRLwkKai&s5TM9Vd$<$A3n<0l z()ued;0<3b{o{S4EEEuE%=IfeI!@~wGA^uN6(Pg~EOTgW@NRvKz6n&q&$81xvRwwd z|L%{X2thDs(5pT@I?n&zTdZYm9jCgTH_)xWk^Vt zSZ=6)OXYZ=P{{#NNh%l5ey0_SS1oKHJ@(6y)Oy=J~GEQ zKcdnYYC+Hlmfx2kBQ1{e!xH{^)l@ZsDzEuYP2$X~xT%#-wx+klYm^16dtv%K&tmhqR&Lg8@kdrx#QIJ5Kva0VNORhM8tIaY++X6{8YB^J~hA;^Gz-77bVorw9#AMRi^4MLe0>%HN0f19Gca zbfnND{j?7mnWCk%Se{SJ=hrl!X!?N?w=+cUOg@aK|2!D7UzW$-0ISKVpf<$CPola- z$&X;0g5>WjRTTbk^X9K1zb#sd+jlzmoi8-II*9eiMG_5yDI{1Id8#&}0XR6}R-Q_HmT)!4?pZCK=2A?iSM{bE<10yg1 z^CIe}GIWG=W)z}eI*vgkf?N?bcR=Xi`@?LzDN6Xz;8Ggb@bwa*tYav0p$%aR)@k!* z^dE-}Lf?yo`U^`oH4s`RnFbX(L8Ngo+iyPZSh|dvm4y;7Cl8^4(;1;-sY`$snQRZ0 zgf+ThQ`#agu8ylg<&f;oq!u90#h}Q+>SUpSl8JiAi4$Oj4%3}VjSTu#5fG6r!CoJ> zy@W@Fgc|>Gq)$fv1Frv#ZHQ$r;1fo6ch1#NTmI@P$^|>h1@GCKUC1!jaVkETLo*En|St<)Nt6DGOZECGU zt30vCoEy=lz#DvF-@6|C`hw#0*TQ%%u-%Z=U-|8=OFfMN)LgpGnZgW=54(@sgee0v zljb?(2E~^c7gVhL@%B-)@K{Wfy3}{0IH^xnoJH~ebPYT=EfzE$GzA!70<&(u?Tu7D zP>qD(2BvsX#pM)%!Z!a_d@B4fH41SVgu1`JS%oO|)-ZP!DzVqVI-_<$$Yu{Q`GybD zKh4Vl6ZLn6%qH&CNX01@o~z2((HPS$)eosRL`7EB_m~I}zi#I-mfibX@BPwgOvv_v(!>IIpm~6lYzVi#F(j89OH0Bm=!`~30PEheSoL`TQ zRA*Mjri!Byq?A`gB_)i~%?yhA%&`#M;qiC;JZHHaN*gHIPLilYg&{8_i*|r7lFWqx zUM_?2psI`ds9YSJ)#V>Ha#NpbTv!5we*0UCNSZ!T52@Xs3HRAJ#EXMzCcg)-nkwoC z;OWt^3J4YutLk8JaFqGF6-0ihh5ccSI}t>5jn`!KAIW&)Z1cK4Amcmng)6@FIa7J- zj?vDfGfq*y7dEdj2}-||5|LD6zvfZxwVeugoOsIW$-B>r>N;-SEaI?AQg}&+?F!C3 ziT=%Ba+=oFtDbM08(^iFXXxCn+~2zXiJ;lRqQlBPa{iK*1@&XGGWxf6=7B>BCRGln z6mg-;P+6Gv{bMiJA+#Mq=Z*rP?VzoCzFVa&+Bg5)U2NxkdP zbHoL0FAAxEg^Dr3(!KT)Y-Jy<&vNygBX*5?+SOVmYGt7?j$tewZh!RY@ZIL+X17LhG8#xB! z;0O&Hgcwc{Na5ywT6^+zc&m%rZ(mGPZ5)Q>Il;^au!%2Vq}M@$NkJx@k#%W|(S6LFs&v-C z0rIKT+F^yaxUzHKb1Eoy3W6C?6T0Drp$@-WW5ueAGtH)YR;oNjXmb%H?s`Du)|I&n z)GyAGt6M{*&-sU8vy0n468zktdo}aZ6WlgT%oPwHSv{ehH^D@#@NQUoUsTztDWiV$ z80oE{D@uMP0Si&QZi6$R}c%JQ(xGzm+1#zKl~m| zvD(W}&03g8pIO4((j`Pzj1^ZLYn(wW$O~w{-WwD7yn&hRhwo1rt-=4{rN$Zf^f(uU zN(-FAGcfe)QHG3i;EjZYbNb+H%;AgQRmYoAEti5GE}~`>!HmUPYXz2+w>T+L+^|tv zu#9a63~uclEKa2wx*4Ve--3@1rp|?6?`@Tz(E!dWBX3wd&wA*~Vk#6N^&8!eiYjL- zybag&nj7cjy0Q(Nf2M7a&iRZ-6b}ae_0w=16s9v#^tWPOQ!1wnm*#a1p9#lu%n zv98rmH|3S?bf&dxcuiJ_75A9|T27WN^NHKNlEcM!s*1i%-ZKplb{!g!1h-?pJt`w4 z`e>yjZNnGrc$MkQHAkaZEkRYVZEQ}MimS!WA}Wp~(vD+??N(tfMsL?%9m7mTGi^m` zyTm??LYu1_2?p%nJSC+y>G_qfd_QM@B|)}F%rGZgInRjRZvj~S!>t> z%nH(TDV8P=xz4@W$7cZ1TKmQ=c`fmi8Upj&1^z09O-+qOldB z3J#GLBBYoi*%;~X2ca5ojVy#ER+CS<#MrOExB|Dy8#%;`ofndm3L9-Zylb916;`q_ z7St3JV{!TV@@^`RM80%90A*_W4&zkwNXs_Kre1~0^sx7O$K*lFX4cd~WgMA8QxmL_ z$zKFs%pN|8(l4dn@?EEqj76!bg-3+>lgb0(hF4~qeh_v$Fh zaCa_fa~Gex8za>E)Ew(0jM#75sFA@kzxJ0Ijx^;CHMACD zjFkCnAqb;ugBDS<`p;c|O0m@lS{4me=jyHuKq*I3;4R$qq1Rhx3?uR0h3X}5NgWt| ztC%r=yD{r-ufL!6-Wa3J+HiKl4bPqQ0k!NQ04C@xehXSd4i_Td%CyKQr{(0Z;A_hT z`SAU)DceM8jLV``!-T~MBpvt(A=yQ0td&u?W>l{1k zF#b+KbW@*F=1DG}?3Kd*(aYog7feP9KVJHgML-p=aQ3GUnIFJ_En)q}Q=OgND-|xU zjNoq0aI&3u{8vtOR0{Kpbc^J z94;lR308(iVW5uGx-g*sNICfWAmph!ma2BbijzF46>VdlpQ2 z8}Gf~A)bCHNdw^Fu>0^~Ii8RnF_E3OIau%Hi!_ zGOJCCwpTMmVuMeM&^zx61x{f2S_}&m@xP2=Dl{y>)E6(9xMwNA5Ve3T0@r(O>#YPm z`;Q$jGoI<2cilf`7ARJQxcF$Bq#8J2-PHYdH^SLS^5?@#Z5v%)Wf6a20Tc+LE*L z78qIWXtluKYNVL8U3>@njQEoF{J_=uL~jDiu{pDqKNhzvN1))L`}?}KMg}JT-u|3! z()^Q#UiO8#|B3hID^R1KPjLY`3yS=?q;`9&?v%dx|6x7Y)X~#`3fhSqVeBZ%P>7-c#eU z+X!o3K>T74Z9@~PDvQv_Y(1<$<>j{_66i)gg^JFL5R&nX;e^$$w#zld)yOio;$9(qSeP;rsmGc zT6hZ8D5yZN+UhC#EqUjP(htqIe0#GY@c46h<$ zCW#I^521SC`ofK7F)i-^uVnHu)<+U2-bIlZ`9eT z?D>Xo+n}J(L~hxu2_-K&T&m|GVrUotJy#ePIeYVpp_>(3q^ z4MDE}{>60P0kG6W{)=nYV@?QU0cil_Ts9T@P*x3a-#xi8|;?Ft*{ME|XKW zN$ikhStSMP#fF$(CCEo8T85P9lId7?5TK9_zCflh&Xt)JRE25vaH1n5ggQ`XldaR= z@lq($7}@`(8ZFbPJX?>3JRoI{c_d&e)#L(w^bV1Xm$V6KiLL48;95l@O$K)%e3P& z9MHF-6^Q~4*M(TMTh%7g&`(V9o;>ezQPBv{A3Cr)UWw!8!<0W?)J_}e{= z@=gc^+Y|Wj@>rnFs{0jk%+=^&^b{(tGVnNi(Rd_ld?73NmxntXD>8m8wX}54wQfH} zzVFE5Pam#+`X8?S0-3*B`zd72=(YM1EA=Nj;s9L)0!b+nuvLN@)6>$8?sds@>Ww@= zfdgJ@mc>9W7rr)3T29ZDYTL+V15VhISy9kuAPq)OcJgZlBPgzBWB1en^>Vmq#i&YU zVej|O=U=E;aJmPNI$aZPSdX@(>^uO_9Q2`yEF{QAub2Q_p`NNXs5*Rss^6>0DtPCo57pKSZhRk$M~q%FZj+y% zy_#i7g70UW<|rpUvxaE#gV&f#rNQB5v^Y5C$#}vmnre7bdR_XFk4Ln+(Jrf!vA-&w z{{w~py96u$y<-5QGt~2FsfO>iY`0PL?g|2j_Z8uiF|^glc=ab@%}{F6@fjcJ^r!KU zI^&m!3!$VvQs*I*sh~_Tb*gL{hsQVS{1UtVD~4wazcrUt^#Vt`U80Uu96M+vn*ivF zkU8kVf;|MuMLznQ+o7ty6#yW{{ub7Bk^|9B9)UWny&A|EKLslu${s{{&t z#IH)phN60f_jQIgouKbxGywRE^$Jjs{ALXKlJd9JB;ez4QIT~RX+TgT!?}g3e7Xil zkmQVl1955FTVVa-`XJ*~ziV_=SB|dBhSuwW+fPZ~BzNrhudK~|4}$c_yZ0rv6+ERh ziQagy&Ql&b5Gmj}yedoVr~}47({otM`Wk@Y%bN-+9ig=t#M+ACg}t%+dI^tW)*@aV zOj?X9&UM8Imv7bVXpfA!C2DEke@|+XvE(Y#sZl%cmdAgIuYDwhh}Q7l57S>OysL~c z${9sJ1zClY&F!mHW7n=S73GPoMkgLRcR?0tkeG?~8r^D%QGdiQrT)}y~;_gq)X#-E}e5wU%f|v z_f;ACr~F$@1O16_i)@u_T^NopxnUMTDT{Z2b^cdd5s1j7XCgPE6@1vZx9vrbndSG% z2mk7>dYv*Y2}Qj-c%rgL$&iL4< zP}VdApd26HP}G-m&4Ia3++B@v2@d6t%NMMw5+b14rzx+acnHGUE70n2&8d}oU^?FU zT8v3(8cxHC^Z^r=H?8xU8}PfHdtrCA*;~yb2~a^=Hp1k3)FH>dp;oJ z!)eTRSZ#W1x%c%~>KD+ZQaKGVS2x0QI_Yrmk)+B+#6|1thhOz4pwCcc21)LYgfsU_ z`}86Hhh7qI819pP{Kr)CpCH1&0hJ75{xh4nvZn}A&hb8*@jxoz2h`QUFV>&>@S2g| zp$DgK-#7WXQN6vS(MKSek0Zx|k%e0afe&FO+8-gJ!&94 zx;$X(tv9k5!{9crz@OzStI)y1u0(y|!MM!6XDERUDGXJNa33EV{B>d0g&jAxG=u7h ztI0ZIV3Ch5mfM^MT=&JRWHua)hx^4^uff|B;dOZa^}71@sabp6#j-*hjjYC@*_fV2^1! zM>R#%6V0Ha>g(2lB-tSoi*K?uli%6go#MK>;&#xjnveG?matkj-PQ>+InntF&qyk^ zk?(RofMu9Z`N)em7i~PgkBVnxUgbjZ>CINZwQ~imaF(A{_WQ^v!Lg;L7(q+dualIL zO-!N24D*I?>UxP}6Ow*E?{|HP6W1&qgp>9bbP4zQNkKT~X__#C1651E3ff~I9S27? zZ*-`46?Yz0L{O^KB0y(`KCf2>Ef_sbA5y|G%4G!9p3tko8bq1d8>KG7>)uaAzm0Q{ zPi4G0Oy_IqnkI%cmIc3czB^@9s^WGw7IpIOt0q{~IeK2K%X16{Un)S}IKP~7z1fce4fJ~l@5Z&5nAtq& z+ERjy?RBI_AHzl(_0APA3~bqBI^H@y5+=?m0Y+)S7B$WFKB|SwKn_sxg38Oe=GbFJ zP!;RRAHwd8dcVa@~W_S!SJnPjiXXLZ3{V z{T%A0@@_#G(223x(r*KX!CBTbRaUW-6|%? zb+I{E4eJmV`-QqU=N6~Ss;-0pmvb zBgVmIu4u=W^=1t7*$v4;Gr9t5!5EQmJ<(nx1L98K4YIUDm}X1cc}crrDF|AkW!!oW zHQ6VQl#X&C6m*EZCafJvA>=68v+SxBm-^^fp5Bn8Uf6Y1>tkm5U)+K$%IaY&4I{Or zH7zUj3ah3(+(1o?az=e*YY2`?tw_S=CO*=qzXVmhTk6jy9vEX2>*(Ja(QM({+iOdR zAC5MsQ;fUey0nyY9 zY+Z;-o{KQzb_H{Ol+Bk{i8-4UWLVs}(|X9r;u}*~wu47wYMu?Ivo24Cy!J?Hc0=$; zR3h-VOr5E}WZV4VI~60aMDb|mgyUE)QRx#0EoVpAP~-2fXt_NWZ0SSl@-$es(i<9c zI#*h4!mPy{Ipg0%B4S$q?l@Ma2$dqCL|P*VAZ;7B38~+wBn4eoq?KP85_geGDBRFi zJ+|9l1ds9*Fgt*>o<6O&tnJ}-um7#rHH=EJ%aUT<{^ePa$(`LRWnSjy7MMnj?o!3m z3ie>4mGq4rbQ!tiAbL*Kw#jTaDu{oALhws;;w0E=G?~^Zh2V~0L-ZaxXH)Oi+4@ugnM9NoILp0=1ilN2m=%Wp_ zl#Dc2FG}8YsehAw*zjIxG{-Kk1-D9yx|}dXrG3ka_?LtlW-&TbQ^J;dd**|rzk)j| z(hSSi9JxWK7n8Io0R@%^(dbMb%@aw;C!@NkhW(#@ooJWS;n=B&X5be%Dg$5k$ruc* z>Z9}M(1X3ntW}4r;ySe9w3}fpyg`&5EO#r;?AW$r-V3-7B4%|>R{mHSS83UXTuMG= ztNYq(Tj_v^jFTqc)^b};%_c=(&M1JeeR3n&%xH9v;c%hO`Z=$s%ntS@9l>J{UX_>NYy=TPlmKHj1gL1|+%&_d#iQ zQn&8ByIaL>7^P%&YuqpdI#3Ef{Qi@w4v!-{f*a+n$ib%8!_ZXtM(tiXtLPx{WxrV( z6xT{}s5Ha;p~s{s5jnIQ@f=3O0jutjBO>j{|F?p0aSpE!f<1+rPn3y_S#oNs9N*Ew}NV*lN%WzBEp8vE)#73 zAuy_vXZe`-nn)RF0pm{ALD4GIVT1FVEtBTdNc}^+C}Xj{l{Y2Y9F5D=v5bJ4#)nMD zqxL`{<&`46H}zgMGLL{unDBF;F5MQgZzW3F=c7X1|r)H8U?7cS%&urX0 z0@^}~h=~OpZzz@LQP#&B*|R9BSviNsyWwxqKj`AkYS6*wAQUMdICAtD0v?i5m)y6h z_e_?7DxFTqippHQ=U(_?-^(o&B0f2CAwLdNHQ3$!7{`)h@FKKBy{U5OF$DOAs4Gf5 z1tIG>Qbg|eMc2jTCmNdeQO!e!$Qs2XAt!r&G3rHV_?b`zS!hE#Dpsr}7gFcSnHt;d zozP~*n@%5ibCMA!In%*2Vl{nOkuGoJ3%gb<{acK>bB0s3gCy%v0QJk29ho+mi+(Ka z-sqrvJiyQLeO@!+VhAGLlZTlV0flD$nsY{Z*#< zBnS>y<{4N0-7{L_8Cw-S3~mt%NrA~aG$yn{dxm$I2of4mGigdW6O3^Prn-KkGQ`7Gaj+ z%XEjRh8-n(8zoF@vYWB6bo2}yI?c2~#Tta-o`TeV(;=9$M0RDllhxXhB@6$Q zPL=W;9>)P6B~7_Rzn+HQQdtKnG^?DevVdiw0l|R8Jy0Kqpb_J6QB0GP=SQb*1Tp0u zl+_F_r_9dycVaVG$xB%{Xa<05u%;?2kbN2%%x>be#D*_JAkm7rT9Zq?rQTJ=nQB=g z#pE&nV?1lS;^cj-L?ru2Nbr987 z_)<|rPAcE1Q+A0?m3bMpeyBa(x@TsT#tC1N-C(hg~W5D zq_7S&GYBOWdDu{SgdLuR05Nna+LT13Mks?+UrbG4Db;LD;}?GPWBkw_R-_J1lO2HA zA&4zCxg)@|M(wFo`h){+bh=dwP69XpdIVF$1_Eq!w5>TBFPx^XXAq$rL=6pb{3PX} zAS7A!vhE^iC}*pVd?57+j=3nLmU*=IuE4gC`#b)%>QITF9h3!Cx3*whg0-1(8DhqT zr1R9oot=ke6^hY`wyX2bKV%Kf`K+MYA({`W6{538NeItWJb^k$tk5%RMkOC*@VkGK zc3A={JC790E%M<3l-;K~VyNY*u81o5sL?0+iQ8y2N9dLyFcaa~q0KI#g8~ytJepR7 zUq$ZZ?XI-YuFUTgHGw&g1se3Tat9l{4pIzu9`%!NI<1JH1O{jw=e^xvG}W?0)uV+| z$?T}|10+S1aK8=6O9Lod2C``6$UZiwba)WUh z7B+PxQArrZCdh}c2&9$>q-cjX&uK?Arp+bNN=E4~x<)0@oj@+6;6$}e_On`$UJ2kL zB{?+eZ4O|7?;YaLyJdxq{A8A4%*pneX0+ibB$~LZF}Iae{!CWK00K-{U{yAUPJXf? z4Y(g{Xuln3JglOQ!D?3ollNsG%NTQ9Mg&k#q;1Ue6YE*SQt-690RjormLMa2fw&t9&Wp9;n5vODDS5 z&Q-4#kD?3pYC0Gc>))Sf5e|)p``hka(wQH3ZrbI73g+mOg|x|Hcm~L>aM?IpesB9_ z(v~IH(%}{CJi-Q*BrhwrduKK&T!Fc`hOq5s1&8;S08+QrgQ_#Y$yD4XG?f@EuAZ-| zqvviAO?D7v0H!=AQmwMZHoS|nN5UZPWGx+$$QBzBe@$4)unI`O15NwTP#qv{Wi9cr0cso;Y;4N+}29f3xbZltS4OHY-=%4E_9 za_A6dMZiaQiXVujLg4fa2jzx9fxiloPnU&QJt`V#wn35=A)rcxFuVn6$EUzRR}nWH zMznYusZM*GI(~?nU6e|ay}4`EUfb37$HDM#g$T<flCy?VJEp@ZfDk{x^s!RtpCW0dHqH6g+li|77L0b2%(XbyRD-s%0 zLb{_OYnZ%kA$YtiU}Dx%G)ek7z*ou^4N|w{y)ZLkr*nIQhd}ULftNdswW0&TH5GnP zwY@xiNDtCJa(e}%*3zMEByOX#7l^!~OW_=YC7{d-ptin940ak?fv$IWzgufPo^I8R zKb{W52Y&^6p O9Chu@vET0d%l`)%l49ck literal 230924 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

    LPF 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 z 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 diff --git a/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-2-1.pdf b/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-2-1.pdf index dd22b4cddde0d88a8c64055a9cb4ff35fb9dd6c0..a13c721171a5371848e9d6dd78b43bf3db1db6be 100644 GIT binary patch delta 2880 zcmZuwc{mj89wiZzvai`iF(ZRnjF7A&vSuGDWE;y^Dr=J^#8_&SJx$gyD9XNM?UJ3r zXC2Be$ru^pe)oR=+^4zkU+;6?bI$Mgob$Z@(y!F7if6>8Si!kt_g8F!5q7BBz6Vnk z_XK4X^s<=6vq1XQ@vM^9+gLMVTCbVb6Arc4shpmV%a(Jf?>3f*`$V<e{J%lFNY-lr2 ziZFXAuSP1dtY2MP$_q(TPpq)Ywl>;!T4*=Y6u)xqnP%AH&fd-o;C!>{95Ip} z1D@mL5BkE-`-B6%vIC3UD@VuYjY5BIH-7W^CTEF7qlx7O^?P;`w#4K+d!A{ismgLM zm0WqUAn{fv(6&4&-~Cw3^w9DKv7_MD&$_>q*GL_luL_VbyJlcY&^)T}ycL=pD*d&gA#E5Z`0R^5 z=S@gWj8CdDh}9WupQ@yA3@jUAgmb4JoC5!TL-+*C6`B3|)dsBrR*iXQ5D zvGHDc8q{HFc_yQFs=y#|`pfyP7UXBA7OYkq_*gH@w9ngGG~aeM0BSZ@W-o}&%=F?} zD>p1Qv3}yg)GG|SG{W+I%Dyoj;-5$4evVP7NLL1T8QIvP3`=znt)E+XnJ09kU%7`0 z37?71Sw%IIpTQI}HS1EXjaKjU^|PYLuCs)V5Ay!-BmnLX2&1v=CF)eA8GI`Yo7hHx zI#>ckQeiimGuowN1)hmEue>e5Fea|YngO&(H#~>uOd51k4BDDpg7*CjQP-ST6#oSRusnTMQDz<;su;Iv5sEuj$LhqEW+se!C)pUT9zcH=pd z?Cd$DwaYg^)l}cnzK?<^tMYQJU~%F%v^g`2buOa5T&oeDRQl|>khA?|K@1@ie1V+F zohg-OJmJV>)%h)@W^<ZSB+fd@o)} zrge{}3YjWV8&72;o%1p@HKdX-F!l@3i{vSPqa+qLYF5r>BDVy$vTmp zk*2pe*M~MPb~f3Rq)|`>0yQxM0WAzanH>ilIV;lA%+3-80J$P>L{HhO6|RM{;5v}h zwOou`g-iB!e;;AN&{ivBq>EL(jw&ns_AvoH6Fw{+V!hfFU&O=N5A+GZry?RkU!U#d z3@!btAR8oe1J{n_=g}h$eY~5brl8#r9~49l?(1Qe#alFliDEM`3K`VD#sG8cbowBhG~+M=BOElB zj-B?}X}f+<*Hshl^Y`EJc$0CQ-yG-T42)rya!V+3(1K)4wU3OIUlhib_GvQFM64U( z74CiFqA4TO)3xSn%NjhIwCtjwt%u2a<$_-*-+d;hMDqei%a(%MK8b6#Ak}>Mso}=* zEnKBBUs*?S`K!S{D0Q^t)9Dn-3R4Xe_TysfBCU8SZ%uJ8n^H-k94`5prqnjdOpDDP z_xPNcm~iB^9_@&?Y8>qJAC7L^og7-R3BTwughU*>J+ihO;OmGu;X6m7%;UNfcB}crjC+1QB-O)eEo2vc``LW0+-S>tGv^sS@+aLN-hSg?scUx`(3BIt73xewGwki#BqERy@P z&&=%CMvP6`h|CReTr++B)U@5D|F^H+@NU@t!P>$0_Q`6`qZRc~-=JUp&8thB%9K07 zir?JNnG|mSUC6ByM7rlqA6aITF4Sfd5{=aF{ZL9)rT@FgO%SkHP;B z4*~y^2L{9b(c&E>C79rF1pbkv>^-RJpFFrKluiqSsL;)YDJ#=yp{h^>ogYLM|4fnx zi=cZ^Q39*{$yR|V(@j!=L+CbAK`7DrLBMdj6d@4Rf6~7FKXF4~s&s}>rN0aLqZTNH dz7{AHPFJ6*5?l#SlhS8XRt3n&=$YyR{tW~`BF+E+ delta 2891 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 DqE8lq diff --git a/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-4-3.pdf b/_freeze/units/unit9-sim/figure-pdf/unnamed-chunk-4-3.pdf index 9d979e94952e1f0ac6d32627c607998696759a41..98efcd585820933011fb3be3b459bb1935f389cc 100644 GIT binary patch delta 6058 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 delta 6098 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%0A?W(XZ$!U2v3WHT@az67-DB7^TE& zN-yW_-hNFYexU{PD2i9hH>Hzn(V=MFPZubvF}v$%lXr&}&gx$H#E&CSw@HCoG{ zuR#QG`jQ$O!cFO%SIuJrKj-PxDo`(oiL|R;-=0wIYik-+5&^SN*`1(R@>u!WE~xr5 zJY&>Xq~KQ-cu=W}4m967oJ*H%Mj-QkkkD#3{Ty`Dr%!>Jj~9=+ZD|Y@F4*X+y%Q^u zZTj!awE%E_}NMR;MKUJ$Q_yy0XcX6 z-35HMA?^ZGO{~die8b56VOV=28OPX0KW4F|!-m$C;c%3vstEU_M{snjG)#nF7IpP? z60iV2(B=y_V^onq%LST)bW*rPhW-5GE^`B+WGH^bo_kILtV?e2%`)4?Y{KLc_x7IY z+(Ek$_3~BA5jL%1#9U|YtS|y0qXmC?8R+YSO1#tJcp>w#pREao{rP$7k_oSMIrXgSS@r`k3V_I#*L5p)EVV>cr{>j4&h%8htk?7 zr-)wELd{K4xNk=yGb5*xM>bo)F+%xhcs{x;y#mq2J*g^@>Po; z^3&hVL)q)Q=|<)YGldj2@lT^JniJrQboh&oGE^gF-wK8es&!^}2R!b~ZTSlVKU8G= zEDrTkT_>=s3h*8GE=?HngAJ*ydbO>Wk-`Ko4nH97xtcO5m|lML_b)BY)v0GO7)_~N z#!>(>K%EO;wziQ!jsem4^xgCcK6Ap0cPBjVPzE|ro~^OC=|{2~A3Wb+&`O6N)I6*} z*;}+I+~JE#nTBm%r z0O}CnLhb`$n=2qZT;$^wUthV0j!dEFTd;1zVw8`4(vaVN*LrdNb*E&nxrfmJCE?X> z+>8wE-SoG@7yDU8lMFiPpa(~X$WFYvc673K+4S|-tTQ2r!p961+|t?ZwaZ{Ru~xol zSF}s!d51E4e(WS7oBaCxrY50t<%L%l80Q2_Px@F?3gArDDZc&J#g!dqWPCM0PyFoi zz`RCa8io73#wm#Lp@W}v0Q;IORtCupcq4xp^`=fuB|{@*i`8LslO0e=YzIAI!M^N> zn7Mb?Ii&1(i64`j`g(xfxt_myhpv))r#|ugNVc1Wtyk8Mz;Ba}$2t_Lem*m4;`H}f zlp#UDFS0mj*<^2bc%^fNTJ${^Wce$hVI;3}fHQRQNe>QX-tPseFuD*b;-=${XVur5 z^Pe!X3$x-xnb3*+^)uMLq*cd(a}ByS`=mRv+x-AV!vtqb^DLjj^CS`YDtX(0>U}aw z&E}!NAs@jbx!Y`>BJECnI>tXI)*S5%(gGRbvxX;1&Cs>PeQ1>RvNvW|O)WIU;^q6w z1-vbd9h=){+$kxZ>DE0@MyzsfJ=>VY+p3?by~TfUPnyd8V)?}>%IwMv+i}SL`9SIF z>%OR!5{r9Bo)6tOJWOk&*2|BnP==SC!Vy0cjq?{6Id({E02i(}$5EmEIQzZ=sjHO1 z!uvjZ#~KL`L5B1APOl+Cns;c_ftg&}#jtxy5RG^xnw+m-Pp{aWvAYARuk( zIXwxEIHaC{p^_UPEG`ZPr8Y@v+CxC19KgRH4mS>xe_lXhVj!uTm^kPLCN2)ViAnrF zJSlLhle9FBBsjH1nimea!4L(Cga32_ONxo#z(l2PXvILlKY2iL3E-c8Kyk_cR15!a zt3Yuni9g#1LO>viKZ1b}F{zuF_sV zl@$B8_#aFhc%x`ZNzofTDWJrk>jRVmgW)&EB_%F;qdO@G%v$;(teYJp~X*Qu0PH7<6MYATh|lml)=0m8vEy QMItE*B;nyv(NQJ&KUCKB5C8xG diff --git a/units/unit9-sim_files/figure-html/unnamed-chunk-11-1.png b/units/unit9-sim_files/figure-html/unnamed-chunk-11-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0fdcae23311954dc32f21b40f3da2722aac5ff2f GIT binary patch literal 30386 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 z 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 kv2^blz<+VASlw{x$1Gl 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