求矩陣的秩
設 ,已知r(A)=2,則參數x,y分別是
解:任意三階子式=0,有二階子式≠0,但是這些子式比較多,可以使用初等變換,因為初等變換不改變矩陣的秩,可以將矩陣通過初等行(列)變換,化為行階梯矩陣,有幾行不等於0,秩就是幾。
行列式的轉換
- Am×nx=0只有零解 <=> r(A)=n
- 特別地,A是n×n時,則Am×nx=0只有零解 <=> |A|≠0
- Am×nx=0有非零解 <=> r(A)<n
- 特別地,A是n×n時,則Am×nx=0有非零解 <=> |A|=0
- 若m<n(方程少未知數多),則Am×nx=0有非零解
- 若Am×nx=0有非零解 ,則其線性無關的解有n-r(A)個
- 若ξ1,ξ2,...,ξt 都是Ax=0的解,則k1ξ1+k2ξ2+...+ktξt仍是Ax=0的解
- Ax=0的基礎解系(能夠用它的線性組合表示出該方程組的任意一組解)
- ①ξ1,ξ2,...,ξt 是Ax=0的解;
- ②ξ1,ξ2,...,ξt 線性無關;
- ③ξ1,ξ2,...,ξt 可以表示Ax=0的任一解。或者證明出①②后,再證出t=n-r(A)
- 則稱ξ1,ξ2,...,ξt 是Ax=0的基礎解系
特征值和特征向量的求法:
特征值和特征向量的定義如下:
其中A是一個n×n的矩陣,x 是一個n維向量,則我們說λ是矩陣A的一個特征值,而 x 是矩陣A的特征值λ所對應的特征向量。
如果我們求出了矩陣A的n個特征值λ1≤λ2≤...≤λn,以及這n個特征值所對應的特征向量{w1,w2,...wn},如果這n個特征向量線性無關,那么矩陣A就可以用下式的特征分解表示:
其中W是這n個特征向量所張成的n×n維矩陣,並對n個特征向量標准化,而Σ為這n個特征值為主對角線的n×n維矩陣。若A為實對稱矩陣,另有
同時W的n個特征向量為標准正交基,注意到要進行特征分解,矩陣A必須為方陣。
類似於這樣的分解:
奇異值分解
奇異值分解是一種矩陣因子分解方法,是線性代數概念,但在統計學習中被廣泛使用,成為其重要工具。
應用:主成分分析、潛在語義分析
任意一個m×n的,都可以表示為三個矩陣的乘積(因子分解)形式,分別是m階正交矩陣、由降序排列的非負對角線元素組成的m×n矩形對角矩陣和n階正交矩陣,稱為該矩陣的奇異值分解。
矩陣的奇異值分解一定存在,但不唯一。奇異值分解可以看做矩陣數據壓縮的一種方法。
矩陣的奇異值分解是指,將一個非零的m×n實矩陣A,A∈Rm×n,表示為以下三個實矩陣乘積形式的運算,即進行矩陣的因子分解:
其中U是m階正交矩陣,V是n階正交矩陣,Σ是由降序排列的非負的對角元素組成的m×n矩形對角矩陣,滿足:
UΣVT 稱為矩陣A的奇異值分解,σi 稱為矩陣A的奇異值,U的列向量稱為左奇異向量,V的列向量稱為右奇異向量。
注意奇異值分解不要求矩陣A是方陣
奇異值分解實例
給定一個5×4的矩陣
它的奇異值分解由三個矩陣的乘積UΣVT 給出,矩陣U,Σ,VT 分別為
矩陣Σ是對角矩陣,對角線外的元素都是0,對角線上的元素非負,按降序排列。矩陣U和矩陣V是正交矩陣,它們與各自的轉置矩陣相乘是單位矩陣,即
矩陣的奇異值分解不是唯一的。在此例中如果選擇U為
而Σ和V不變,那么UΣVT 也是A的一個奇異值分解
SVD也是對矩陣進行分解,但是和特征分解不同,SVD並不要求要分解的矩陣為方陣。假設我們的矩陣A是一個m×n的矩陣,那么我們定義矩陣A的SVD為:
其中U是一個m×m的矩陣,Σ是一個m×n的矩陣,除了主對角線上的元素以外全為0,主對角線上的每個元素都稱為奇異值,V是一個n×n的矩陣。下圖可以很形象的看出上面SVD的定義:
下面是使用特征值分解實現的PCA算法:
# 將數據轉換到上述K個特征向量構建的新空間中 import numpy as np def PCA(X, k): m_samples, n_features = X.shape # 減去平均數 mean = np.array([np.mean(X[:, i]) for i in range(n_features)]) normX = X - mean # 計算協方差矩陣 scatter_matrix = np.dot(np.transpose(normX), normX) # 計算協方差矩陣的特征值和特征向量 eig_val, eig_vec = np.linalg.eig(scatter_matrix) # 將特征值和特征向量組成一個元組 eig_pairs = [(np.abs(eig_val[i]), eig_vec[:, i]) for i in range(n_features)] # 將特征值和特征向量從大到小排序 # 默認為升序,reverse = True降序 eig_pairs.sort(reverse=True) # #保留最大的K個特征向量 ft = [] for i in range(k): ft.append(list(eig_pairs[i][1])) data = np.dot(normX, np.array(ft).T) return data from sklearn.datasets import load_iris iris = load_iris() features = iris.data labels = iris.target features = PCA(features,k=2) import matplotlib.pyplot as plt plt.scatter(features[:,0],features[:,1],c=labels,cmap=plt.cm.RdYlBu) plt.show()
通過SVD實現PCA分解:
import numpy as np
# 實現PCA對鳶尾花數據進行降維
def PCA(data, k=2):
data = data - np.mean(data)
cov = np.cov(data.T)
u, s, v = np.linalg.svd(cov)
u_reduce = u[:, :k] # 取前k個特征向量
v_reduce = v[:k,:]
# 這兩種算法都可以對數據進行降維
Z = np.dot(data,u_reduce)
ZZ = np.dot(data,v_reduce.T)
return Z
from sklearn.datasets import load_iris
iris = load_iris()
features = iris.data
labels = iris.target
print(features.shape)
features = PCA(features,k=2)
print(features.shape)
import matplotlib.pyplot as plt
plt.scatter(features[:,0],features[:,1],c=labels,cmap=plt.cm.RdYlBu)
plt.show()