1. 程式人生 > >【機器學習】LDA線性判別分析原理及例項

【機器學習】LDA線性判別分析原理及例項

1、LDA的基本原理

    LDA線性判別分析也是一種經典的降維方法,LDA是一種監督學習的降維技術,也就是說它的資料集的每個樣本是有類別輸出的。這點和PCA不同。PCA是不考慮樣本類別輸出的無監督降維技術。LDA的思想可以用一句話概括,就是“*投影后類內方差最小,類間方差最大*”。什麼意思呢? 我們要將資料在低維度上進行投影,投影后希望每一種類別資料的投影點儘可能的接近,而不同類別的資料的類別中心之間的距離儘可能的大。

    可能還是有點抽象,我們先看看最簡單的情況。假設我們有兩類資料分別為紅色和藍色,如下圖所示,這些資料特徵是二維的,我們希望將這些資料投影到一維的一條直線,讓每一種類別資料的投影點儘可能的接近,而紅色和藍色資料中心之間的距離儘可能的大。

這裡寫圖片描述

    上圖中提供了兩種投影方式,哪一種能更好的滿足我們的標準呢?從直觀上可以看出,右圖要比左圖的投影效果好,因為右圖的黑色資料和藍色資料各個較為集中,且類別之間的距離明顯。左圖則在邊界處資料混雜。以上就是LDA的主要思想了,當然在實際應用中,我們的資料是多個類別的,我們的原始資料一般也是超過二維的,投影后的也一般不是直線,而是一個低維的超平面。

2、LDA演算法流程

現在我們對LDA降維的流程做一個總結。

    輸入:資料集D={(x1,y1),(x2,y2),...,((xm,ym))},其中任意樣本xi為n維向量,yi∈{C1,C2,...,Ck},降維到的維度d。

    輸出:降維後的樣本集$D′$

    1) 計算類內散度矩陣Sw
    2) 計算類間散度矩陣Sb
    3) 計算矩陣Sw^−1*Sb
    4)計算Sw^−1*Sb的最大的d個特徵值和對應的d個特徵向量(w1,w2,...wd),得到投影矩陣W
    5) 對樣本集中的每一個樣本特徵xi,轉化為新的樣本zi=WT*xi
    6) 得到輸出樣本集
  

以上就是使用LDA進行降維的演算法流程。實際上LDA除了可以用於降維以外,還可以用於分類。一個常見的LDA分類基本思想是假設各個類別的樣本資料符合高斯分佈,這樣利用LDA進行投影后,可以利用極大似然估計計算各個類別投影資料的均值和方差,進而得到該類別高斯分佈的概率密度函式。當一個新的樣本到來後,我們可以將它投影,然後將投影后的樣本特徵分別帶入各個類別的高斯分佈概率密度函式,計算它屬於這個類別的概率,最大的概率對應的類別即為預測類別。

3、LDA與PCA比較

LDA用於降維,和PCA有很多相同,也有很多不同的地方,因此值得好好的比較一下兩者的降維異同點。

    首先我們看看相同點:

    1)兩者均可以對資料進行降維。

    2)兩者在降維時均使用了矩陣特徵分解的思想。

    3)兩者都假設資料符合高斯分佈【正態分佈】。

    我們接著看看不同點:

    1)LDA是有監督的降維方法,而PCA是無監督的降維方法

    2)LDA降維最多降到類別數**k-1**的維數,而PCA沒有這個限制。

    3)LDA除了可以用於降維,還可以用於分類。

    4)LDA選擇分類效能最好的投影方向,而PCA選擇樣本點投影具有最大方差的方向。

這點可以從下圖形象的看出,在某些資料分佈下LDA比PCA降維較優。
    這裡寫圖片描述

當然,某些某些資料分佈下PCA比LDA降維較優,如下圖所示:
這裡寫圖片描述

4、 LDA演算法小結
    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可能過度擬合數據

5、LinearDiscriminantAnalysis 主要引數

    1)solver : 即求LDA超平面特徵矩陣使用的方法。可以選擇的方法有奇異值分解”svd”,最小二乘”lsqr”和特徵分解”eigen”。一般來說特徵數非常多的時候推薦使用svd,而特徵數不多的時候推薦使用eigen。主要注意的是,如果使用svd,則不能指定正則化引數shrinkage進行正則化。預設值是svd
    
    2)shrinkage:正則化引數,可以增強LDA分類的泛化能力。如果僅僅只是為了降維,則一般可以忽略這個引數。預設是None,即不進行正則化。可以選擇”auto”,讓演算法自己決定是否正則化。當然我們也可以選擇不同的[0,1]之間的值進行交叉驗證調參。注意shrinkage只在solver為最小二乘”lsqr”和特徵分解”eigen”時有效。

    3)priors :類別權重,可以在做分類模型時指定不同類別的權重,進而影響分類模型建立。降維時一般不需要關注這個引數。

    4)n_components:即我們進行LDA降維時降到的維數。在降維時需要輸入這個引數。注意只能為[1,類別數-1)範圍之間的整數。如果我們不是用於降維,則這個值可以用預設的None。

    從上面的描述可以看出,如果我們只是為了降維,則只需要輸入n_components,注意這個值必須小於“類別數-1”。PCA沒有這個限制。

6、例項

# -*- coding: utf-8 -*-
"""
Created on Fri Dec  1 10:49:37 2017
LDA_learning
@author: BruceWong
"""
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
import numpy as np

def main():
    iris = datasets.load_iris() #典型分類資料模型
    #這裡我們資料統一用pandas處理
    data = pd.DataFrame(iris.data, columns=iris.feature_names)
    data['class'] = iris.target

    #這裡只取兩類
#     data = data[data['class']!=2]
    #為了視覺化方便,這裡取兩個屬性為例
    X = data[data.columns.drop('class')]
    Y = data['class']

    #劃分資料集
    X_train, X_test, Y_train, Y_test =train_test_split(X, Y)
    lda = LinearDiscriminantAnalysis(n_components=2)
    lda.fit(X_train, Y_train)

    #顯示訓練結果
    print(lda.means_) #中心點
    print(lda.score(X_test, Y_test)) #score是指分類的正確率
    print(lda.scalings_)#score是指分類的正確率

    X_2d = lda.transform(X) #現在已經降到二維X_2d=np.dot(X-lda.xbar_,lda.scalings_)
    #對於二維資料,我們做個視覺化
    #區域劃分
    lda.fit(X_2d,Y)
    h = 0.02
    x_min, x_max = X_2d[:, 0].min() - 1, X_2d[:, 0].max() + 1
    y_min, y_max = X_2d[:, 1].min() - 1, X_2d[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))
    Z = lda.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)

    #做出原來的散點圖
    class1_x = X_2d[Y==0,0]
    class1_y = X_2d[Y==0,1]
    l1 = plt.scatter(class1_x,class1_y,color='b',label=iris.target_names[0])
    class1_x = X_2d[Y==1,0]
    class1_y = X_2d[Y==1,1]
    l2 = plt.scatter(class1_x,class1_y,color='y',label=iris.target_names[1])
    class1_x = X_2d[Y==2,0]
    class1_y = X_2d[Y==2,1]
    l3 = plt.scatter(class1_x,class1_y,color='r',label=iris.target_names[2])

    plt.legend(handles = [l1, l2, l3], loc = 'best')

    plt.grid(True)
    plt.show()

if __name__ == '__main__':
    main()

相關推薦

機器學習LDA線性判別分析原理例項

1、LDA的基本原理 LDA線性判別分析也是一種經典的降維方法,LDA是一種監督學習的降維技術,也就是說它的資料集的每個樣本是有類別輸出的。這點和PCA不同。PCA是不考慮樣本類別輸出的無監督降維技術。LDA的思想可以用一句話概括,就是“*投影后類內方

機器學習LDA線性判別分析模型

機器學習之LDA線性判別分析模型 # -*- coding: utf-8 -*- """ Created on Wed Nov 21 21:03:14 2018 @author: muli """ import matplotlib.pyplot as plt im

機器學習支援向量機SVM原理推導

參考:http://blog.csdn.net/ajianyingxiaoqinghan/article/details/72897399 部分圖片來自於上面部落格。 0 由來 在二分類問題中,我們可以計算資料代入模型後得到的結果,如果這個結果有明顯的區別,

LDA線性判別分析原理python應用(葡萄酒案例分析

目錄 線性判別分析(LDA)資料降維及案例實戰   一、LDA是什麼   二、計算散佈矩陣   三、線性判別式及特徵選擇   四、樣本資料降維投影   五、完整程式碼   結語   一、LDA是什麼 LDA概念及與PCA區別 LDA線性判別分析(Linear Discriminant Anal

機器學習LDA線性判別分析)或fisher判別分析

內容目錄: 一、LDA/fisher判別分析 二、LDA判別分析與PCA對比 一、fisher判別分析 1.首先在模式識別課程上學習的是fisher判別,LDA概念是看川大同學寫的500問接觸的,兩者是一樣的東西。 2推薦:深度學習500問 github連結形式是問答形式,初學者概念

Python機器學習筆記:線性判別分析LDA)演算法

預備知識   首先學習兩個概念:   線性分類:指存在一個線性方程可以把待分類資料分開,或者說用一個超平面能將正負樣本區分開,表示式為y=wx,這裡先說一下超平面,對於二維的情況,可以理解為一條直線,如一次函式。它的分類演算法是基於一個線性的預測函式,決策的邊界是平的,比如直線和平面。一般的方法有感知器,最小

機器學習--LDA初始和應用

alloc learn .get lis oca pat 文章 text 對應關系 一、前述 LDA是一種 非監督機器學習 技術,可以用來識別大規模文檔集(document collection)或語料庫(corpus)中潛藏的主題信息。它采用了詞袋(bag of word

機器學習HOG detectMultiScale 引數分析

前段時間學習了HOG描述子及其與SVM結合在行人檢測方面的應用。 當我們用訓練好的模型去檢測測試影象時,我們會用到detectMultiScale() 這個函式來對影象進行多尺度檢測。 這是opencv3.1裡的引數解釋 可以看到一共有8個引數。 1.img(必需) 這個不

機器學習梯度下降演算法分析與簡述

梯度下降演算法分析與簡述 梯度下降(gradient descent)是一種最優化演算法,基於爬山法的搜尋策略,其原理簡單易懂,廣泛應用於機器學習和各種神經網路模型中。在吳恩達的神經網路課程中,梯度下降演算法是最先拿來教學的基礎演算法。 梯度下降演算法的

機器學習交叉熵函式的使用推導

前言 說明:本文只討論Logistic迴歸的交叉熵,對Softmax迴歸的交叉熵類似。 minist手寫數字識別就是用交叉熵作為代價函式。   1.從方差代價函式說起   代價函式經常用方差代價函式(即採用均方誤差MSE),比如對於一個神經元(單輸入單輸出,s

機器學習最大熵模型原理小結

最大熵模型(maximum entropy model, MaxEnt)也是很典型的分類演算法了,它和邏輯迴歸類似,都是屬於對數線性分類模型。在損失函式優化的過程中,使用了和支援向量機類似的凸優化技術。而對熵的使用,讓我們想起了決策樹演算法中的ID3和C4.5演算法。理解了最

機器學習交叉驗證、正則化例項Python程式碼實現

前言 機器學習常用的資料集網址:資料集 執行環境:python3.6(這裡我用的anaconda的jupyter notebook) 1. 對比不同模型的交叉驗證的結果 資料集來源:紅酒資料集 這份資料集包含來自3種不同起源的葡萄酒的共178條記錄

機器學習最近鄰演算法KNN原理、流程框圖、程式碼實現優缺點

通過機器學習教學視訊,初識KNN演算法,對原理和演算法流程通過小應用進行Python實現,有了自己的一些理解。因此在此整理一下,既是對自己學習的階段性總結,也希望能和更多的朋友們共同交流學習相關演算法,如有不完善的地方歡迎批評指正。1、KNN演算法原理KNN,全稱k-Near

機器學習K-Means演算法的原理流程、程式碼實現優缺點

分類是根據樣本某些屬性或某類特徵(可以融合多類特徵),把樣本型別歸為已確定的某一類別中。機器學習中常見的分類演算法有:SVM(支援向量機)、KNN(最鄰近法)、Decision Tree(決策樹分類法)

機器學習資料降維—線性判別分析LDA

本文程式碼推薦使用Jupyter notebook跑,這樣得到的結果更為直觀。 線性判別分析(Linear Discriminant Analysis,LDA)是一種可作為特徵抽取的技術 LDA可以提

機器學習線性迴歸模型分析

具體原理不講了,線性迴歸模型,代價損失函式 COST是均方誤差,梯度下降方法。 屬性取值。模型的屬性取值設定需要根據每一個引數的取值範圍來確定,將所有的屬性的取值統一正則化normalization,統一規定在0~1的範圍,或者-1~1的範圍內,這樣在進行線性迴歸時不會造成

機器學習主成分分析PCA(Principal components analysis)

大小 限制 總結 情況 pca 空間 會有 ges nal 1. 問題 真實的訓練數據總是存在各種各樣的問題:  1、 比如拿到一個汽車的樣本,裏面既有以“千米/每小時”度量的最大速度特征,也有“英裏/小時”的最大速度特征,

機器學習--線性回歸中L1正則和L2正則

last clas nbsp post pan red font 推廣 http 一、前述 L1正則,L2正則的出現原因是為了推廣模型的泛化能力。相當於一個懲罰系數。 二、原理 L1正則:Lasso Regression L2正則:Ridge Regression

模式識別與機器學習——PCA主成分分析

  基本思想 其基本思想就是設法提取資料的主成分(或者說是主要資訊),然後摒棄冗餘資訊(或次要資訊),從而達到壓縮的目的。本文將從更深的層次上討論PCA的原理,以及Kernel化的PCA。 引子 首先我們來考察一下,這裡的資訊冗餘是如何體現的。如下圖所示,我們有一組二維資料點,從圖上不難發現

機器學習線性迴歸演算法的過擬合比較

回顧 過擬合與欠擬合 主要介紹了什麼是欠擬合什麼是過擬合 對抗過擬合 主要介紹了線性迴歸中對抗過擬合的方法,主要包括:L1-norm的LASSO迴歸、L2-norm的Ridge迴歸,此外還有一個沒有提到,L1-norm和L2-norm結合的Elasitc Net(彈性網