運用sklearn進行線性判別分析(LDA)代碼實現

2021-01-08 紙鶴視界

基於sklearn的線性判別分析(LDA)代碼實現

一、前言及回顧

本文記錄使用sklearn庫實現有監督的數據降維技術——線性判別分析(LDA)。在上一篇LDA線性判別分析原理及python應用(葡萄酒案例分析),我們通過詳細的步驟理解LDA內部邏輯實現原理,能夠更好地掌握線性判別分析的內部機制。當然,在以後項目數據處理,我們有更高效的實現方法,這篇將記錄學習基於sklearn進行LDA數據降維,提高編碼速度,而且會感覺更加簡單。

LDA詳細介紹與各步驟實現請看上回:LDA線性判別分析原理及python應用(葡萄酒案例分析)。

學習之後可以對數據降維處理兩種實現方法進行對比:

無監督的PCA技術:主成分分析PCA數據降維原理及python應用(葡萄酒案例分析)有監督的LDA技術:LDA線性判別分析原理及python應用(葡萄酒案例分析)二、定義分類結果可視化函數

這個函數與上一篇文章 運用sklearn進行主成分分析(PCA)代碼實現 裡是一樣的,plot_decision_region函數在分類結果區別決策區域中可以復用。

def plot_decision_regions(x, y, classifier, resolution=0.02): markers = ['s', 'x', 'o', '^', 'v'] colors = ['r', 'g', 'b', 'gray', 'cyan'] cmap = ListedColormap(colors[:len(np.unique(y))]) x1_min, x1_max = x[:, 0].min() - 1, x[:, 0].max() + 1 x2_min, x2_max = x[:, 1].min() - 1, x[:, 1].max() + 1 xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution)) z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T) z = z.reshape(xx1.shape) plt.contourf(xx1, xx2, z, alpha=0.4, cmap=cmap) for idx, cc in enumerate(np.unique(y)): plt.scatter(x=x[y == cc, 0], y=x[y == cc, 1], alpha=0.6, c=cmap(idx), edgecolor='black', marker=markers[idx], label=cc)

三、10行代碼實現葡萄酒數據集分類

sklearn依然實現了LDA類方法,我們只需要直接調用而無需自己實現內部邏輯,這樣顯得更加方便。所以,10行代碼實現也不為過,重點需要先理解內部邏輯原理。

關鍵代碼如下:

lda = LDA(n_components=2)lr = LogisticRegression()x_train_lda = lda.fit_transform(x_train_std, y_train) # LDA是有監督方法,需要用到標籤x_test_lda = lda.fit_transform(x_test_std, y_test) # 預測時候特徵向量正負問題,乘-1反轉鏡像lr.fit(x_train_lda, y_train)plot_decision_regions(x_train_pca, y_train, classifier=lr)plt.xlabel('LD1')plt.ylabel('LD2')plt.legend(loc='lower left')plt.show()

使用訓練集擬合模型之後,分類效果如何呢?

可以看到模型對訓練數據集精確地分類,比PCA效果好,因為LDA使用了數據集的標籤,是有監督的學習。

更準確來說,我們要看模型在測試集上的效果,對比如下:

可見,經過邏輯回歸分類器,提取了兩個最具線性判別性的特徵,將包含13個特徵的葡萄酒數據集投影到二維子空間,實現了精確地分類。

四、完整代碼

from sklearn.linear_model import LogisticRegressionfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDAfrom sklearn.preprocessing import StandardScalerfrom sklearn.model_selection import train_test_splitfrom matplotlib.colors import ListedColormapimport matplotlib.pyplot as pltimport pandas as pdimport numpy as np def plot_decision_regions(x, y, classifier, resolution=0.02): markers = ['s', 'x', 'o', '^', 'v'] colors = ['r', 'g', 'b', 'gray', 'cyan'] cmap = ListedColormap(colors[:len(np.unique(y))]) x1_min, x1_max = x[:, 0].min() - 1, x[:, 0].max() + 1 x2_min, x2_max = x[:, 1].min() - 1, x[:, 1].max() + 1 xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution)) z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T) z = z.reshape(xx1.shape) plt.contourf(xx1, xx2, z, alpha=0.4, cmap=cmap) for idx, cc in enumerate(np.unique(y)): plt.scatter(x=x[y == cc, 0], y=x[y == cc, 1], alpha=0.6, c=cmap(idx), edgecolor='black', marker=markers[idx], label=cc) def main(): # load data df_wine = pd.read_csv('D:\\PyCharm_Project\\maching_learning\\wine_data\\wine.data', header=None) # 本地加載# df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data',# header=None) # 伺服器加載# split the data,train:test=7:3 x, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, stratify=y, random_state=0) # standardize the feature 標準化單位方差 sc = StandardScaler() x_train_std = sc.fit_transform(x_train) x_test_std = sc.fit_transform(x_test) lda = LDA(n_components=2) lr = LogisticRegression() x_train_lda = lda.fit_transform(x_train_std, y_train) # LDA是有監督方法,需要用到標籤 x_test_lda = lda.fit_transform(x_test_std, y_test) # 預測時候特徵向量正負問題,乘-1反轉鏡像 lr.fit(x_train_lda, y_train) plt.figure(figsize=(6, 7), dpi=100) # 畫圖高寬,像素 plt.subplot(2, 1, 1) plot_decision_regions(x_train_lda, y_train, classifier=lr) plt.title('Training Result') plt.xlabel('LD1') plt.ylabel('LD2') plt.legend(loc='lower left') plt.subplot(2, 1, 2) plot_decision_regions(x_test_lda, y_test, classifier=lr) plt.title('Testing Result') plt.xlabel('LD1') plt.ylabel('LD2') plt.legend(loc='lower left') plt.tight_layout() # 子圖間距 plt.show() if__name__ == '__main__': main()

五、降維壓縮數據技術總結

至此,數據降維壓縮的技術學習告一段落,經過這次學習,我感覺到一次比較系統的學習會收穫更多,此次學習了主成分分析(PCA)和線性判別分析(LDA),這兩種經典的數據降維技術各有特點。

前者是無監督技術,忽略分類標籤,尋找最大化方差方向提取主成分;後者是有監督技術,訓練時候考慮分類標籤,在線性特徵空間最大化類的可分性。應用場景也各有優勢,PCA在圖像識別應用好,LDA在特徵提取方面更有優勢。

這裡列出這次學習過程的博文記錄,方便查找:

主成分分析PCA數據降維原理及python應用(葡萄酒案例分析)運用sklearn進行主成分分析(PCA)代碼實現LDA線性判別分析原理及python應用(葡萄酒案例分析)運用sklearn進行線性判別分析(LDA)代碼實現我的博客園:運用sklearn進行線性判別分析(LDA)代碼實現

我的CSDN:https://blog.csdn.net/Charzous/article/details/108064317

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結和本聲明。

本文連結:https://blog.csdn.net/Charzous/article/details/108064317

相關焦點

  • 線性判別分析LDA(Linear Discriminant Analysis)
    (i從1到m),每個x(i)對應一個類標籤至此,我們只需要求出原始樣本的均值和方差就可以求出最佳的方向w,這就是Fisher於1936年提出的線性判別分析。看上面二維樣本的投影結果圖:線性判別分析(多類情況)前面是針對只有兩個類的情況,假設類別變成多個了,那麼要怎麼改變,才能保證投影后類別能夠分離呢?我們之前討論的是如何將d維降到一維,現在類別多了,一維可能已經不能滿足要求。假設我們有C個類別,需要K維向量(或者叫做基向量)來做投影。將這K維向量表示為
  • 使用python+sklearn實現概率PCA和因子分析進行模型選擇
    概率PCA和因子分析都是概率模型,新數據的似然性(likelihood)可用於模型選擇和協方差估計
  • 特徵選擇及基於Sklearn的實現
    sklearn.feature_selection模塊被廣泛應用於樣本數據集的特徵選擇和特徵降維,以減少特徵數量,增強對特徵和特徵值之間的理解,提高預測準確性或提高在高維數據集上的性能。本文將依據官方文檔對sklearn.feature_selection模塊進行介紹。
  • python多重線性回歸分析
    一個簡單的線性回歸模型測試。定義:線性回歸是利用數理統計中回歸分析,來確定兩種或兩種以上變量間相互依賴的定量關係的一種統計分析方法,運用十分廣泛。表達形式為y =aX+b,b為誤差服從均值為0的正態分布,a為截距。
  • 安全數據的判別分析
    安全數據的判別分析包括四大內容,如圖所示1 距離判別法2 貝葉斯判別法3 Fisher判別法Fisher判別法是一種先進行高維向低維投影,再根據距離判別的一種方法,就是通過將k組多元安全統計數據投影到某一個方向上(或某一低維空間中),使投影后的組與組之間儘可能地分開
  • 樸素貝葉斯詳解及中文輿情分析(附代碼實踐)
    通過高斯樸素貝葉斯分類分析的代碼如下: 1# -*- coding: utf-8 -*- 2import numpy as np 3from sklearn.naive_bayes import GaussianNB 4X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2,
  • 分類分析之判別分析,SPSS判別分析實操
    判別分析是常用的一種分類分析方法。與聚類分析不同的是【聚類分析是直接比較各事物之間的性質,將性質相近的歸為一類,將性質差別較大的歸入不同的類。而且事先並不知曉分類標準】,而判別分析先根據已知類別的事物的性質,利用某種技術建立函數式,然後對未知類別的新事物進行判斷以將之歸入已知的類別中。
  • 8種用Python實現線性回歸的方法,究竟哪個方法最高效?
    大數據文摘作品作者:TirthajyotiSarkar編譯:丁慧、katherine Hou、錢天培說到如何用Python執行線性回歸,大部分人會立刻想到用sklearn的linear_model,但事實是,Python至少有8種執行線性回歸的方法,sklearn並不是最高效的。
  • 樸素貝葉斯分類器詳解及中文文本輿情分析(附代碼實踐)
    本文主要講述樸素貝葉斯分類算法並實現中文數據集的輿情分析案例,希望這篇文章對大家有所幫助,提供些思路。
  • 一元線性回歸分析python - CSDN
    python多重線性回歸分析多重線性回歸分析定義多重線性回歸模型:Mulitiple模塊中的LinearRegression函數from sklearn.linear_model import LinearRegression#使用線性回歸模型進行建模lrModel= LinearRegression()#使用自變量x和因變量y訓練模型lrModel.fit(x,y)#多重線性回歸
  • 8 種進行簡單線性回歸的方法分析與討論
    8 種進行簡單線性回歸的方法分析與討論 Tirthajyoti Sarkar 發表於 2018-01-05 08:18:57 本文中,作者討論了 8 種在 Python 環境下進行簡單線性回歸計算的算法,不過沒有討論其性能的好壞
  • SKlearn實現鳶尾花分類:決策樹
    實現代碼from sklearn import datasetsimport matplotlib.pyplot as pltimport numpy as npfrom sklearn import tree# Iris數據集是常用的分類實驗數據集,# 由Fisher, 1936收集整理。
  • 線性擬合與曲線擬合,直接在圖上添加擬合曲線、擬合方程、判別係數...
    1、什麼是線性擬合?線性擬合,顧名思義,針對兩組數據或多組數據,找出一條最佳擬合直線,常用於處理與自變量呈線性關係的因變量。線性擬合是數據處理的常用方法,擬合的目的是對呈現一定數值關係的因變量與自變量找出最佳擬合方程,一般用線性回歸來實現。
  • 用PCA還是LDA?特徵抽取經典算法PK
    在之前的格物匯文章中,我們介紹了特徵抽取的經典算法——主成分分析(PCA),了解了PCA算法實質上是進行了一次坐標軸旋轉,儘可能讓數據映射在新坐標軸方向上的方差儘可能大,並且讓原數據與新映射的數據在距離的變化上儘可能小。
  • 方差分析分類及SAS實現代碼
    方差分析為多樣本檢驗,其核心為假設檢驗,此外,方差分析還可以做多重比較。方差分析本身是一種假設檢驗,同時也是一種模型,是回歸模型的特例,回歸模型為線性模型,方差分析為一般線性模型。實際應用中方差分析單獨出現的可能性很小,一般在實驗設計場景用的較多,項目中用方差分析去支撐項目的情景基本不會出現。方差分析分類單因素方差分析單因素方差分析用來研究一個因素的不同水平對觀測所產生的影響,例如不同澆水量對家裡綠蘿生長的影響、不同的省的日照差異對人的壽命的影響、不同工作時長對人情緒的影響等等,以上皆可以使用單因素方差分析的方法進行探索分析。
  • python一元線性回歸分析專題及常見問題 - CSDN
    python多重線性回歸分析多重線性回歸分析定義多重線性回歸模型:Mulitiple模塊中的LinearRegression函數from sklearn.linear_model import LinearRegression#使用線性回歸模型進行建模lrModel= LinearRegression()#使用自變量x和因變量y訓練模型lrModel.fit(x,y)#多重線性回歸
  • 機器學習算法一覽(附python和R代碼)
    線性回歸主要有兩種:一元線性回歸和多元線性回歸。一元線性回歸只有一個自變量,而多元線性回歸有多個自變量。 Python 代碼 #Import Library#Import other necessary libraries like pandas, numpy...from sklearn import linear_model#Load Train and Test datasets
  • 機器學習之sklearn基礎教程!
    本文在基於讀者已經基本了解這些基本算法的原理以及推導的基礎上,使用sklearn工具包進行算法實踐,如果大家沒有掌握基本算法原理,文中也會給出一些優秀的連結方便大家學習。如果大家對基本分類算法的基本原理有需求,可以在評論區寫下自己的需求,我們會根據大家的意見推出相應的分享。
  • 原理+代碼|Python基於主成分分析的客戶信貸評級實戰
    3 - 隨機森林預測寬帶客戶離網4 - 多元線性回歸模型實戰5 - PCA實現客戶信貸5C評級能夠理解 PCA 的基本原理並將代碼用於實際的業務案例是本文的目標,本文將詳細介紹如何利用Python實現基於主成分分析的5c信用評級,主要分為兩個部分:詳細原理介紹Python代碼實戰