設 ,已知r(A)=2,則參數x,y分別是
html
解:任意三階子式=0,有二階子式≠0,可是這些子式比較多,可使用初等變換,由於初等變換不改變矩陣的秩,能夠將矩陣經過初等行(列)變換,化爲行階梯矩陣,有幾行不等於0,秩就是幾。算法
其中A是一個n×n的矩陣,x 是一個n維向量,則咱們說λ是矩陣A的一個特徵值,而 x 是矩陣A的特徵值λ所對應的特徵向量。
若是咱們求出了矩陣A的n個特徵值λ1≤λ2≤...≤λn,以及這n個特徵值所對應的特徵向量{w1,w2,...wn},若是這n個特徵向量線性無關,那麼矩陣A就能夠用下式的特徵分解表示:app
其中W是這n個特徵向量所張成的n×n維矩陣,並對n個特徵向量標準化,而Σ爲這n個特徵值爲主對角線的n×n維矩陣。若A爲實對稱矩陣,另有工具
同時W的n個特徵向量爲標準正交基,注意到要進行特徵分解,矩陣A必須爲方陣。學習
相似於這樣的分解:spa
奇異值分解是一種矩陣因子分解方法,是線性代數概念,但在統計學習中被普遍使用,成爲其重要工具。
應用:主成分分析、潛在語義分析
任意一個m×n的,均可以表示爲三個矩陣的乘積(因子分解)形式,分別是m階正交矩陣、由降序排列的非負對角線元素組成的m×n矩形對角矩陣和n階正交矩陣,稱爲該矩陣的奇異值分解。
矩陣的奇異值分解必定存在,但不惟一。奇異值分解能夠看作矩陣數據壓縮的一種方法。3d
矩陣的奇異值分解是指,將一個非零的m×n實矩陣A,A∈Rm×n,表示爲如下三個實矩陣乘積形式的運算,即進行矩陣的因子分解:code
其中U是m階正交矩陣,V是n階正交矩陣,Σ是由降序排列的非負的對角元素組成的m×n矩形對角矩陣,知足:orm
UΣVT 稱爲矩陣A的奇異值分解,σi 稱爲矩陣A的奇異值,U的列向量稱爲左奇異向量,V的列向量稱爲右奇異向量。htm
注意奇異值分解不要求矩陣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的定義:
# 將數據轉換到上述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()
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()
原文出處:https://www.cnblogs.com/TimVerion/p/11237933.html