MachineLearning(8)-PCA,LDA基礎+sklearn 簡單實踐

PCA,LDA基礎+sklearn 簡單實踐

  • 1.PCA+sklearn.decomposition.PCA
    • 1.PCA理論基礎
    • 2.sklearn.decomposition.PCA簡單實踐
  • 2.LDA+sklearn.discriminant_analysis.LinearDiscriminantAnalysis
    • 2.1 LDA理論基礎
    • 2.2 sklearn LDA簡單實踐

在這里插入圖片描述

1.PCA+sklearn.decomposition.PCA

1.PCA理論基礎

PCA:(principal component analysis)無監督線性降維算法,通過投影減少數據的特征數。投影方向是數據投影后方差最大的方向(重構誤差最小的方向/坐標軸相關度)

投影方差最大理論:在信號處理中認為信號具有較大的方差,噪聲有較小的方差,信噪比就是信號與噪聲的方差比,越大越好。

最小平方理論:點到線的距離平方和越小越好(具體推導)。

兩種理論都能推出同一個算法:協方差矩陣求均值。

step1:原特征向量去中心化:x=x^?x ̄x=\hat{x}-\overline{x}x=x^?x,去中心化,使得投影后的樣本均值為0;

step2: 投影后求方差,uuu投影方向的單位向量:uTx?uTx=>uTx?xTu=>∑iuTxi?xiTu=uT∑uu^Tx*u^Tx=>u^Tx*x^Tu=>\sum_i u^Tx_i*x_i^Tu=u^T\sum uuTx?uTx=>uTx?xTu=>i?uTxi??xiT?u=uTu(單個樣本方差=>all sample方差);

step3:帶約束問題拉格朗日乘子法:uT∑u+λ(1?uTu)u^T\sum u+\lambda(1-u^Tu)uTu+λ(1?uTu)

step4:求最大,對上式求導為0 : ∑u=λu\sum u = \lambda uu=λu

由上式子可得最大投影方向為協方差矩陣的最大特征值對的特征向量,依次類推,可以得到第二大投影方向,第k大投影方向。

取特征值topk大的k個特征向量,組成一個kn的投影矩陣M,Mx可以得到k*1維的向量,作為原來向量的低維度的等價表示形式。

2.sklearn.decomposition.PCA簡單實踐

如果數據的各個維度的特征不一致,需要先做Z-sore Normalization(減均值除方差)。具體原因可參考博文:https://www.jianshu.com/p/c21c0e2c403a

sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)

PCA對象的初始化參數
n_componentsnums/ string,default=None,所有成分被保留。 n_components > 1降維后的維度;0< n_components<1將自動選取特征個數n,使得滿足所要求的方差百分比。
copy是否在運行算法時,將原始訓練數據復制一份
whiten是否對降維后的數據的每個特征進行歸一化
PCA對象方法
fit(x)用x訓練PCA 對象pca.fit(x)
transform(x)訓練好PCA對象后用pca.transform(x)進行降維
fit_transform(x)用x來訓練PCA模型,同時返回降維后的數據x_reduced= pca.fit_transform(x)
inverse_transform()將降維后的數據轉換成原始數據 x = pca.inverse_transform(x_reduced)
PCA對象的屬性
pca.components_k個特征向量
pca.n_components_特征向量的數量 k
pca.explained_variance_往各個特征向量方向投影后的方差
pca.explained_variance_ratio_各個特征值占總特征值的比例 ?

鳶尾花降維算法demo:鳶尾花數據特征是4維的,共三類樣本。

import matplotlib.pyplot as plt
import sklearn.decomposition as dp
from sklearn.datasets.base import load_iris
from mpl_toolkits.mplot3d import Axes3D
plt.switch_backend('agg')# 鳶尾花數據一共有三個類別
n = 3  # 降到n維度
x,y=load_iris(return_X_y=True)
pca=dp.PCA(n_components=n)reduced_x=pca.fit_transform(x)# PCA對象的一些屬性
print(pca.explained_variance_ratio_,sum(pca.explained_variance_ratio_)) # 各個特征值占總特征值的比例?
print(pca.explained_variance_)  # 各個特征向量方向投影后的方差
print(pca.n_components_)  # 特征向量的數量 k
print(pca.components_)  # k個特征向量red_x,red_y,red_z = [], [], []
blue_x,blue_y, blue_z = [], [], []
green_x,green_y, green_z = [], [], []# 將同一個類別的數據繪制成同一個元素
for i in range(len(reduced_x)): if y[i]==0:red_x.append(reduced_x[i][0])red_y.append(reduced_x[i][1])red_z.append(reduced_x[i][2])elif y[i]==1:blue_x.append(reduced_x[i][0])blue_y.append(reduced_x[i][1])blue_z.append(reduced_x[i][2])else:green_x.append(reduced_x[i][0])green_y.append(reduced_x[i][1])green_z.append(reduced_x[i][2])
figure = plt.figure()
ax1 = figure.add_subplot(1,2,1)
ax2 = figure.add_subplot(1,2,2,projection='3d')# 兩個主成分,二維圖像
ax1.scatter(red_x,red_y,c='r',marker='x')
ax1.scatter(blue_x,blue_y,c='b',marker='D')
ax1.scatter(green_x,green_y,c='g',marker='.')# 三個主成分,三維圖像,更高維度的不好顯示
ax2.scatter3D(red_x,red_y,red_z,c='r',marker='x')
ax2.scatter3D(blue_x,blue_y,blue_z, c='b',marker='D')
ax2.scatter3D(green_x,green_y,green_z, c='g',marker='.')
plt.savefig("./pca_iris_test.png")
plt.close()

輸出

[0.92461872 0.05306648 0.01710261] 0.9947878161267246
[4.22824171 0.24267075 0.0782095 ]
3
[[ 0.36138659 -0.08452251  0.85667061  0.3582892 ][ 0.65658877  0.73016143 -0.17337266 -0.07548102][-0.58202985  0.59791083  0.07623608  0.54583143]]```

在這里插入圖片描述

2.LDA+sklearn.discriminant_analysis.LinearDiscriminantAnalysis

2.1 LDA理論基礎

LDA–Linear Discriminant Analysis,線性判別分析。有監督的降維過程,依據類別選擇降維方向。
降維方向選擇依據:Fisher準則,類內離散程度越小,類間離散程度越大.
FDR=(μ1?μ2)2σ12+σ22FDR=\frac{(\mu_1-\mu_2)^2}{\sigma_1^2+\sigma_2^2}FDR=σ12?+σ22?(μ1??μ2?)2?

式中都是投影后的統統計量,引入投影前特征向量x和投影方向u:
(μ1?μ2)2=uT(μ ̄1?μ ̄2)(μ ̄1?μ ̄2)Tu:=uTSbu(\mu_1-\mu_2)^2=u^T(\overline\mu_1-\overline\mu_2)(\overline\mu_1-\overline\mu_2)^Tu := u^TS_bu(μ1??μ2?)2=uT(μ?1??μ?2?)(μ?1??μ?2?)Tu:=uTSb?u

σi2=uTΣiu?>σ12+σ22:=uTSwu\sigma_i^2=u^T\Sigma_iu->\sigma_1^2+\sigma_2^2:= u^TS_wuσi2?=uTΣi?u?>σ12?+σ22?:=uTSw?u

則FDR可以寫維:
FDR=uTSbuuTSwuFDR=\frac{u^TS_bu}{u^TS_wu}FDR=uTSw?uuTSb?u?

其中:類內散度矩陣:sw=Σ1+Σ2s_w=\Sigma_1+\Sigma_2sw?=Σ1?+Σ2?
類間散度矩陣:sb=(μ ̄1?μ ̄2)(μ ̄1?μ ̄2)s_b = (\overline\mu_1-\overline\mu_2)(\overline\mu_1-\overline\mu_2)sb?=(μ?1??μ?2?)(μ?1??μ?2?)

上式子為廣義瑞麗熵,有解析解:最優解的條件:
Sbu=λSwuS_b u=\lambda S_w uSb?u=λSw?u

二分類問題u=sw?1(μ ̄1?μ ̄2)(μ ̄1?μ ̄2)u=s_w^{-1}(\overline\mu_1-\overline\mu_2)(\overline\mu_1-\overline\mu_2)u=sw?1?(μ?1??μ?2?)(μ?1??μ?2?)
詳細推導不詳,參考資料:https://www.cnblogs.com/pinard/p/6244265.html

LDA key point:
1)找降維后最容易分類的方向
2)只能降到min(sample nums, class num-1), 二分類就只能降到1維。

2.2 sklearn LDA簡單實踐

def demo_lda(x,y,n=3):lda = LinearDiscriminantAnalysis(n_components=n)lda.fit(x,y)reduced_x = lda.transform(x)index_list = []for i in range(n):index_list.append("com%d"%i)reduced_data = pd.DataFrame(reduced_x, columns = index_list)reduced_data["label"] = yreduced_data.to_csv("lda_%dcom_open.csv"%n)red_x,red_y = [], []blue_x,blue_y = [], []green_x,green_y = [], []# 將同一個類別的數據繪制成同一個元素for i in range(len(reduced_x)): if y[i]==0:red_x.append(reduced_x[i][0])red_y.append(reduced_x[i][1])elif y[i]==1:blue_x.append(reduced_x[i][0])blue_y.append(reduced_x[i][1])else:green_x.append(reduced_x[i][0])green_y.append(reduced_x[i][1])figure = plt.figure()ax1 = figure.add_subplot(1,2,1)# 兩個主成分,二維圖像ax1.scatter(red_x,red_y,c='r',marker='x')ax1.scatter(blue_x,blue_y,c='b',marker='D')ax1.scatter(green_x,green_y,c='g',marker='.')plt.savefig("./lda_iris_test.png")plt.close()if __name__ == "__main__":n = 2  # 降到n維度x,y=load_iris(return_X_y=True)demo_lda(x,y,n)

在這里插入圖片描述

參考博文:
PCA:
https://blog.csdn.net/u012102306/article/details/52294726
https://www.cnblogs.com/youngsea/p/9334773.html
https://www.jb51.net/article/181205.htm
LDA:
https://zhuanlan.zhihu.com/p/161556242
sklearn 中的降維算法:https://www.cnblogs.com/LUOyaXIONG/gallery/image/259967.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444946.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444946.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444946.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

引用變量和引用數組

前兩天沒事干,重拾C++的一些書籍,翻到引用這,無意寫了些DD: 其實引用和指針有很多相似的地方,又有不同的(太多了,不過說到效率上,比如函數傳參數,我們可以用引用,指針,哪種好呢,引用不必為站再分配空間了,而指針還學要分配4字節的空間給指針變量) 我們知道如何…

leetcode198 打家劫舍

你是一個專業的小偷&#xff0c;計劃偷竊沿街的房屋。每間房內都藏有一定的現金&#xff0c;影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統&#xff0c;如果兩間相鄰的房屋在同一晚上被小偷闖入&#xff0c;系統會自動報警。 給定一個代表每個房屋存放金額的…

linux下的RPC

一、概述 在傳統的編程概念中&#xff0c;過程是由程序員在本地編譯完成&#xff0c;并只能局限在本地運行的一段代碼&#xff0c;也即其主程序和過程之間的運行關系是本地調用關系。因此這種結構在網絡日益發展的今天已無法適應實際需求。總而言之&#xff0c;傳統過程調用模式…

算法(28)--矩陣搜索系列

矩陣搜索1.leetcode-200. 島嶼數量2.leetcode-695. 島嶼的最大面積3.leetcode-463. 島嶼的周長4.劍指 Offer 12. 矩陣中的路徑5.leetcode-329. 矩陣中的最長遞增路徑6.leetcode-1091. 二進制矩陣中的最短路徑1.leetcode-200. 島嶼數量 給你一個由 ‘1’&#xff08;陸地&#…

leetcode213 打家劫舍II

你是一個專業的小偷&#xff0c;計劃偷竊沿街的房屋&#xff0c;每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈&#xff0c;這意味著第一個房屋和最后一個房屋是緊挨著的。同時&#xff0c;相鄰的房屋裝有相互連通的防盜系統&#xff0c;如果兩間相鄰的房屋在同一晚…

linux下安裝boost

以下是在ubuntu 7.10 (內核 2.6.22-14)下安裝的例子&#xff1a; 一、下載最新的 boost 庫&#xff0c;下載地址&#xff1a; http://www.boost.org/users/download/ 二、在適當的位置解壓 boost 庫&#xff0c;推薦把 boost 庫解壓到 /usr/local/ 下&#xff1a; $ cd dowlo…

PaperNotes(4)-高質量圖像生成-CGAN-StackGAN-Lapgan-Cyclegan-Pix2pixgan

cgan,stackgan,lapgan,cyclegan,pix2pixgan1.Conditional GAN1.1簡介1.2網絡結構與訓練1.3特點與用途2.Stack GAN2.1簡介2.2網絡結構與訓練2.3特點與用途3.Lap GAN3.1簡介3.2網絡結構與訓練3.3特點與用途4.Pix2pix GAN4.1 簡介4.2 網絡結構和訓練4.3 特點和用途5.Patch GAN6.Cy…

關于c++的一些案例

之前做項目的時候,有時候會用到位,也就是將一些數據放在二進制里,然后存在數據庫中或者緩存在服務器上,取出來,然后要判斷某位是不是置0或1,然后再將某位置0或1(比如領多個獎勵的 游戲邏輯),之前有點傻,竟然用 << ,>>這些運算符計算,今天翻起以前好久不…

C++(1)--概況、開發工具、hello word

簡介1. 概況2. 開發工具3. mac 寫hello word4. c 基本概念5.兩個數相加代碼分解5.1編譯預處理命令# include5.2輸入輸出庫iostream6.注釋7.編碼規范《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》1. 概況 20世紀70年代&a…

class 和 struct的區別

C中的struct對C中的struct進行了擴充&#xff0c;它已經不再只是一個包含不同數據類型的數據結構了&#xff0c;它已經獲取了太多的功能。 struct能包含成員函數嗎&#xff1f; 能&#xff01; struct能繼承嗎&#xff1f; 能&#xff01;&#xff01; struct能實現多態嗎&…

leetcode206 反轉鏈表

反轉一個單鏈表。 示例: 輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2->1->NULL 進階: 你可以迭代或遞歸地反轉鏈表。你能否用兩種方法解決這道題&#xff1f; 經典題不解釋 /*** Definition for singly-linked list.* public class ListNode…

淺議柔性數組

很多時候,柔性數組應用在了變長結構體中,如: StructPacket {Int state; Int len;

leetcode 152 乘積最大子序列

給定一個整數數組 nums &#xff0c;找出一個序列中乘積最大的連續子序列&#xff08;該序列至少包含一個數&#xff09;。 示例 1: 輸入: [2,3,-2,4] 輸出: 6 解釋: 子數組 [2,3] 有最大乘積 6。 示例 2: 輸入: [-2,0,-1] 輸出: 0 解釋: 結果不能為 2, 因為 [-2,-1] 不是子…

PaperNotes(5)-Conditional Generative Adversarial Nets

Conditional GAN 論文閱讀筆記Abstract1 Introduction2 Related Work3 Conditional Adversarial Nets3.1 Generative Adversarial Nets3.2 Conditional Adversarial Nets4 Experimental Results4.1 Unimodal4.2 Multimodal5 Future Work6.思考文章地址&#xff1a;https://arxi…

蛙泳姿勢教學

偶爾看到分享的一篇日志&#xff0c;記錄下&#xff0c;忙過這段時間努力學蛙泳。 蛙泳配合有一個順口溜&#xff0c;在講解蛙泳動作要領之前先介紹給大家&#xff1a;“劃手腿不動&#xff0c;收手再收腿&#xff0c;先伸胳膊后蹬腿&#xff0c;并攏伸直漂一會兒。”從順口溜中…

leetcode238 除本身以外數組的乘積

給定長度為 n 的整數數組 nums&#xff0c;其中 n > 1&#xff0c;返回輸出數組 output &#xff0c;其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積。 示例: 輸入: [1,2,3,4] 輸出: [24,12,8,6] 說明: 請不要使用除法&#xff0c;且在 O(n) 時間復雜度內完…

C 和c++的一些雜想,想到哪兒寫到哪兒

關于C和c++一直有好多的程序猿在研究,研究區別研究相似的地方,究竟用那個預言好,沒有確定的說法,要看你做什么了。 初始化操作: 在初始化的時候,我們都知道C語言一般都是這樣處理的: int a=12; C++ 呢,除了這樣復制初始化之外還可以直接初始化: int a(12); 啊…

C++(2)--mac使用VScode 進行C++編譯、運行、調試

mac 使用VScode 進行C開發1.編譯的基礎概念2. mac 編譯c代碼2.1 查看編譯器情況2.2 安裝插件C/C&#xff0c;C/C Clang Command Adapte2.3新建一個C project2.3.1本地新建文件夾2.3.2新建mian.cpp文件2.3.3 編寫hello word demo2.4 代碼編譯&#xff0c;運行&#xff0c;調試2.…

boost庫linux編譯安裝

0.下載 1.解壓boost_1_49_0.tar.g然后放到/opt/ 2. 進入解壓后的文件夾 cd /opt/boost_1_49_0 3.將boost安裝配置在/boost/prefix目錄下 不過之前先 mkdir -p /boost/prefix

leetcode136 只出現一次的數字

給定一個非空整數數組&#xff0c;除了某個元素只出現一次以外&#xff0c;其余每個元素均出現兩次。找出那個只出現了一次的元素。 說明&#xff1a; 你的算法應該具有線性時間復雜度。 你可以不使用額外空間來實現嗎&#xff1f; 示例 1: 輸入: [2,2,1] 輸出: 1 示例 2: …