機器學習-特徵值,svd分解

 

求矩陣的秩


,已知r(A)=2,則參數x,y分別是html

 

解:任意三階子式=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就能夠用下式的特徵分解表示: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的定義:

 

下面是使用特徵值分解實現的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()

 

原文出處:https://www.cnblogs.com/TimVerion/p/11237933.html

相關文章
相關標籤/搜索