Graduate Quantitative Economics and Datascience
This section uses the following packages:
A = np.array([[3, 1],
[1, 2]])
# A_eigs = np.real(eigvals(A)) # symmetric matrices have real eigenvalues
A_eigs = eigvalsh(A) # specialized for symmetric/hermitian matrices
print(A_eigs)
is_positive_definite = np.all(A_eigs > 0)
is_positive_semi_definite = np.all(A_eigs >= 0) # or eigvals(A) >= -eps
print(f"pos-def? {is_positive_definite}")
print(f"pos-semi-def? {is_positive_semi_definite}")[1.38196601 3.61803399]
pos-def? True
pos-semi-def? True
A = np.array([[3, -0.1],
[-0.1, 2]])
# A_eigs = np.real(eigvals(A)) # symmetric matrices have real eigenvalues
A_eigs = eigvalsh(A) # specialized for symmetric/hermitian matrices
print(A_eigs)
is_positive_definite = np.all(A_eigs > 0)
is_positive_semi_definite = np.all(A_eigs >= 0) # or eigvals(A) >= -eps
print(f"pos-def? {is_positive_definite}")
print(f"pos-semi-def? {is_positive_semi_definite}")[1.99009805 3.00990195]
pos-def? True
pos-semi-def? True
[0. 1.]
pos-def? False
pos-semi-def? True
[-3.00990195 -1.99009805]
neg-def? True, neg-semi-def? True
[-2. 0.]
neg-def? False, neg-semi-def? True
eigs(A) = [-6.1925824 -0.8074176]
neg-def? True


eigs(A) = [-6.16227766 0.16227766]

Given a matrix \(X \in {\mathbb{R}}^{N \times M}\) and a vector \(y \in {\mathbb{R}}^N\), we want to find \(\beta \in {\mathbb{R}}^M\) such that
\[ \begin{aligned} \min_{\beta} &||y - X \beta||^2, \text{ that is,}\\ \min_{\beta} &\sum_{n=1}^N (y_n - X_n \cdot \beta)^2 \end{aligned} \]
Where \(X_n\) is n’th row. Take FOCS and rearrange to get
\[ (X^{\top} X) \beta = X^{\top} y \]
The \(X\) is often referred to as the “design matrix” and \(X^{\top} X\) as the Gram matrix of the features (columns)
Can form \(A = X^{\top} X\) and \(b = X^{\top} y\) and solve \(A \beta = b\).
\[ \beta = (X^{\top} X)^{-1} X^{\top} y \]
lstsq better algorithms (more numerically stable, same “order”, possibly slightly slower)statsmodels (integrates with pandas and seaborn)
beta =
[-0.17266826 1.22602257 -0.73797988 -0.32714896 -1.36081746]
beta_hat =
[-0.17887678 1.22613055 -0.73570461 -0.32520049 -1.36056856]
Or we can solve it directly. Provide matrix structure (so it can use a Cholesky)
beta =
[-0.17266826 1.22602257 -0.73797988 -0.32714896 -1.36081746]
beta_hat =
[-0.17887678 1.22613055 -0.73570461 -0.32520049 -1.36056856]
cond(X) = 53.097391448540385, cond(X'*X)=2819.332978639814, cond(X_col'*X_col)=1.1014450683078442e+16
lstsq Solves it? Careful on Interpretation!solve(X.T@X, y)lstsq methods?beta_hat_col = [0.99857143 1.99714286]
rank=1, cols=2, norm(X_col @ beta_hat - y)=0.13887301496588172
lstsq is giving\[ \min_{\beta} ||\beta||_2^2 \,\text{s.t.}\,X \beta = y \]
eigenvalues of A: [2.+0.j 0.+0.j]

eigenvalues of A: [2.00001e+00+0.j 1.00000e-05+0.j]

lstsq will return some solution even if not full rank.