<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用 LDA 方法進(jìn)行數(shù)據(jù)分類的 Python 實現(xiàn)

          共 3430字,需瀏覽 7分鐘

           ·

          2020-08-16 13:39



          圖片來源于網(wǎng)絡(luò),文末附本文源碼下載方法

          筆者之前寫過一篇名為《用PCA方法進(jìn)行數(shù)據(jù)降維》的文章,文章中主要講述了如何用PCA(主成分分析)來對數(shù)據(jù)進(jìn)行降維的方法。而今天筆者將介紹另一種常用的數(shù)據(jù)降維方法——LDA。

          LDA的全稱是linear discriminant analysis,即線性判別分析,LDA與PCA一樣,都可用于數(shù)據(jù)降維,但二者既有相似也有區(qū)別,PCA主要是從特征/維度的協(xié)方差角度,去找到比較好的投影方式,即選擇樣本點投影具有最大方差的方向,而LDA則是尋找一個投影方向,讓原先的數(shù)據(jù)在這個方向上投影后,不同類別之間數(shù)據(jù)點距離盡可能大,而同類別數(shù)據(jù)點距離盡可能小。此外PCA屬于無監(jiān)督式學(xué)習(xí),很多情況下需要配合其他算法使用,而LDA屬于監(jiān)督式學(xué)習(xí),本身除了可以用于降維外,還可以進(jìn)行預(yù)測分析,說白了就是既可以“團戰(zhàn)”,也可以單獨打怪。而本文就主要講述如何用LDA來進(jìn)行數(shù)據(jù)分類,當(dāng)然這里面肯定也會用到降維的原理。

          LDA的大致原理如圖1所示。圖1中左圖是按照常規(guī)坐標(biāo)系來分析,這時可以看到數(shù)據(jù)有部分重疊,在分類時可能會有干擾,這時我們就要找到一個投影方向,讓這些數(shù)據(jù)在這個方向上的投影,做到類之間距離盡可能大,類內(nèi)數(shù)據(jù)盡可能聚集,如右圖所示。

          圖1. LDA原理圖

          下面再簡單介紹一下LDA的數(shù)學(xué)原理。

          以最簡單的兩個類別為例,假設(shè)Xi、ui、Σi分別表示第i類樣本點的集合、均值向量、協(xié)方差矩陣,若將數(shù)據(jù)投影到直線w上,則兩類樣本的中心在直線上的投影分別是w^Tu1和w^Tu2,在所有樣本點都投影到直線上后,兩類樣本的協(xié)方差分別是w^TΣ1w和w^TΣ2w。我們要想讓類別之間距離更大、類內(nèi)距離更小,也就是要使圖2中的(1)式最大。在這里我們再定義兩個概念,一個是類內(nèi)散度陣(within-class scatter matrix),即圖2中(2)式,一個是類間散度陣(between-class scatter matrix),即圖2中(3)式。那么這個讓(1)式最大的問題就轉(zhuǎn)化為最大化一個瑞利熵,即最大化(4)式。

          圖2. LDA部分推導(dǎo)公式

          而求解(4)式也就是相當(dāng)于求解圖3中(5)式,用拉格朗日乘法求解,得到圖3中(6)式,這就轉(zhuǎn)化成了一個求特征方程的問題了,也就是求n-1個最大特征值所對應(yīng)的特征向量(n是維度)。這個按照我們正常求解特征方程就可以了。

          圖3. LDA部分推導(dǎo)公式

          在實際使用中,如果按照上述原理推導(dǎo)會非常麻煩,但是scikit-learn中已經(jīng)為我們提供了現(xiàn)成的LDA方法,我們只要直接調(diào)用即可,下面就以scikit-learn為例,來看一下LDA在實際使用中的效果。

          這次選用的數(shù)據(jù)集是鳶尾花數(shù)據(jù)集,來自seaborn庫,大小為150行、5列,數(shù)據(jù)集樣例如圖4所示。

          圖4. 鳶尾花數(shù)據(jù)集樣例

          首先還是導(dǎo)入各種庫。

          import?numpy?as?np
          import?pandas?as?pd
          import?seaborn?as?sns
          import?matplotlib.pyplot?as?plt
          from?sklearn.metrics?import?classification_report
          from?sklearn.discriminant_analysis?import?LinearDiscriminantAnalysis?as?LDA

          然后是設(shè)置訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集。熟悉鳶尾花數(shù)據(jù)集的人都知道,這個數(shù)據(jù)集中150個樣本點可以分為3個類別,每個類別各有50個樣本點,這三個類別是'setosa'、'versicolor'和'virginica',可以用代碼set(data['species'].values)來查看這三個值。我們在這里要設(shè)置訓(xùn)練集和測試集,就要在每個類別中都取得一定量的數(shù)據(jù),筆者的方法是選取總數(shù)據(jù)集中60%的數(shù)據(jù)為訓(xùn)練集,即訓(xùn)練集一共是90個樣本點,其中每個類別取前30個樣本點,而測試集就是剩下的60個樣本點,每個類別就是20個,代碼如下。

          data?=?sns.load_dataset('iris')?#總數(shù)據(jù)集
          data_train?=?data.iloc[np.r_[0:30,?50:80,?100:130]]?#訓(xùn)練集
          data_test?=?data.iloc[np.r_[30:50,?80:100,?130:150]]?#測試集
          train_x?=?data_train.iloc[:,:4]?#訓(xùn)練集數(shù)據(jù)
          train_y?=?data_train.iloc[:,4]?#訓(xùn)練集分類
          test_x?=?data_test.iloc[:,:4]?#測試集數(shù)據(jù)
          test_y?=?data_test.iloc[:,4]?#測試集分類
          接下來就是設(shè)置分類器,并用分類器進(jìn)行訓(xùn)練和預(yù)測,代碼如下。
          clf?=?LDA(n_components=2)?#分類器
          clf.fit(train_x,?train_y)?#用數(shù)據(jù)進(jìn)行訓(xùn)練
          pre_y?=?clf.predict(test_x)?#對測試數(shù)據(jù)進(jìn)行預(yù)測

          這里clf = LDA(n_components=2)中,n_components=2就是我們最終要得到的數(shù)據(jù)維度數(shù),原數(shù)據(jù)是4個維度,而這里我們要把它降維到2維,實際上這里我們只能選擇2維和1維,因為n_components的默認(rèn)值是數(shù)據(jù)集維度數(shù)和數(shù)據(jù)集分類數(shù)-1這兩個中較小者,本例中維度數(shù)是4,數(shù)據(jù)集分類數(shù)-1是2(分類數(shù)是3),而這里n_components的值只能小于或等于2,所以我們選2。然后我們輸出預(yù)測結(jié)果,結(jié)果如圖5所示。

          圖5. 60%情況下預(yù)測結(jié)果

          從圖中可以看到預(yù)測效果還是很好的,準(zhǔn)確率在95%以上,為了更好地了解LDA的效果,筆者又分別作了兩次測試,即分別取總數(shù)據(jù)集40%和80%的數(shù)據(jù)為訓(xùn)練集,這里40%的數(shù)據(jù)量就是60個樣本點,每個類別取前20個樣品,剩下的60%(也就是90個樣本點)為測試集,而80%的情況也同理。這里筆者不再粘貼代碼,代碼只需對前面代碼進(jìn)行小的修改即可,只附上最終結(jié)果,預(yù)測的結(jié)果如圖6和圖7所示。

          圖6. 40%情況下預(yù)測結(jié)果

          圖7. 80%情況下預(yù)測結(jié)果

          從圖中我們可以看到,在40%和80%訓(xùn)練量這兩種情況下,最終預(yù)測的準(zhǔn)確率都非常高,40%的條件下和60%的結(jié)果幾乎一樣,而80%的情況下三個類別的預(yù)測準(zhǔn)確率竟然高達(dá)100%。這里筆者推測,準(zhǔn)確率如此之高的原因,除了LDA方法的優(yōu)勢之外,可能和我們選用的鳶尾花數(shù)據(jù)集有關(guān),這個數(shù)據(jù)集比較簡單,其類別比較容易區(qū)分,即便選擇其他的分類方法,也同樣能取得好的效果。而這里還有一個小插曲,LDA方法的提出者Ronald Fisher,同時也是鳶尾花數(shù)據(jù)集的提出者,用他自己的方法來分析自己的數(shù)據(jù)集,結(jié)果肯定不會差。

          本文用scikit-learn來對LDA方法進(jìn)行了一個說明,并且在案例中也取得了不錯的效果,但希望用戶不要對LDA的使用過于盲目,其自身依然存在一些不足,比如當(dāng)樣本量遠(yuǎn)小于樣本的特征數(shù)時,分類效果會很差,同時LDA不適合對非高斯分布的樣本進(jìn)行降維,LDA還可能過度擬合數(shù)據(jù)等等。本文源碼下載方式請見文末,討論本文內(nèi)容可以添加文末“Python小助手”進(jìn)入微信群交流!

          作者簡介:Mort,數(shù)據(jù)分析愛好者,擅長數(shù)據(jù)可視化,比較關(guān)注機器學(xué)習(xí)領(lǐng)域,希望能和業(yè)內(nèi)朋友多學(xué)習(xí)交流。

          贊 賞 作 者



          Python中文社區(qū)作為一個去中心化的全球技術(shù)社區(qū),以成為全球20萬Python中文開發(fā)者的精神部落為愿景,目前覆蓋各大主流媒體和協(xié)作平臺,與阿里、騰訊、百度、微軟、亞馬遜、開源中國、CSDN等業(yè)界知名公司和技術(shù)社區(qū)建立了廣泛的聯(lián)系,擁有來自十多個國家和地區(qū)數(shù)萬名登記會員,會員來自以工信部、清華大學(xué)、北京大學(xué)、北京郵電大學(xué)、中國人民銀行、中科院、中金、華為、BAT、谷歌、微軟等為代表的政府機關(guān)、科研單位、金融機構(gòu)以及海內(nèi)外知名公司,全平臺近20萬開發(fā)者關(guān)注。


          長按掃碼添加“Python小助手”?

          后回復(fù)“LDA”獲取本文源碼


          ▼點擊成為社區(qū)會員? ?喜歡就點個在看吧

          瀏覽 77
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久夜色精品噜噜亚洲AV | 北条麻妃视频 | 无码人妻一区二区三区在线神菜美 | 日韩偷拍网| 黄色永久网站 |