Python機(jī)器學(xué)習(xí)應(yīng)用之基于線性判別模型的分類篇詳解
一、Introduction
線性判別模型(LDA)在模式識別領(lǐng)域(比如人臉識別等圖形圖像識別領(lǐng)域)中有非常廣泛的應(yīng)用。LDA是一種監(jiān)督學(xué)習(xí)的降維技術(shù),也就是說它的數(shù)據(jù)集的每個(gè)樣本是有類別輸出的。這點(diǎn)和PCA不同。PCA是不考慮樣本類別輸出的無監(jiān)督降維技術(shù)。 LDA的思想可以用一句話概括,就是“投影后類內(nèi)方差最小,類間方差最大”。我們要將數(shù)據(jù)在低維度上進(jìn)行投影,投影后希望每一種類別數(shù)據(jù)的投影點(diǎn)盡可能的接近,而不同類別的數(shù)據(jù)的類別中心之間的距離盡可能的大。即:將數(shù)據(jù)投影到維度更低的空間中,使得投影后的點(diǎn),會形成按類別區(qū)分,一簇一簇的情況,相同類別的點(diǎn),將會在投影后的空間中更接近方法。
1 LDA的優(yōu)點(diǎn)
- 在降維過程中可以使用類別的先驗(yàn)知識經(jīng)驗(yàn),而像PCA這樣的無監(jiān)督學(xué)習(xí)則無法使用類別先驗(yàn)知識;
- LDA在樣本分類信息依賴均值而不是方差的時(shí)候,比PCA之類的算法較優(yōu)
2 LDA的缺點(diǎn)
- LDA不適合對非高斯分布樣本進(jìn)行降維,PCA也有這個(gè)問題
- LDA降維最多降到類別數(shù) k-1 的維數(shù),如果我們降維的維度大于 k-1,則不能使用 LDA。當(dāng)然目前有一些LDA的進(jìn)化版算法可以繞過這個(gè)問題
- LDA在樣本分類信息依賴方差而不是均值的時(shí)候,降維效果不好
- LDA可能過度擬合數(shù)據(jù)
3 LDA在模式識別領(lǐng)域與自然語言處理領(lǐng)域的區(qū)別
在自然語言處理領(lǐng)域,LDA是隱含狄利克雷分布,它是一種處理文檔的主題模型。本文討論的是線性判別分析 LDA除了可以用于降維以外,還可以用于分類。一個(gè)常見的LDA分類基本思想是假設(shè)各個(gè)類別的樣本數(shù)據(jù)符合高斯分布,這樣利用LDA進(jìn)行投影后,可以利用極大似然估計(jì)計(jì)算各個(gè)類別投影數(shù)據(jù)的均值和方差,進(jìn)而得到該類別高斯分布的概率密度函數(shù)。當(dāng)一個(gè)新的樣本到來后,我們可以將它投影,然后將投影后的樣本特征分別帶入各個(gè)類別的高斯分布概率密度函數(shù),計(jì)算它屬于這個(gè)類別的概率,最大的概率對應(yīng)的類別即為預(yù)測類別
二、Demo
#%%導(dǎo)入基本庫 # 基礎(chǔ)數(shù)組運(yùn)算庫導(dǎo)入 import numpy as np # 畫圖庫導(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ù)測 X_new = lda.transform(X) # 可視化預(yù)測數(shù)據(jù) plt.scatter(X_new[:, 0], X_new[:, 1], marker='o', c=y) plt.show()
#%%使用新的數(shù)據(jù)進(jìn)行測試 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)入庫函數(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ù)測指標(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)練集和測試集 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對手寫數(shù)字進(jìn)行訓(xùn)練與預(yù)測 m_lda = LinearDiscriminantAnalysis()# 建立 LDA 模型 # 進(jìn)行模型訓(xùn)練 m_lda.fit(x, y) # 進(jìn)行模型預(yù)測 x_new = m_lda.transform(x) # 可視化預(yù)測數(shù)據(jù) plt.scatter(x_new[:, 0], x_new[:, 1], marker='o', c=y) plt.title('MNIST with LDA Model') plt.show()
#%% 進(jìn)行測試集數(shù)據(jù)的類別預(yù)測 y_test_pred = m_lda.predict(test_x) print("測試集的真實(shí)標(biāo)簽:\n", test_y) print("測試集的預(yù)測標(biāo)簽:\n", y_test_pred) #%% 進(jìn)行預(yù)測結(jié)果指標(biāo)統(tǒng)計(jì) 統(tǒng)計(jì)每一類別的預(yù)測準(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ù)測類別 ax.set_xlabel('predict') # y軸實(shí)際類別 ax.set_ylabel('true') plt.show()
四、小結(jié)
LDA適用于線性可分?jǐn)?shù)據(jù),在非線性數(shù)據(jù)上要謹(jǐn)慎使用。 886~~~
到此這篇關(guān)于Python機(jī)器學(xué)習(xí)應(yīng)用之基于線性判別模型的分類篇詳解的文章就介紹到這了,更多相關(guān)Python 線性判別模型的分類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python調(diào)用REST API接口的幾種方式匯總
這篇文章主要介紹了Python調(diào)用REST API接口的幾種方式匯總,幫助大家更好的利用python進(jìn)行自動化運(yùn)維,感興趣的朋友可以了解下2020-10-10Django+Nginx+uWSGI 定時(shí)任務(wù)的實(shí)現(xiàn)方法
本文主要介紹了Django+Nginx+uWSGI 定時(shí)任務(wù)的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01PyQt5 QSerialPort子線程操作的實(shí)現(xiàn)
這篇文章主要介紹了PyQt5 QSerialPort子線程操作的實(shí)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04selenium+python實(shí)現(xiàn)基本自動化測試的示例代碼
這篇文章主要介紹了selenium+python實(shí)現(xiàn)基本自動化測試的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01pyinstaller打包可執(zhí)行文件出現(xiàn)KeyError的問題
這篇文章主要介紹了pyinstaller打包可執(zhí)行文件出現(xiàn)KeyError的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11Python?Scala中使用def語句定義方法的詳細(xì)過程
這篇文章主要介紹了Python?Scala中使用def語句定義方法,Scala的方法是類的一部分,而函數(shù)是一個(gè)對象可以賦值給一個(gè)變量,下面來講解Scala的方法,需要的朋友可以參考下2022-09-09python 實(shí)現(xiàn)單通道轉(zhuǎn)3通道
今天小編就為大家分享一篇python 實(shí)現(xiàn)單通道轉(zhuǎn)3通道,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12?分享一個(gè)Python?遇到數(shù)據(jù)庫超好用的模塊
這篇文章主要介紹了?分享一個(gè)Python?遇到數(shù)據(jù)庫超好用的模塊,SQLALchemy這個(gè)模塊,該模塊是Python當(dāng)中最有名的ORM框架,該框架是建立在數(shù)據(jù)庫API之上,使用關(guān)系對象映射進(jìn)行數(shù)據(jù)庫的操作,,需要的朋友可以參考下2022-04-04