網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一、Introduction
線性判別模型(LDA)在模式識(shí)別領(lǐng)域(比如人臉識(shí)別等圖形圖像識(shí)別領(lǐng)域)中有非常廣泛的應(yīng)用。LDA是一種監(jiān)督學(xué)習(xí)的降維技術(shù),也就是說(shuō)它的數(shù)據(jù)集的每個(gè)樣本是有類別輸出的。這點(diǎn)和PCA不同。PCA是不考慮樣本類別輸出的無(wú)監(jiān)督降維技術(shù)。 LDA的思想可以用一句話概括,就是“投影后類內(nèi)方差最小,類間方差最大”。我們要將數(shù)據(jù)在低維度上進(jìn)行投影,投影后希望每一種類別數(shù)據(jù)的投影點(diǎn)盡可能的接近,而不同類別的數(shù)據(jù)的類別中心之間的距離盡可能的大。即:將數(shù)據(jù)投影到維度更低的空間中,使得投影后的點(diǎn),會(huì)形成按類別區(qū)分,一簇一簇的情況,相同類別的點(diǎn),將會(huì)在投影后的空間中更接近方法。
1 LDA的優(yōu)點(diǎn)
- 在降維過(guò)程中可以使用類別的先驗(yàn)知識(shí)經(jīng)驗(yàn),而像PCA這樣的無(wú)監(jiān)督學(xué)習(xí)則無(wú)法使用類別先驗(yàn)知識(shí);
- LDA在樣本分類信息依賴均值而不是方差的時(shí)候,比PCA之類的算法較優(yōu)
2 LDA的缺點(diǎn)
- LDA不適合對(duì)非高斯分布樣本進(jìn)行降維,PCA也有這個(gè)問(wèn)題
- LDA降維最多降到類別數(shù) k-1 的維數(shù),如果我們降維的維度大于 k-1,則不能使用 LDA。當(dāng)然目前有一些LDA的進(jìn)化版算法可以繞過(guò)這個(gè)問(wèn)題
- LDA在樣本分類信息依賴方差而不是均值的時(shí)候,降維效果不好
- LDA可能過(guò)度擬合數(shù)據(jù)
3 LDA在模式識(shí)別領(lǐng)域與自然語(yǔ)言處理領(lǐng)域的區(qū)別
在自然語(yǔ)言處理領(lǐng)域,LDA是隱含狄利克雷分布,它是一種處理文檔的主題模型。本文討論的是線性判別分析 LDA除了可以用于降維以外,還可以用于分類。一個(gè)常見(jiàn)的LDA分類基本思想是假設(shè)各個(gè)類別的樣本數(shù)據(jù)符合高斯分布,這樣利用LDA進(jìn)行投影后,可以利用極大似然估計(jì)計(jì)算各個(gè)類別投影數(shù)據(jù)的均值和方差,進(jìn)而得到該類別高斯分布的概率密度函數(shù)。當(dāng)一個(gè)新的樣本到來(lái)后,我們可以將它投影,然后將投影后的樣本特征分別帶入各個(gè)類別的高斯分布概率密度函數(shù),計(jì)算它屬于這個(gè)類別的概率,最大的概率對(duì)應(yīng)的類別即為預(yù)測(cè)類別
二、Demo
#%%導(dǎo)入基本庫(kù) # 基礎(chǔ)數(shù)組運(yùn)算庫(kù)導(dǎo)入 import numpy as np # 畫圖庫(kù)導(dǎo)入 import matplotlib.pyplot as plt # 導(dǎo)入三維顯示工具 from mpl_toolkits.mplot3d import Axes3D # 導(dǎo)入LDA模型 from sklearn.discriminant_analysis import LinearDiscriminantAnalysis # 導(dǎo)入demo數(shù)據(jù)制作方法 from sklearn.datasets import make_classification #%%模型訓(xùn)練 # 制作四個(gè)類別的數(shù)據(jù),每個(gè)類別100個(gè)樣本 X, y = make_classification(n_samples=1000, n_features=3, n_redundant=0, n_classes=4, n_informative=2, n_clusters_per_class=1, class_sep=3, random_state=10) # 將四個(gè)類別的數(shù)據(jù)進(jìn)行三維顯示 fig = plt.figure() ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=20, azim=20) ax.scatter(X[:, 0], X[:, 1], X[:, 2], marker='o', c=y) plt.show()
#%%建立 LDA 模型 lda = LinearDiscriminantAnalysis() # 進(jìn)行模型訓(xùn)練 lda.fit(X, y) #%%查看lda的參數(shù) print(lda.get_params())
#%%數(shù)據(jù)可視化 #模型預(yù)測(cè) X_new = lda.transform(X) # 可視化預(yù)測(cè)數(shù)據(jù) plt.scatter(X_new[:, 0], X_new[:, 1], marker='o', c=y) plt.show()
#%%使用新的數(shù)據(jù)進(jìn)行測(cè)試 a = np.array([[-1, 0.1, 0.1]]) print(f"{a} 類別是: ", lda.predict(a)) print(f"{a} 類別概率分別是: ", lda.predict_proba(a)) a = np.array([[-12, -100, -91]]) print(f"{a} 類別是: ", lda.predict(a)) print(f"{a} 類別概率分別是: ", lda.predict_proba(a)) a = np.array([[-12, -0.1, -0.1]]) print(f"{a} 類別是: ", lda.predict(a)) print(f"{a} 類別概率分別是: ", lda.predict_proba(a)) a = np.array([[0.1, 90.1, 9.1]]) print(f"{a} 類別是: ", lda.predict(a)) print(f"{a} 類別概率分別是: ", lda.predict_proba(a))
三、基于LDA 手寫數(shù)字的分類
#%%導(dǎo)入庫(kù)函數(shù) # 導(dǎo)入手寫數(shù)據(jù)集 MNIST from sklearn.datasets import load_digits # 導(dǎo)入訓(xùn)練集分割方法 from sklearn.model_selection import train_test_split # 導(dǎo)入LDA模型 from sklearn.discriminant_analysis import LinearDiscriminantAnalysis # 導(dǎo)入預(yù)測(cè)指標(biāo)計(jì)算函數(shù)和混淆矩陣計(jì)算函數(shù) from sklearn.metrics import classification_report, confusion_matrix # 導(dǎo)入繪圖包 import seaborn as sns import matplotlib import matplotlib.pyplot as plt #%% 導(dǎo)入MNIST數(shù)據(jù)集 mnist = load_digits() # 查看數(shù)據(jù)集信息 print('The Mnist dataeset:\n',mnist) # 分割數(shù)據(jù)為訓(xùn)練集和測(cè)試集 x, test_x, y, test_y = train_test_split(mnist.data, mnist.target, test_size=0.1, random_state=2)
#%%## 輸出示例圖像 images = range(0,9) plt.figure(dpi=100) for i in images: plt.subplot(330 + 1 + i) plt.imshow(x[i].reshape(8, 8), cmap = matplotlib.cm.binary,interpolation="nearest") # show the plot plt.show()
#%%利用LDA對(duì)手寫數(shù)字進(jìn)行訓(xùn)練與預(yù)測(cè) m_lda = LinearDiscriminantAnalysis()# 建立 LDA 模型 # 進(jìn)行模型訓(xùn)練 m_lda.fit(x, y) # 進(jìn)行模型預(yù)測(cè) x_new = m_lda.transform(x) # 可視化預(yù)測(cè)數(shù)據(jù) plt.scatter(x_new[:, 0], x_new[:, 1], marker='o', c=y) plt.title('MNIST with LDA Model') plt.show()
#%% 進(jìn)行測(cè)試集數(shù)據(jù)的類別預(yù)測(cè) y_test_pred = m_lda.predict(test_x) print("測(cè)試集的真實(shí)標(biāo)簽:\n", test_y) print("測(cè)試集的預(yù)測(cè)標(biāo)簽:\n", y_test_pred) #%% 進(jìn)行預(yù)測(cè)結(jié)果指標(biāo)統(tǒng)計(jì) 統(tǒng)計(jì)每一類別的預(yù)測(cè)準(zhǔn)確率、召回率、F1分?jǐn)?shù) print(classification_report(test_y, y_test_pred)) # 計(jì)算混淆矩陣 C2 = confusion_matrix(test_y, y_test_pred) # 打混淆矩陣 print(C2) # 將混淆矩陣以熱力圖的防線顯示 sns.set() f, ax = plt.subplots() # 畫熱力圖 sns.heatmap(C2, cmap="YlGnBu_r", annot=True, ax=ax) # 標(biāo)題 ax.set_title('confusion matrix') # x軸為預(yù)測(cè)類別 ax.set_xlabel('predict') # y軸實(shí)際類別 ax.set_ylabel('true') plt.show()
四、小結(jié)
LDA適用于線性可分?jǐn)?shù)據(jù),在非線性數(shù)據(jù)上要謹(jǐn)慎使用。 886~~~
原文鏈接:https://blog.csdn.net/qq_43368987/article/details/122472515
相關(guān)推薦
- 2022-03-22 聚合函數(shù)和group?by的關(guān)系(理解group by 和聚合函數(shù))
- 2024-01-15 Mybatis 開(kāi)啟控制臺(tái)打印sql語(yǔ)句
- 2023-02-02 Nginx顯示500錯(cuò)誤的原因以及解決方法_nginx
- 2023-01-12 利用C#實(shí)現(xiàn)進(jìn)程管理器_C#教程
- 2022-05-15 C#內(nèi)置泛型委托之Action委托_C#教程
- 2022-04-12 python?獲取list?長(zhǎng)度_python
- 2022-05-04 配置Spring.Net框架開(kāi)發(fā)環(huán)境_實(shí)用技巧
- 2022-10-24 UI?開(kāi)源組件Flutter圖表范圍選擇器使用詳解_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支