欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

機器學習:python實現LDA降維算法

系統 1932 0

這次,我們來學習一種經典的降維方法:
線性判別分析(Linear Discriminant Analysis, 以下簡稱LDA) .
在前面博客中(點我)我們講解了PCA降維算法。
PCA追求的是在降維之后能夠最大化保持數據的內在信息,并通過衡量在投影方向上的數據方差的大小來衡量該方向的重要性。
PCA優缺點:
優點:1.最小誤差 2.提取了主要信息
缺點:PCA將所有的樣本(特征向量集合)作為一個整體對待,去尋找一個均方誤差最小意義下的最優線性映射投影,而忽略了類別屬性,而它所忽略的投影方向有可能剛好包含了重要的可分性信息。

LDA所追求的目標和PCA不同, 不是希望保持數據最多的信息,而是希望數據在降維后能夠很容易地被區分開來。
LDA一種 有監督的 線性降維方法,,也就是說它的數據集的每個樣本是有類別輸出的。這點和PCA不同。PCA是不考慮樣本類別輸出的無監督降維技術。
核心思想 往線性判別超平面的法向量上投影 ,使的區分度最大(高內聚,低耦合)。LDA是為了使得降維后的數據點盡可能地容易被區分!
用一句話概括,就是**“投影后類內方差最小,類間方差最大”**。
什么意思呢?
我們要將數據在低維度上進行投影,
投影后希望每一種類別數據的投影點盡可能的接近,
而不同類別的數據的類別中心之間的距離盡可能的大。

LDA算法計算步驟:

  1. 對d維數據進行標準化處理(d為特征數量)
  2. 對每一類別,計算d維的均值向量
  3. 構造類間的散步矩陣和類內的散步矩陣
  4. 計算矩陣的特征值和對應的特征向量
  5. 選取前k個特征值對應的特征向量 ,構造一個d x k維的轉換矩陣W,特征向量以列的形式排列
  6. 使用轉換矩陣W將樣本映射到新的特征子空間上
            
              
                import
              
               numpy 
              
                as
              
               np

              
                from
              
               sklearn
              
                .
              
              discriminant_analysis 
              
                import
              
               LinearDiscriminantAnalysis

              
                from
              
               sklearn
              
                .
              
              datasets 
              
                import
              
               load_iris

              
                import
              
               matplotlib
              
                .
              
              pyplot 
              
                as
              
               plt


              
                def
              
              
                lda
              
              
                (
              
              data
              
                ,
              
               target
              
                ,
              
               n_dim
              
                )
              
              
                :
              
              
                '''
    :param data: (n_samples, n_features)
    :param target: data class
    :param n_dim: target dimension
    :return: (n_samples, n_dims)
    '''
              
              

    clusters 
              
                =
              
               np
              
                .
              
              unique
              
                (
              
              target
              
                )
              
              
                if
              
               n_dim 
              
                >
              
              
                len
              
              
                (
              
              clusters
              
                )
              
              
                -
              
              
                1
              
              
                :
              
              
                print
              
              
                (
              
              
                "K is too much"
              
              
                )
              
              
                print
              
              
                (
              
              
                "please input again"
              
              
                )
              
              
        exit
              
                (
              
              
                0
              
              
                )
              
              
                #within_class scatter matrix
              
              
    Sw 
              
                =
              
               np
              
                .
              
              zeros
              
                (
              
              
                (
              
              data
              
                .
              
              shape
              
                [
              
              
                1
              
              
                ]
              
              
                ,
              
              data
              
                .
              
              shape
              
                [
              
              
                1
              
              
                ]
              
              
                )
              
              
                )
              
              
                for
              
               i 
              
                in
              
               clusters
              
                :
              
              
        datai 
              
                =
              
               data
              
                [
              
              target 
              
                ==
              
               i
              
                ]
              
              
        datai 
              
                =
              
               datai
              
                -
              
              datai
              
                .
              
              mean
              
                (
              
              
                0
              
              
                )
              
              
        Swi 
              
                =
              
               np
              
                .
              
              mat
              
                (
              
              datai
              
                )
              
              
                .
              
              T
              
                *
              
              np
              
                .
              
              mat
              
                (
              
              datai
              
                )
              
              
        Sw 
              
                +=
              
               Swi

    
              
                #between_class scatter matrix
              
              
    SB 
              
                =
              
               np
              
                .
              
              zeros
              
                (
              
              
                (
              
              data
              
                .
              
              shape
              
                [
              
              
                1
              
              
                ]
              
              
                ,
              
              data
              
                .
              
              shape
              
                [
              
              
                1
              
              
                ]
              
              
                )
              
              
                )
              
              
    u 
              
                =
              
               data
              
                .
              
              mean
              
                (
              
              
                0
              
              
                )
              
              
                #所有樣本的平均值
              
              
                for
              
               i 
              
                in
              
               clusters
              
                :
              
              
        Ni 
              
                =
              
               data
              
                [
              
              target 
              
                ==
              
               i
              
                ]
              
              
                .
              
              shape
              
                [
              
              
                0
              
              
                ]
              
              
        ui 
              
                =
              
               data
              
                [
              
              target 
              
                ==
              
               i
              
                ]
              
              
                .
              
              mean
              
                (
              
              
                0
              
              
                )
              
              
                #某個類別的平均值
              
              
        SBi 
              
                =
              
               Ni
              
                *
              
              np
              
                .
              
              mat
              
                (
              
              ui 
              
                -
              
               u
              
                )
              
              
                .
              
              T
              
                *
              
              np
              
                .
              
              mat
              
                (
              
              ui 
              
                -
              
               u
              
                )
              
              
        SB 
              
                +=
              
               SBi
    S 
              
                =
              
               np
              
                .
              
              linalg
              
                .
              
              inv
              
                (
              
              Sw
              
                )
              
              
                *
              
              SB
    eigVals
              
                ,
              
              eigVects 
              
                =
              
               np
              
                .
              
              linalg
              
                .
              
              eig
              
                (
              
              S
              
                )
              
              
                #求特征值,特征向量
              
              
    eigValInd 
              
                =
              
               np
              
                .
              
              argsort
              
                (
              
              eigVals
              
                )
              
              
    eigValInd 
              
                =
              
               eigValInd
              
                [
              
              
                :
              
              
                (
              
              
                -
              
              n_dim
              
                -
              
              
                1
              
              
                )
              
              
                :
              
              
                -
              
              
                1
              
              
                ]
              
              
    w 
              
                =
              
               eigVects
              
                [
              
              
                :
              
              
                ,
              
              eigValInd
              
                ]
              
              
    data_ndim 
              
                =
              
               np
              
                .
              
              dot
              
                (
              
              data
              
                ,
              
               w
              
                )
              
              
                return
              
               data_ndim


              
                if
              
               __name__ 
              
                ==
              
              
                '__main__'
              
              
                :
              
              
    iris 
              
                =
              
               load_iris
              
                (
              
              
                )
              
              
    X 
              
                =
              
               iris
              
                .
              
              data
    Y 
              
                =
              
               iris
              
                .
              
              target
    data_1 
              
                =
              
               lda
              
                (
              
              X
              
                ,
              
               Y
              
                ,
              
              
                2
              
              
                )
              
              

    data_2 
              
                =
              
               LinearDiscriminantAnalysis
              
                (
              
              n_components
              
                =
              
              
                2
              
              
                )
              
              
                .
              
              fit_transform
              
                (
              
              X
              
                ,
              
               Y
              
                )
              
              


    plt
              
                .
              
              figure
              
                (
              
              figsize
              
                =
              
              
                (
              
              
                8
              
              
                ,
              
              
                4
              
              
                )
              
              
                )
              
              
    plt
              
                .
              
              subplot
              
                (
              
              
                121
              
              
                )
              
              
    plt
              
                .
              
              title
              
                (
              
              
                "LDA"
              
              
                )
              
              
    plt
              
                .
              
              scatter
              
                (
              
              data_1
              
                [
              
              
                :
              
              
                ,
              
              
                0
              
              
                ]
              
              
                ,
              
               data_1
              
                [
              
              
                :
              
              
                ,
              
              
                1
              
              
                ]
              
              
                ,
              
               c 
              
                =
              
               Y
              
                )
              
              

    plt
              
                .
              
              subplot
              
                (
              
              
                122
              
              
                )
              
              
    plt
              
                .
              
              title
              
                (
              
              
                "sklearn_LDA"
              
              
                )
              
              
    plt
              
                .
              
              scatter
              
                (
              
              data_2
              
                [
              
              
                :
              
              
                ,
              
              
                0
              
              
                ]
              
              
                ,
              
               data_2
              
                [
              
              
                :
              
              
                ,
              
              
                1
              
              
                ]
              
              
                ,
              
               c 
              
                =
              
               Y
              
                )
              
              
    plt
              
                .
              
              savefig
              
                (
              
              
                "LDA.png"
              
              
                ,
              
              dpi
              
                =
              
              
                600
              
              
                )
              
              
    plt
              
                .
              
              show
              
                (
              
              
                )
              
            
          

run result:
機器學習:python實現LDA降維算法_第1張圖片
這里,我們使用了自己編程實現的LDA和調用sklearn自帶的LDA對iris數據進行LDA,效果圖如上。

PCA和LDA的比較:
相同點:
1)兩者均可以對數據進行降維。
2)兩者在降維時均使用了矩陣特征分解的思想。
3)兩者都假設數據符合高斯分布。

不同點:
1)LDA是有監督的降維方法,而PCA是無監督的降維方法
2)LDA降維最多降到類別數k-1的維數,而PCA沒有這個限制。
3)LDA除了可以用于降維,還可以用于分類。
4)LDA選擇分類性能最好的投影方向,而PCA選擇樣本點投影具有最大方差的方向。

LDA算法總結:
LDA算法既可以用來降維,又可以用來分類,但是目前來說,主要還是用于降維。在我們進行圖像識別圖像識別相關的數據分析時,LDA是一個有力的工具。

LDA算法的主要優點有:
1)在降維過程中可以使用類別的先驗知識經驗,而像PCA這樣的無監督學習則無法使用類別先驗知識。
2)LDA在樣本分類信息 依賴均值而不是方差的時候,比PCA之類的算法較優

LDA算法的主要缺點有:
1)LDA不適合對非高斯分布樣本進行降維,PCA也有這個問題。
2)LDA降維最多降到類別數k-1的維數,如果我們降維的維度大于k-1,則不能使用LDA。當然目前有一些LDA的進化版算法可以繞過這個問題。
3)LDA在樣本分類信息依賴方差而不是均值的時候,降維效果不好。
4)LDA可能過度擬合數據。

注:里面的還有很多知識不是很了解,現在可是用代碼實現,大致了解這LDA,后續進行更加深入的了解。

參考和引用:
https://www.cnblogs.com/pinard/p/6244265.html (線性判別分析LDA原理總結)

https://github.com/heucoder/dimensionality_reduction_alo_codes

https://blog.csdn.net/ChenVast/article/details/79227945

https://scikit-learn.org/stable/auto_examples/neighbors/plot_nca_dim_reduction.html#sphx-glr-auto-examples-neighbors-plot-nca-dim-reduction-py

https://www.cnblogs.com/jiahuaking/p/3938541.html

僅用來個人學習和分享,如有錯誤,請指正。

如若侵權,留言立刪。

尊重他人知識產權,不做拿來主義者!

喜歡的可以關注我哦QAQ,

你的關注和喜歡就是我write博文的動力。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲成片在线观看12345ba | 性色网站 | 一本色道久久88加勒比—综合 | 久久久久久久久女黄 | 国产在线二区 | 欧美亚洲福利 | 国产福利91精品一区二区三区 | 亚洲欧洲精品成人久久曰影片 | 欧美日韩中文在线观看 | 国内精品久久久久影院老司 | 一区二区日韩精品 | 日本中文字幕电影 | 久久免费福利 | 国产午夜精品视频免费不卡69堂 | 国产精品高潮呻吟久久av黑人 | 亚洲呦呦系列视频 | 日韩视| 亚洲免费精品 | 蜜桃免费一区二区三区 | 亚洲精品成人 | 26uuu最新| 欧美色综合天天久久综合精品 | 人人艹人人看 | 免费视频不卡一区二区三区 | 四虎4hu | 2020天天狠天天透天干天天怕 | 欧美综合图区亚欧综合图区 | 亚洲高清av | 9久9久女女热精品视频免费观看 | 国产精品秒播无毒不卡 | 国产伊人精品 | 91美女福利视频 | 久久国产福利 | 先锋资源久久 | 国产一级做a爰片久久毛片 欧美一区欧美二区 | 亚洲第一页视频 | 在线观看免费av网 | 国产成人综合网在线观看 | 国产激情一级毛片久久久 | 久久精品国产欧美成人 | 亚洲综合在线一区 |