日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

线性判别分析LDA算法与python实现

發布時間:2023/12/31 python 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线性判别分析LDA算法与python实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??降維指的是通過某種數學變換將高維原始空間的屬性轉變為低維子空間,根據變換形式可將該數學變換分為線性變換和非線性變換,對應的降維算法也被稱為線性降維和非線性降維.其中,線性降維算法主要有線性判別分析(linear discriminant analysis,LDA)和主成分分析(Principal Component Analysis,PCA),非線性降維主要有核化思想(如Kernelized PCA)和流形學習(Isomap,LLE,LE等)兩類.
??假定有原始空間高維數據X∈Rn×mX \in R^{n \times m}XRn×m,其中nnn為樣本數,mmm為樣本長度,現我們要求XXX的低維嵌入Y∈Rn×dY \in R^{n \times d}YRn×d,其中d<<md<<md<<m.線性降維的思想就是求一個權重矩陣W∈Rm×dW \in R^{m \times d}WRm×d,使用WWWXXX進行線性變換Y=XWY=XWY=XW,使得變換前后的數據分布一致.如上所述,LDA和PCA都是線性降維算法,不同的是LDA是監督學習算法,而PCA是面向無標簽的數據樣本.本文介紹LDA算法.

??首先盜用西瓜書里的一張圖,這張圖很清晰地闡釋了LDA的核心思想:圖中的數據簡化為二維降維到一維,降維過程中,LDA算法使得低維空間中,同一類的數據盡可能接近,使得不同類數據盡可能遠離.如上文所述,LDA是一種監督學習算法,即數據具有label,這里與西瓜書保持一致,使用了二分類問題的數據,分別記為X0∈Rn0×mX_0 \in R^{n_0 \times m}X0?Rn0?×mX1∈Rn1×mX_1 \in R^{n_1 \times m}X1?Rn1?×m.我們的目標是找到一個變換矩陣W∈Rm×dW \in R^{m \times d}WRm×d對原始數據XXX進行線性變換Y=XWY=XWY=XW,且變換后的YYY滿足上述性質.記μ0∈Rm×1,μ1∈Rm×1,Σ0∈Rm×m,Σ1∈Rm×m\mu_0 \in R^{m \times 1},\mu_1 \in R^{m \times 1},\Sigma_0 \in R^{m \times m},\Sigma_1 \in R^{m \times m}μ0?Rm×1,μ1?Rm×1,Σ0?Rm×m,Σ1?Rm×m分別為X0X_0X0?的均值,X1X_1X1?的均值,X0X_0X0?的協方差,X1X_1X1?的協方差,則: μi=1ni∑x∈Xix\mu_i=\frac{1}{n_i} \sum_{x \in X_i} xμi?=ni?1?xXi??x Σi=∑x∈Xi(x?μi)(x?μi)T\Sigma_i=\sum_{x \in X_i}(x-\mu_i)(x-\mu_i)^TΣi?=xXi??(x?μi?)(x?μi?)T 首先我們希望變換后的類間距離越大越好,我們定義類間距離為類中心的l2l_2l2?距離,所以該步驟我們的目標是: maxW∣∣WTμ0?WTμ1∣∣22{\rm max}_W \ ||W^T\mu_0-W^T\mu_1||_2^2maxW??WTμ0??WTμ1?22? 即:maxWWT(μ0?μ1)(μ0?μ1)TW{\rm max}_W \ W^T(\mu_0-\mu_1)(\mu_0-\mu_1)^T WmaxW??WT(μ0??μ1?)(μ0??μ1?)TW 其次我們希望變換后的類內協方差越小越好,即: minWWT(Σ0+Σ1)W{\rm min}_W W_T (\Sigma_0+\Sigma_1) WminW?WT?(Σ0?+Σ1?)W ??現定義兩個矩陣,類內散度矩陣(intra-class scatter matrix) Sa∈Rm×mS_a \in R^{m \times m}Sa?Rm×m與類間散度矩陣(inter-class scatter matrix) Sr∈Rm×mS_r \in R^{m \times m}Sr?Rm×m:Sa=Σ0+Σ1S_a=\Sigma_0+\Sigma_1Sa?=Σ0?+Σ1? Sr=(μ0?μ1)(μ0?μ1)TS_r=(\mu_0-\mu_1)(\mu_0-\mu_1)^TSr?=(μ0??μ1?)(μ0??μ1?)T 我們約束WTSaW=1W^T S_a W=1WTSa?W=1,所以最后的優化問題可以寫成: minW?WTSrW{\rm min}_W \ -W^T S_r WminW???WTSr?W st.WTSaW=1st. \ \ W^T S_a W=1st.??WTSa?W=1 定義拉格朗日函數為: L(W)=?WTSrW+λ(WTSaW?1)L(W)=-W^T S_r W + \lambda (W^T S_a W-1)L(W)=?WTSr?W+λ(WTSa?W?1) 對上述方程求WWW的偏導,得到: SrW=λSaWS_rW=\lambda S_aWSr?W=λSa?W 由上式可知,W∈Rm×dW \in R^{m \times d}WRm×d的閉解為矩陣Sa?1SrS_a^{-1}S_rSa?1?Sr?最大的ddd個特征值對應的mmm維特征向量.這里公布一下代碼和實驗結果,代碼略簡略,只考慮了三維降到二維.

import numpy as np import matplotlib.pyplot as plt from sklearn.datasets.samples_generator import make_classification from mpl_toolkits.mplot3d import Axes3D np.random.seed(0)def createDataSet(n=100):X0 = np.array(np.random.random((n, 3)) + 1)X1 = np.array(np.random.random((n, 3)) - 1)return X0, X1def compute_W(X0, X1):mean0 = np.mean(X0, axis=0)mean1 = np.mean(X1, axis=0)diff = np.expand_dims(mean0 - mean1, axis = 1)Sr = np.matmul(diff, diff.T)cov0 = np.matmul((X0 - mean0).T, (X0 - mean0))cov1 = np.matmul((X1 - mean1).T, (X1 - mean1))Sa = cov0 + cov1# print(Sa)tmp = np.matmul(np.linalg.pinv(Sa), Sr)# tmp = np.matmul(np.linalg.pinv(-Sr), Sa)eig_val, eig_vector = np.linalg.eig(tmp)return eig_vector[:, [0,1]]def LDA(X0, X1):W = compute_W(X0, X1)return np.matmul(X0, W), np.matmul(X1, W)if __name__ == '__main__':X0, X1 = createDataSet()Y0, Y1 = LDA(X0, X1)fig = plt.figure()ax = fig.add_subplot(121, projection='3d')ax.scatter(X0[:, 0], X0[:, 1], X0[:, 2], c=[1,0,0], cmap=plt.cm.hot)ax.scatter(X1[:, 0], X1[:, 1], X1[:, 2], c=[0,0,1], cmap=plt.cm.hot)ax2 = fig.add_subplot(122)ax2.scatter(Y0[:, 0], Y0[:, 1], c=[1,0,0], cmap=plt.cm.hot)ax2.scatter(Y1[:, 0], Y1[:, 1], c=[0,0,1], cmap=plt.cm.hot)plt.show()


??在LDA中,我們約束WTSaW=1W^T S_a W=1WTSa?W=1,可能是提出算法的學者覺得類內相似對比類間差異不那么重要吧,現在我們探索一下另一種情況,我們約束WTSrW=1W^T S_r W=1WTSr?W=1,那么優化問題變成了:minWWTSaW{\rm min}_W \ W^T S_a WminW??WTSa?W st.WTSrW=1st. \ \ W^T S_r W=1st.??WTSr?W=1 定義拉格朗日函數為: L(W)=WTSaW+λ(WTSrW?1)L(W)=W^T S_a W + \lambda (W^T S_r W-1)L(W)=WTSa?W+λ(WTSr?W?1) 對上述方程求WWW的偏導,得到: ?SaW=λSrW-S_aW=\lambda S_rW?Sa?W=λSr?W 由上式可知,W∈Rm×dW \in R^{m \times d}WRm×d的閉解為矩陣?Sr?1Sa-S_r^{-1}S_a?Sr?1?Sa?最大的ddd個特征值對應的mmm維特征向量.代碼中只需將21行注釋,并恢復22行即可,下圖展示了用這種約束得到的實驗結果,可以看出兩種約束并沒有什么很大的差異,當然可能在高階上第一種方法表現更優異,這里就不往下探索了.

總結

以上是生活随笔為你收集整理的线性判别分析LDA算法与python实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。