NOTES ON AI

# Linear Algebra Basics

## Useful terms and ideas

**diagonal matrix**: Matrix with zero values except on the diagonal.**change of basis matrix**: Taking the product of this matrix provides a new basis, which is helpful to us if that basis transformation sets us up for an operation that requires the matrix to be in a particular form. For instance, a change of basis matrix could diagonalize the matrix, such as the choice of the orthogonal matrix as the change of basis matrix in PCA.**eigen values**: These are the lambda values that satisfy the following equation where A is our input data, and x is the eigenvector: $A x = \lambda x$.**eigen vectors (characteristic vector)**: In a linear transformation, $L(x)$, then $x$ is an eigenvalue of $L()$ if $L(x)$ is a scalar multiple of $x$.**matrix transformations**include*reflection*,*orthogonal projection*,*rotation*,*compression*, and*shearing*.- Because they are so useful, you can choose your eigenvectors as your basis (eigenbasis), provided they span your space
- In 1751, Leonhard Euler proved that any body has a principal axis of rotation.

## Scipy example

We are entering three pies into the bakeoff, and want to make sure we win.
We’ve tried a lot of different ingredients, but ultimatley have found that taste
comes down to **butter**, **salt**, **sugar**, and **grandma’s secret spice blend**.

```
import scipy.linalg as la
import numpy as np
```

```
w = 1 #tbl_of_butter
x = 1 #dash_of_salt
y = 1 #spoonful_of_sugar
z = 1 #undisclosed_measurement_of_spice
pie1 = 3*w + 5*x + 30*y + 10*z
pie2 = 2*w + 3*x + 40*y + 15*z
pie3 = 4*w + 2*x + 10*y + 30*z
pie4 = 10*w + 2*x + 10*y + 30*z
```

```
A = np.array([[3,5,30,10],[2,3,40,15],[4,2,10,30], [10,2,10,30]])
```

```
A
```

```
array([[ 3, 5, 30, 10],
[ 2, 3, 40, 15],
[ 4, 2, 10, 30],
[10, 2, 10, 30]])
```

```
inv = la.inv(A)
```

```
array([[ 4.20539024e-19, 3.48136945e-18, -1.66666667e-01,
1.66666667e-01],
[ 3.55932203e-01, -2.71186441e-01, 1.15819209e-01,
-9.88700565e-02],
[-2.03389831e-02, 4.40677966e-02, -2.09039548e-02,
5.64971751e-03],
[-1.69491525e-02, 3.38983051e-03, 5.48022599e-02,
-1.75141243e-02]])
```

## TEST

```
A = np.array([[2, 3, -1], [1, -1, 0], [0, 5, 2], [3, 2, 1]])
```

```
A
```

```
array([[ 2, 3, -1],
[ 1, -1, 0],
[ 0, 5, 2],
[ 3, 2, 1]])
```

```
test1 = np.array([2, 3, -7, 3])
test2 = np.array([0, 0, 0, 0])
test3 = np.array([1, 1, 1, 1])
```

```
x1 = la.lstsq(A, test1)
```

```
orth = la.orth(A)
```

```
r = np.ptp(A,axis=1)
```

```
r
```

```
array([4, 2, 5, 2])
```