標量、向量、張量
標量 就是一個數, 1, 2, 3.0等
向量 不僅有大小, 還有方向, 它由一組數組成, 如 (1, 2, 3), (x, y)等
張量 可以看作座標超過兩維的數組,因此向量是張量的一個特例
矩陣相關知識
矩陣
矩陣 相當於一個二維數組, 通過行和列下標唯一索引一個矩陣中的元素
上面的矩陣,第一行第二列唯一表示一個元素
矩陣常用的運算法則
行列式 將方陣映射到一個實數的函數, 如, 其行列式爲
加法
乘法
兩個矩陣內標同,可以相乘, 外標決定最終相乘所得矩陣的形狀, 如,而, 因爲內標同,即A的列數等於B的行數,所以,兩矩陣可以相乘, 假定相乘所得的結果矩陣爲, 則爲m行s列, 相乘的原則爲, 這裏表示矩陣中的每一個元素,而矩陣與向量乘法類似,可以將向量看成只有一列的矩陣, 結果爲一個向量
特殊矩陣
爲的轉置矩陣, 即,且有, ;
爲的伴隨矩陣, 是由行列式的每個元素的代數餘子式所構成的矩陣, 每個按行優先計算, 結果按列優先放置,, 若A爲可逆矩陣, 則;
爲A的逆矩陣, 這裏只有行列式不爲0的n階方陣纔有逆矩陣, , ;
單位矩陣 方矩陣, 且主對角線元素均爲1, 其它部分元素均爲0;
對角矩陣 方矩陣, 且除了主對角線元素外,其餘部分元素均爲0;
對稱矩陣 方矩陣, 且
反對稱矩陣 方矩陣, 且
正交矩陣 方矩陣, 且
奇異矩陣 行列式得0的矩陣, 或者不是滿秩的方陣
非奇異矩陣 行列式得0得矩陣, 或者爲滿秩的方陣
範數
向量範數
向量範數 用來衡量一個向量的大小,將向量映射到非負值的函數,它滿足以下性質:
0-範數 表示爲向量中非零元素的個數;
1-範數 , 表示爲向量元素的絕對值之和;
2-範數 , 又被稱爲歐幾里得範數,即對向量的每一個分量的平方和相加然後再開根號;
p-範數 ,即向量的每一個分量取絕對值後求p次方累加起來的和再求
-範數 ,表示向量中擁有最大幅值元素的絕對值
-範數 , 表示向量中擁有最小幅值的元素的絕對值
import numpy as np
# 隨機生成一個包含五個元素的向量
vector = np.random.randint(1, 10, 5)
vector
# 計算0範數
np.linalg.norm(vector, 0)
# 計算1範數
np.linalg.norm(vector, 1)
# 計算2範數
np.linalg.norm(vector, 2)
# 計算無窮範數
np.linalg.norm(vector, np.inf)
# 計算負無窮範數
np.linalg.norm(vector, -np.inf)
# 計算p範數, 假設p = 3
np.linalg.norm(vector, 3)
輸出結果:
矩陣範數
矩陣範數 用於衡量矩陣的大小
1-範數 , 列和範數,即矩陣中每一個列向量絕對值之和的最大值;
2-範數 , 表示的最大特徵值, 稱爲譜範數
-範數 ,行和範數, 即所有矩陣行向量絕對值之和的最大值
F-範數 , Frobenius範數, 即矩陣中所有元素的絕對值的平方和再開平方
import numpy as np
# 隨機生成一個3*3的矩陣
matrix = np.random.randint(1, 10, 9).reshape(3, 3)
matrix
# 計算列和範數
np.linalg.norm(matrix, 1)
# 計算譜範數
np.linalg.norm(matrix, 2)
# 計算行和範數
np.linalg.norm(matrix, -np.inf)
# 計算Frobenius範數
np.linalg.norm(matrix, 'fro')
輸出結果
特徵分解
特徵值與特徵向量 設是階矩陣,如果存在一個數和非零的維列向量, 使得, 則稱爲矩陣的一個特徵值, 非零向量爲矩陣屬於特徵值的特徵向量。其中, 爲特徵多項式, 爲特徵方程。類似地, , 這裏的爲矩陣的做特徵值。若是的特徵向量, 則也是的特徵向量
矩陣相似與對角化 假定矩陣A的所有特徵值構成一個對角矩陣, 所有特徵值對應的特徵向量構成一個矩陣, 則有, 即
在實對稱矩陣中, 不同特徵值對應的特徵向量必定正交, 對於k重特徵值有k個線性無關的特徵向量, 這k個線性無關的特徵向量可以通過施密特正交化轉化爲正交的特徵向量,因此特徵向量構成的矩陣爲正交矩陣,則
import numpy as np
# 隨機生成一個3*3的矩陣
matrix = np.random.randint(1, 10, 9).reshape(3, 3)
matrix
eigen_values, eigen_vectors = np.linalg.eig(matrix)
eigen_values
eigen_vectors
輸出結果:
二次型 含有n個變量的二次齊次函數稱爲n元二次型, 有, 其中被稱爲二次型矩陣,限制, 等於某個特徵向量時, f返回對應的特徵值。所有特徵值爲正數的矩陣稱爲正定矩陣, 所有特徵值是非負數的矩陣稱爲半正定矩陣, 所有特徵值爲負數的矩陣稱爲負定矩陣, 所有特徵值是非正數的矩陣稱爲半負定矩陣
奇異值分解
奇異值分解(singular value decomposition, SVD) 將矩陣分解成奇異向量和奇異值,每個實數矩陣一定都有一個奇異值分解, 但不一定有特徵分解, 因爲特徵分解是針對方陣而言的。對於方陣來說,其奇異值分解的結果與特徵分解的結果相同。對矩陣進行奇異值分解爲:
上式中是的特徵向量所組成的矩陣, 的特徵向量被稱爲矩陣的左奇異向量, 是的特徵向量所組成的矩陣轉置後的矩陣, 的特徵向量被稱爲矩陣的右奇異向量, 而矩陣是一個對角矩陣, 但不一定是一個方陣, 裏面矩陣對角線元素爲的特徵值開根號。
import numpy as np
# 隨機生成一個2*3的矩陣, 對其進行奇異值分解
A = np.random.randint(1, 10, 6).reshape(2, 3)
A
np.linalg.svd(A)
A_T = A.transpose()
np.linalg.eig(A.dot(A_T))
np.linalg.eig(A_T.dot(A))
輸出結果:
僞逆矩陣
僞逆矩陣 任何一個矩陣都有僞逆矩陣, 而只有行列式不爲0的方陣纔有逆矩陣, 且行列式不爲0的矩陣其僞逆矩陣與逆矩陣相同,求且矩陣A的僞逆矩陣的公式爲:
其中U, D, V是對矩陣進行奇異值分解後得到的矩陣, 即U是的特徵向量組成的矩陣進行轉置, V是, 代表D的僞逆矩陣, 即將D中的非零元素取倒數之後, 再進行轉置得到的矩陣。
# 跡運算
跡 一個方矩陣的主對角線元素之和, 被稱爲這個矩陣的跡, 即,其中跡,矩陣的Frobenius範數可以用跡的運算來表示,
跡的運算 矩陣轉置後跡不變,多個矩陣相乘得到的方陣的跡在交換個別位置後,如果仍然可以相乘,則跡也不變,標量的跡是其本身。
線性相關和生成子空間
線性組合 一組向量中的每一個向量乘以標量係數之後的和,
線性相關和線性無關 一組向量中的某一個向量可以用該組向量中的其它向量的線性組合來表示, 則這個向量組是線性相關的,反之,一組向量中的任意一個向量都不能由該組向量中的其它向量線性組合來表示, 則這個向量組是線性無關的;
生成子空間 原始向量線性組合所能抵達的點的集合,例如中,A的列向量的線性組合構成的所有列向量表示爲A的列向量的生成子空間或者A的值域, 如果向量恰好在A的值域內,則一定有解, 這裏的的各個分量就相當於用矩陣的列向量乘以對應的係數來表示得到的。
主成分分析
定義
主成分分析(principle components analysis, PCA) 一種廣泛使用的數據降維算法,將維特徵映射到維上,這裏,這k維全新的正交特徵被稱爲主特徵。一般選取的維特徵滿足前k個特徵值之和與所有的特徵值之和的比值大於%95, 特徵矩陣中特徵值由大到小進行排列。
方法
- 假定一個矩陣, 其中m行爲m個樣例, n列爲n個不同的特徵,則首先對矩陣每一列計算均值,然後矩陣中的每一列元素減去該列的均值,這個過程稱爲去均質化, 其幾何意義相當於將所有樣本點移動到座標原點處;
- 計算這n列元素之間的協方差,得到一個協方差矩陣,協方差的計算公式爲:;
- 對求得的協方差矩陣計算其特徵值和特徵向量, 按特徵值由大到小排列,選取前個特徵值,保證其和與所有特徵值之和的比值大於%95, 然後選取這個特徵值所對應的個線性無關的特徵向量;
- 將均值標準化後的原矩陣與前個特徵向量組成的矩陣相乘得到的新矩陣即爲降維後的新矩陣。
舉例
使用numpy隨機生成一個的矩陣,代表10個用例,每個用例有兩個特徵,現在將其降至1維
X | Y |
---|---|
1.75 | 1.90 |
6.42 | 1.92 |
3.15 | 1.97 |
9.68 | 1.93 |
4.78 | 1.90 |
5.68 | 1.93 |
2.73 | 1.91 |
6.34 | 1.88 |
8.02 | 1.87 |
0.06 | 1.85 |
import numpy as np
# 首先進行均值標準化
meanArr = np.mean(A, axis = 0)
A[:, 0] -= meanArr[0]
A[:, 1] -= meanArr[1]
# 計算所有維度之間的協方差
cov_matrix = np.cov(A, rowvar = False)
# 對協方差矩陣求特徵值與特徵向量
eigen_values, eigen_vectors = np.linalg.eig(cov_matrix)
# 特徵值從大到小排列, 選取第一個特徵值所對應的特徵向量
# 將均值標準化後的矩陣與該特徵向量相乘, 得到降維後的矩陣
final_matrix = np.dot(A, eigen_vectors[:, 0])
print(final_matrix)
輸出結果