向量
向量是機器學習最底層的組成部分, 也是基礎數據的表示形式, 線性代數通過將研究對象拓展到向量, 對多維數據進行統一研究, 而進化出的方法方便我們可以研究和解決真實世界中的問題
標量
標量也稱為"無向量", 使用一個單獨的數表示數值大小, 可以有正負之分, 可以是實數和負數, 一般用小寫變量表示, 比如 s s s表示行走距離, k k k表示直線斜率, n n n表示元素數目, 這些都可以看做標量
向量
向量是為了表達和處理高維空間的問題, 為表示一個整體會用方括號擴起來
向量的定義
將 n n n個有序的數排成一排稱為 n n n維向量, 將 n n n個有次序的數排成一列, 稱為 n n n維列向量
如, 稱為四維列向量
x = [ 3 4 5 6 ] x = \left[ \begin{matrix} 3 & 4 & 5 & 6 \end{matrix} \right] x=[3?4?5?6?]
稱為四維行向量
x = [ 3 4 5 6 ] x = \left[ \begin{matrix} 3 \\ 4 \\ 5 \\ 6 \end{matrix} \right] x= ?3456? ?
如果沒有聲明一般為列向量
定位向量的值
y = [ 3 4 5 6 ] T y=\left[\begin{matrix}3 & 4 & 5 & 6\end{matrix}\right] ^T y=[3?4?5?6?]T, 向量 y y y的第 i i i個分向量用 y i y_i yi?表示, 如 y 2 y_2 y2?表示第二個分量, 值為 4 4 4
向量的幾何意義
向量既有大小又有方向, 將向量的分量看作坐標軸上的坐標, 以坐標原點為起點, 向量代表的點為重點, 可以形成一條有向線段, 有向線段的長度表示向量的大小, 箭頭所指的方向表示向量的方向, 可以將任意一個位置做為起始點進行自由移動, 但一般將原點看作起始點.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches# 設置中文字體
plt.rcParams['font.sans-serif']=['Hiragino Sans GB'] # 修改字體
plt.rcParams['axes.unicode_minus'] = False # 正常顯示負號# 定義向量起點和終點(dx, dy)
x_start, y_start = 0, 0
dx, dy = 3, 4
dx1, dy1 = 4, 3# 創建圖形
plt.figure(figsize=(5, 5))# 繪制向量
plt.arrow(x_start, y_start, dx, dy,head_width=0.1, length_includes_head=True,color='blue', lw=2)
plt.text(x_start+dx, y_start+dy, f"({dx}, {dy})")
# 繪制向量
plt.arrow(x_start, y_start, dx1, dy1,head_width=0.1, length_includes_head=True,color='blue', lw=2)
plt.text(x_start+dx1, y_start+dy1, f"({dx1}, {dy1})")# 設置坐標軸范圍
plt.xlim(-1, 6)
plt.ylim(-1, 6)# 設置坐標軸比例一致
plt.axis('equal')# 添加網格和標簽
plt.grid(True)
plt.xlabel('x')
plt.ylabel('y')
plt.title('向量的表示')# 顯示圖形
plt.show()
通常向量代表一組數, 是由使用者定義, 比如個人信息, 可以用 u s e r = [ 0 18 173 78789 ] user = \left[\begin{matrix}0 & 18 & 173 & 78789\end{matrix}\right] user=[0?18?173?78789?], 分別代表性別, 年齡, 身高, 和名字
向量的運算
加法
向量加法的值等于兩個向量的對應分量之和
以兩個二維向量加法為例, 如 r = [ 3 , 1 ] t r=[3,1]^t r=[3,1]t和 s = [ 2 , 3 ] t s=[2,3]^t s=[2,3]t, r + s = [ 2 + 2 , 1 + 3 ] t = [ 5 , 4 ] t r+s=[2+2, 1+3]^t=[5,4]^t r+s=[2+2,1+3]t=[5,4]t
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches# 設置中文字體
plt.rcParams['font.sans-serif']=['Hiragino Sans GB'] # 修改字體
plt.rcParams['axes.unicode_minus'] = False # 正常顯示負號# 定義向量起點和終點(dx, dy)
x_start, y_start = 0, 0
dx, dy = 3, 4
dx1, dy1 = 4, 3
# 創建圖形
plt.figure(figsize=(5, 5))# 繪制向量
# 注意, 后面的 dx, dy 分別是以前面兩個微基礎的向量非坐標
plt.arrow(x_start, y_start, dx, dy,head_width=0.1, length_includes_head=True,color='blue', lw=2)
plt.arrow(dx, dy, dx1, dy1,head_width=0.1, length_includes_head=True,color='blue', lw=2, linestyle="-")
plt.text(x_start+dx, y_start+dy, f"({dx}, {dy})")
plt.text(x_start+dx + dx1, y_start+dy + dy1, f"({dx} + {dx1}, {dy} + {dy1})")# 繪制向量
plt.arrow(x_start, y_start, dx1, dy1,head_width=0.1, length_includes_head=True,color='blue', lw=2)
plt.arrow(dx1, dy1, dx, dy,head_width=0.1, length_includes_head=True,color='blue', lw=2, linestyle="-")
plt.text(x_start+dx1, y_start+dy1, f"({dx1} + {dx}, {dy1} + {dy})")# 設置坐標軸范圍
# plt.xlim(-1, 10)
# plt.ylim(-1, 10)# 設置坐標軸比例一致
plt.axis('equal')# 添加網格和標簽
plt.grid(True)
plt.xlabel('x')
plt.ylabel('y')
plt.title('向量的表示')# 顯示圖形
plt.show()
向量的乘法
數乘向量是數量與向量的乘法運算, 一個數 m m m乘以一個向量 r r r, 結果是向量 m r mr mr, 以而為向量數乘為例, m = 3 , r = [ 2 , 1 ] t m=3, r=[2,1]^t m=3,r=[2,1]t, m r = [ 3 ? 2 , 3 ? 1 ] t = [ 6 , 3 ] t mr=[3 * 2, 3 * 1]^t=[6, 3]^t mr=[3?2,3?1]t=[6,3]t
向量與數據
機器學習中, 對一個對象或者事件的描述稱為樣本, 反映樣本某方面的表現或者性質的事項稱為特征或屬性, 特征的取值稱為特征值, 樣本組成的集合稱為數據集, 向量可以看做樣本的特征數
矩陣
標量是一個數, 向量是標量的拓展是一組數, 矩陣是對向量的拓展, 看作一組向量, 矩陣是線性代數最有用的工具
矩陣的定義
A = [ 120 3 2 2 0.2 600 100 3 1 2 0.2 500 110 3 1 2 0.1 700 90 3 1 1 1 300 ] A = \left[\begin{matrix} 120 & 3 & 2 & 2 & 0.2 & 600 \\ 100 & 3 & 1 & 2 & 0.2 & 500 \\ 110 & 3 & 1 & 2 & 0.1 & 700 \\ 90 & 3 & 1 & 1 & 1 & 300 \end{matrix}\right] A= ?12010011090?3333?2111?2221?0.20.20.11?600500700300? ?
這個矩陣由4行6列組成, 就是 4 × 6 4 \times 6 4×6的矩陣
由 m × n m \times n m×n個數 a i j a_{ij} aij?, i = 1 , 2 , . . . , m i=1,2,...,m i=1,2,...,m, j = 1 , 2 , . . . , n j=1,2,...,n j=1,2,...,n排成的 m m m行 n n n列的數表, 稱為 m m m行 n n n列矩陣
A = [ a 11 a 12 ? a 1 n a 21 a 22 ? a 2 n ? ? a i j ? a m 1 a m 2 ? a m n ] A = \left[\begin{matrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & a_{ij} & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \end{matrix}\right] A= ?a11?a21??am1??a12?a22??am2????aij???a1n?a2n??amn?? ?
記做 A = A m × n = ( a i j ) m × n A = A_{m \times n} = (a_{ij})_{m \times n} A=Am×n?=(aij?)m×n?
矩陣和數據
矩陣表示關系
用來表示城市之間是否可以通行, 分別用 0 , 1 0, 1 0,1來表示, 1代表可以通行, 0代表不可以通行
通行關系 | A | B | C | D |
---|---|---|---|---|
A | √ \surd √ | √ \surd √ | ||
B | √ \surd √ | √ \surd √ | ||
C | √ \surd √ | √ \surd √ | ||
D | √ \surd √ |
A = [ 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 0 ] A = \left[\begin{matrix} 0 & 1 & 1 & 0 \\ 1 & 0 & 1 & 0 \\ 1 & 0 & 0 & 1 \\ 0 & 1 & 0 & 0 \end{matrix} \right] A= ?0110?1001?1100?0010? ?
矩陣表示直接信息
學生選修了 A , B , C , D A, B, C, D A,B,C,D四門課, 用矩陣表示
通行關系 | A | B | C | D |
---|---|---|---|---|
1 | 80 | 75 | 75 | 78 |
2 | 98 | 70 | 85 | 84 |
3 | 90 | 75 | 90 | 90 |
4 | 88 | 70 | 82 | 80 |
A = [ 80 75 75 78 98 70 85 84 90 75 90 90 88 70 82 80 ] A = \left[\begin{matrix} 80 & 75 & 75 & 78 \\ 98 & 70 & 85 & 84 \\ 90 & 75 & 90 & 90 \\ 88 & 70 & 82 & 80 \end{matrix} \right] A= ?80989088?75707570?75859082?78849080? ?
矩陣表示線性系統
描述參數, 變量和常量先行關系, 設方程組如下
{ a 11 x 1 + a 12 x 2 + . . . + a 1 n x n = b 1 a 21 x 1 + a 22 x 2 + . . . + a 2 n x n = b 2 ? a m 1 x 1 + a m 2 x 2 + . . . + a m n x n = b 2 \begin{cases} a_{11}x_1 + a_{12}x_2 + ... + a_{1n}x_n=b_1 \\ a_{21}x_1 + a_{22}x_2 + ... + a_{2n}x_n=b_2 \\ \vdots \\ a_{m1}x_1 + a_{m2}x_2 + ... + a_{mn}x_n=b_2 \end{cases} ? ? ??a11?x1?+a12?x2?+...+a1n?xn?=b1?a21?x1?+a22?x2?+...+a2n?xn?=b2??am1?x1?+am2?x2?+...+amn?xn?=b2??
方程組左側系數用 m × n m \times n m×n階矩陣 A A A表示, 每行代表一個方程, 沒列代表不同方程中未知數的系數. 方程組右側用 m × 1 m \times 1 m×1階矩陣 B B B表示, 每行代表方程右側的值, 通常 A A A為系數矩陣, X X X為未知數矩陣, B B B為常數項矩陣, 記做 A X = B AX=B AX=B
A = [ a 11 a 12 ? a 1 n a 21 a 22 ? a 2 n ? ? ? a m 1 a m 2 ? a m n ] A = \left[\begin{matrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \end{matrix} \right] A= ?a11?a21??am1??a12?a22??am2??????a1n?a2n??amn?? ?
X = [ x 1 x 2 ? x n ] X = \left[\begin{matrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{matrix} \right] X= ?x1?x2??xn?? ?
B = [ b 1 b 2 ? b n ] B = \left[\begin{matrix} b_1 \\ b_2 \\ \vdots \\ b_n \end{matrix} \right] B= ?b1?b2??bn?? ?
使用Numpy很容易求出 X X X的值
矩陣和向量的創建
NumPy是Python開源的數值計算拓展
矩陣的創建
NumPy采用matrix(矩陣)和array(數組表示矩陣, 主要區別如下
- matrix 是 array 的分支, matrix 和 array 通用, 但大部分 Python程序中, array 更多, 因為更加靈活更快
- array類型為numpy.ndarray, 是相同類型元素組成, 統稱為矩陣
import numpy as np# 1. 基礎矩陣創建
a = np.array([[1,2],[3,4]])
print("np.array:\n", a) # 通用矩陣創建b = np.zeros((3,3))
print("\nnp.zeros:\n", b) # 初始化零矩陣c = np.ones((2,3), dtype=int)
print("\nnp.ones:\n", c) # 創建整型全1矩陣d = np.eye(3)
print("\nnp.eye:\n", d) # 創建單位矩陣e = np.diag([1,2,3])
print("\nnp.diag:\n", e) # 創建對角矩陣# 2. 數值序列生成
f = np.arange(2,10,2).reshape(2,2)
print("\nnp.arange+reshape:\n", f) # 生成等差序列矩陣g = np.linspace(0,1,6).reshape(2,3)
print("\nnp.linspace:\n", g) # 生成等間隔矩陣# 3. 隨機矩陣
h = np.random.rand(3,2)
print("\nnp.random.rand:\n", h) # 生成[0,1)均勻分布矩陣i = np.random.randn(2,3)
print("\nnp.random.randn:\n", i) # 生成正態分布矩陣j = np.random.randint(1,10,size=(3,3))
print("\nnp.random.randint:\n", j) # 生成隨機整數矩陣# 4. 特殊構造方法
k = np.fromfunction(lambda i,j: i+j, (3,3))
print("\nnp.fromfunction:\n", k) # 通過函數構造矩陣l = np.tile([1,2], (2,3))
print("\nnp.tile:\n", l) # 矩陣平鋪復制m = np.repeat([1,2], 3).reshape(2,3)
print("\nnp.repeat:\n", m) # 元素重復擴展# 5. 矩陣屬性操作
n = np.array([[1,2,3],[4,5,6]], dtype=np.float32)
print("\n矩陣屬性:")
print("shape:", n.shape) # 形狀
print("dtype:", n.dtype) # 數據類型
print("ndim:", n.ndim) # 維度
print("size:", n.size) # 元素總數
print("itemsize:", n.itemsize) # 單元素字節大小"""
np.array:[[1 2][3 4]]np.zeros:[[0. 0. 0.][0. 0. 0.][0. 0. 0.]]np.ones:[[1 1 1][1 1 1]]np.eye:[[1. 0. 0.][0. 1. 0.][0. 0. 1.]]np.diag:[[1 0 0][0 2 0][0 0 3]]np.arange+reshape:[[2 4][6 8]]np.linspace:[[0. 0.2 0.4][0.6 0.8 1. ]]np.random.rand:[[0.88342915 0.31164707][0.149002 0.5399805 ][0.42382287 0.85360373]]np.random.randn:[[ 0.20843083 -1.4405944 1.2375411 ][ 0.36852983 0.5106739 -0.54602658]]np.random.randint:[[3 7 5][8 2 1][4 9 6]]np.fromfunction:[[0. 1. 2.][1. 2. 3.][2. 3. 4.]]np.tile:[[1 2 1 2 1 2][1 2 1 2 1 2]]np.repeat:[[1 1 1][2 2 2]]矩陣屬性:
shape: (2, 3)
dtype: float32
ndim: 2
size: 6
itemsize: 4
"""