矩陣
參考: 機器學習基礎
一般而言,一個對象應該被視為完整的個體,表現實中有意義的事物,不能輕易拆分。
對象是被特征化的客觀事物,而表(或矩陣)是容納這些對象的容器。換句話說,對象是表中的元素,表是對象的集合(表中的每個對象都有相同的特征和維度,對象對於每個特征都有一定的取值)。
分類或聚類可以看作根據對象特征的相似性與差異性,對矩陣空間的一種划分。
預測或回歸可以看作根據對象在某種序列(時間)上的相關性,表現為特征取值變化的一種趨勢。
import numpy as np
a = np.arange(9).reshape((3, -1))
a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
b = a.copy()
id(a) == id(b)
False
repr(a) == repr(b)
True
Linalg
A = np.mat([[1, 2, 4, 5, 7], [9,12 ,11, 8, 2], [6, 4, 3, 2, 1], [9, 1, 3, 4, 5], [0, 2, 3, 4 ,1]])
行列式
np.linalg.det(A)
-812.00000000000068
逆
np.linalg.inv(A)
matrix([[ -7.14285714e-02, -1.23152709e-02, 5.29556650e-02,
9.60591133e-02, -8.62068966e-03],
[ 2.14285714e-01, -3.76847291e-01, 1.22044335e+00,
-4.60591133e-01, 3.36206897e-01],
[ -2.14285714e-01, 8.25123153e-01, -2.04802956e+00,
5.64039409e-01, -9.22413793e-01],
[ 5.11521867e-17, -4.13793103e-01, 8.79310345e-01,
-1.72413793e-01, 8.10344828e-01],
[ 2.14285714e-01, -6.65024631e-02, 1.85960591e-01,
-8.12807882e-02, -1.46551724e-01]])
轉置
A.T
matrix([[ 1, 9, 6, 9, 0],
[ 2, 12, 4, 1, 2],
[ 4, 11, 3, 3, 3],
[ 5, 8, 2, 4, 4],
[ 7, 2, 1, 5, 1]])
A * A.T
matrix([[ 95, 131, 43, 78, 43],
[131, 414, 153, 168, 91],
[ 43, 153, 66, 80, 26],
[ 78, 168, 80, 132, 32],
[ 43, 91, 26, 32, 30]])
秩
np.linalg.matrix_rank(A)
5
解方程
b = [1, 0, 1, 0, 1]
S = np.linalg.solve(A, b)
S
array([-0.0270936 , 1.77093596, -3.18472906, 1.68965517, 0.25369458])
現代數學三大基石:
- 概率論說明了事物可能會是什么樣;
- 數值分析揭示了它們為什么這樣,以及如何變成這樣;
- 線性代數告訴我們事物從來不只有一個樣子,使我們能夠從多個角度來觀察事物。
相似性度量
閔可夫斯基 Minkowski() 距離對應於 \(||\cdot||_p\), 即
\begin{aligned}
d = ||x_1-x_2||_p & & x_1, x_2 \in \mathbb{R}^n
\end{aligned}
- 曼哈頓距離 (Manhattan) : \(p=1\), 又稱為城市街區距離 (City Block distance)
- 切比雪夫 (Chebyshev) 距離: \(p=∞\), 可用來計算象棋走的步數.
比較常見是范數(如歐式距離(\(L_2\))、曼哈頓距離(\(L_1\))、切比雪夫距離(\(L_{\infty}\)))和夾角余弦。下面我主要說明一下其他的幾個比較有意思的度量:
漢明距離(Hamming)
定義:兩個等長字符串 s1
與 s2
之間的漢明距離定義為將其中一個變成另外一個所需要的最小替換次數。(對應於 \(||\cdot||_0\))
應用:信息編碼(為了增強容錯性,應該使得編碼間的最小漢明距離盡可能大)。
A = np.mat([[1, 1, 0, 1, 0, 1, 0, 0, 1], [0, 1, 1, 0, 0, 0, 1, 1, 1]])
smstr = np.nonzero(A[0] - A[1])
A[0] - A[1]
matrix([[ 1, 0, -1, 1, 0, 1, -1, -1, 0]])
smstr
(array([0, 0, 0, 0, 0, 0], dtype=int64),
array([0, 2, 3, 5, 6, 7], dtype=int64))
d = smstr[0].shape[0]
d
6
傑卡德相似系數(Jaccard Similarity Coefficient)
相似度:
傑卡德距離(Jaccard Distance)
區分度:
應用:
樣本 \(A\) 和樣本 \(B\) 所有維度的取值為 \(0\) 或 \(1\),表示包含某個元素與否。
import scipy.spatial.distance as dist
A
matrix([[1, 1, 0, 1, 0, 1, 0, 0, 1],
[0, 1, 1, 0, 0, 0, 1, 1, 1]])
dist.pdist(A, 'jaccard')
array([ 0.75])
蝴蝶效應(洛倫茲動力學方程):確定性與隨機性相統一
- 系統未來的所有運動都被限制在一個明確的范圍之內——確定性;
- 運動軌跡變化纏繞的規則是隨機性的,任何時候你都無法准確判定下一次運動的軌跡將落在「蝴蝶」的哪側翅膀上的哪個點上——隨機性。
總而言之,系統運動大的范圍是確定的、可測的,但是運動的細節是隨機的、不可測的。
從統計學角度來看,蝴蝶效應說明了:
- 樣本總體(特征向量或對象)的取值范圍一般是確定的,所有樣本對象(包括已經存在的和未出現的)的取值都位於此空間內;
- 無論收集再多的樣本對象,也不能使這種隨機性降低或消失。
隨機性是事物的一種根本的、內在的、無法根除的性質,也是一切事物(概率)的本質屬性。
衡量事物運動的隨機性,必須從整體而不是局部來認知事物,因為從每個局部,事物可能看起來都是不同的(或相同的)。
概率論便是度量隨機性的一個工具。一般地,上述所說的矩陣,被稱為設計矩陣,基本概念重寫:
- 樣本(樣本點):原指隨機試驗的一個結果,可以理解為設計矩陣中的一個對象,如蘋果、小豬等。
- 樣本空間:原指隨機試驗所有可能結果的集合,可以理解為矩陣的所有對象,引申為對象特征的取值范圍:\(10\) 個蘋果,\(2\) 只小豬。
- 隨機事件:原指樣本空間的一個子集,可以理解為某個分類,它實際指向一種概率分布:蘋果為紅色,小豬為白色
- 隨機變量:可以理解為指向某個事件的一個變量:\(X\{x_i = \text{黃色}\}\)
- 隨機變量的概率分布:給定隨機變量的取值范圍,導致某種隨機事件出現的可能性。可以理解為符合隨機變量取值范圍的某個對象屬於某個類別或服從某種趨勢的可能性。
空間變換
由特征列的取值所構成的矩陣空間應具有完整性,即能夠反映事物的空間形式或變換規律。
向量:具有大小和方向。
向量與矩陣的乘積就是一個向量從一個線性空間(坐標系),通過線性變換,選取一個新的基底,變換到這個新的基底所構成的另一個線性空間的過程。
矩陣與矩陣的乘法 \(C = A \cdot B\):
- \(A\):向量組
- \(B\):線性變換下的矩陣
假設我們考察一組對象 \(\scr{A} = \{\alpha_1, \cdots, \alpha_m\}\),它們在兩個不同維度的空間 \(V^n\) 和 \(V^p\) 的基底分別是 \(\{\vec{e_1}, \cdots, \vec{e_n}\}\) 和 \(\{\vec{d_1}, \cdots, \vec{d_p}\}\),\(T\) 即為 \(V^n\) 到 \(V^p\) 的線性變換,且有(\(k = \{1, \cdots, m\}\)):
令
則記:
由式(1)可知:
因而 \(X\) 與 \(Y\) 表示一組對象在不同的線性空間的坐標表示。\(A\) 表示線性變換在某個基偶(如,\((\{\vec{e_1}, \cdots, \vec{e_n}\}, \{\vec{d_1}, \cdots, \vec{d_p}\})\))下的矩陣表示。
使用 Numpy 求解矩陣的特征值和特征向量
A = [[8, 7, 6], [3, 5, 7], [4, 9, 1]]
evals, evecs = np.linalg.eig(A)
print('特征值:\n%s\n特征向量:\n%s'%(evals, evecs))
特征值:
[ 16.43231925 2.84713925 -5.2794585 ]
特征向量:
[[ 0.73717284 0.86836047 -0.09167612]
[ 0.48286213 -0.4348687 -0.54207062]
[ 0.47267364 -0.23840995 0.83531726]]
有了特征值和特征向量,我們便可以還原矩陣:
sigma = evals * np.eye(3)
sigma
array([[ 16.43231925, 0. , -0. ],
[ 0. , 2.84713925, -0. ],
[ 0. , 0. , -5.2794585 ]])
或者,利用 np.diag
:
np.diag(evals)
array([[ 16.43231925, 0. , 0. ],
[ 0. , 2.84713925, 0. ],
[ 0. , 0. , -5.2794585 ]])
np.dot(np.dot(evecs, sigma), np.linalg.inv(evecs))
array([[ 8., 7., 6.],
[ 3., 5., 7.],
[ 4., 9., 1.]])
我的學習筆記:ML 基礎
我的Github:https://github.com/q735613050/AI/tree/master/ML
關於矩陣的一個不成熟的解釋: 機器學習中的矩陣