# 01.向量基础运算
[toc]{type: "ol", level: [2, 3, 4, 5]}
### 向量概念
::: tip
向量是一维数组,由n个数构成
几何意义:**空间中的点 (x, y, z)**{style="color:goldenrod"}
物理意义:矢量 例如:速度、力
向量的分量:维度
R^n^: n维向量集合的全体 n维欧式空间
:::
### 向量分类
#### 行向量
按照行将向量排开
#### 列向量
按照列将向量排开
#### 转置T
将行列向量进行转换
编程语言默认将向量存储为行向量
单行:要使用reshape命令更改, 不可使用T
多行:不可使用reshape命令更改, 要使用T
### 向量运算
#### 加法
```python
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a)
print(b)
c = a + b
print(c)
```

#### 减法
```python
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 行数未知,改为1列
aa = a.reshape(-1, 1)
bb= b.reshape(-1, 1)
print(aa)
print(bb)
cc = aa - bb
print(cc)
```

#### 乘法
```python
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
x = a * 12
y = a * b
print(x)
print(y)
```
::: details result
\[12 24 36]
\[ 4 10 18]
:::
#### 除法
```python
import numpy as np
a = np.array([1, 2, 3])
x = a / 2
print(x)
```
::: details result
\[0.5 1 1.5]
:::
#### 内积
两个向量的内积会成为一个标量
```python
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
np.dot(a, b)
```
::: details result
32
:::
#### 运算法则
A + B + C = A + (B + C)
K * (X + Y) = KX + KY
# 02.向量的范数
[toc]{type: "ol", level: [2, 3, 4, 5]}
### 范数定义
把向量变成一个标量
P: 整数1,2,3...正无穷都可以
常用:1范数与2范数
#### 范数理解
L1:
距离本身加和
曼哈顿距离:红色、蓝色、黄色、所走的距离相同
L2:
绿色线的距离 向量的长度 平方加和后,开根号


#### 示例
##### L1
```python
import numpy as np
W = np.array([-3, 5, 6, -7, 2, 1])
my_abs = np.abs(W)
L1 = np.sum(my_abs)
L1
```
::: details result
24
:::
##### L2
```python
import numpy as np
W = np.array([-3, 5, 6, -7, 2, 1])
my_squ = np.square(W)
L2 = np.sqrt(np.sum(my_squ))
L2
```
::: details result
11.135528725660043
:::
### 特殊向量
#### 0向量
分量全为0的向量
例如:[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
#### 单位向量
L2范数|模|长度为1的向量
代表的是一个方向
例如:[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
```python
import numpy as np
W = np.array([3, 4])
L2 = np.sqrt(np.sum(np.square(W)))
print(L2)
# 5.0
e = W/L2
print(e)
# 单位向量
# [0.6 0.8]
unit = np.sqrt(np.sum(np.square(e)))
print(unit)
# 模/长度
# 1.0
```
#### 稀疏向量
大部分为0,小部分有值
#### 稠密向量
大部分有值,小部分为0
#### 独热编码
只有一个为1,其他为0
# 03.矩阵
[toc]{type: "ol", level: [2, 3, 4, 5]}
### 矩阵定义
::: tip
矩阵就是二维数组 m行n列
每个元素都有行标i和列标j a~ij~
:::
### 特殊矩阵
#### 方阵
::: tip
m=n
:::
#### 对称矩阵
::: tip
a~ij~ = a~ji~
沿主对角线对称 对阵矩阵必然是方阵
主对角线 a~11~ --> a~mn~
:::
#### 单位矩阵
主对角线是1,其他位置是0
```python
# 创建单位矩阵
import numpy as np
# np.eye(6)
np.identity(6)
```

#### 对角矩阵
主对角线非0,其他位置为0
# 04.矩阵计算
[toc]{type: "ol", level: [2, 3, 4, 5]}
### 创建
```python
import numpy as np
a = np.arange(1, 13).reshape(3, 4)
b = np.arange(1, 13).reshape(3, 4)
```
### 基本运算
#### 加法
```python
a + b
```

#### 减法
```python
a - b
```

#### 数乘
```python
4 * a
```

#### 乘法
```python
a * b
```

#### 除法
```python
a / b
```

### 转置
#### T
```python
a.T
```

```python
# 非转置 要注意
a.reshape(4, 3)
```

#### transpose
##### 转置二维数组
```python
a.transpose(1, 0)
```

##### 转置多维数组
```python
m = np.arange(1,25)
n = m.reshape(2, 2, 6)
n
```

```python
# 这里的012指的是对应位置的值2,2,6
n.transpose(1, 2, 0)
```

### 内积
#### 基本概念
把第一个矩阵的每行和第二个矩阵的每列,进行计算
#### 计算内积
```python
import numpy as np
a = np.arange(1, 9).reshape(2, 4)
b = np.arange(1, 9).reshape(4, 2)
a
b
# m行n列 n行k列 --> m行k列
```

```python
np.dot(a, b)
```


#### 满足的规律
add | 规律
:-----|:---------------
全部 | A + B + C = A + (B + C)
mult | 规律
:-----------|:---------------
结合律 | (A * B) * C = A * (B * C)
左分配律 | (A + B) * C = AC + BC
右分配律 | A * (B + C) = AB + AC
- 不满足交换律:AB **≠**{style="color:brown"} BA
- 其他:**(AB)^T^ = B^T^A^T^**{style="color:goldenrod"}
### 逆矩阵
矩阵没有A/B的说法,只有逆矩阵
定义:
假设方阵A乘以矩阵B等于单位矩阵1(方阵)
AB = 1 B为A的右逆矩阵
BA = 1 B为A的左逆矩阵
* 如果B存在 则其左逆和右逆一定相等
#### 相关公式
- **(AB)^-1^ = B^-1^A^-1^**{style="color:goldenrod"}
- **(A^-1^)^-1^ = A**{style="color:green"}
- **(A^T^)^-1^ = (A^-1^)^T^**{style="color:brown"}
#### 求逆矩阵
```python
c = np.dot(a, b)
c_inv = np.linalg.inv(c)
c_inv
numpy.dot(c, c_inv)
```



### 行列式
> 机器学习中使用较少
#### 行列式定义
将矩阵变为一个标量
必须是方阵,才能计算行列式
#### 计算方法

#### 性质
##### 计算方式

> n为对角线数据的个数
##### 推导过程

##### 示例
```python
import numpy as np
A = np.arange(4).reshape(2, 2)
# 求行列式
res1 = np.linalg.det(np.linalg.inv(A))
res1
res2 = 1 / np.linalg.det(A)
res2
```
::: details result
-0.49999999999999994
-0.5
:::