线性判别分析(LDA)详解
入門小菜鳥,希望像做筆記記錄自己學的東西,也希望能幫助到同樣入門的人,更希望大佬們幫忙糾錯啦~侵權立刪。
目錄
一、LDA簡介
二、數學原理(以二分類為例子)
1、設定
2、每一類的均值和方差
3、目標函數
4、目標函數的求解
5、最終的實踐所求
三、多分類LDA
四、LDA用途與優缺點
1、用途
2、優點
3、缺點
五、LDA的python應用
1、調用函數LinearDiscriminantAnalysis
2、常用參數意義
3、常用返回值
4、利用LDA進行二分類實例
一、LDA簡介
LDA(線性判別分析)是一個經典的二分類算法。
主要思想:以一種基于降維的方式將所有的樣本映射到一維坐標軸上,然后設定一個閾值,將樣本進行區分
如下圖所示,把紅藍兩類的點投影在了一條直線(向量a)上,即二維變一維(本來一個點要用(x,y)來表示,投影到直線后就用一個維度來描述)。
二、數學原理(以二分類為例子)
1、設定
首先我們假設整個樣本空間分為兩個類別,分別是1、-1;N1、N2分別代表1,-1類別樣本的個數;樣本為X。
那么有:;
設定z為映射后的坐標(即投影后的坐標)
2、每一類的均值和方差
將樣本數據X向w向量(設定w的模長為1)做投影,則有:
接下來求出映射后的均值和方差(用來衡量樣本的類間距離和類內距離)
均值:;
方差:;
3、目標函數
想要得到好的分類模型,即要求類內間距小,類間間距大。即:
類內間距小:;兩個類的方差越小,說明樣本越密集
類間間距大:;用兩個類的均值的距離說明兩個類之間的距離
根據這樣的思路構建目標函數:
J(w)越大越好,即我們要求的是:
4、目標函數的求解
化簡目標函數:(將w向量與原數據的運算分隔開)
令類間散度矩陣:;類內散度矩陣:,則有:
方法一:
為了解決,則對J(w)求導:
化簡得到:
又因為,,都是標量,w前面我們已經約定它的模長為1,所以我們不關心它的長度,只關心他的方向,所以把標量都摘掉,得:
方法二:
J(w)的分子分母都是關于w的二次項,因此J(w)的解與w的長度無關,只與它的方向有關。所以這里為例簡單處理也可以令,故求,利用拉格朗日乘子法可得:
又因為方向恒為,所以令,因此有
5、最終的實踐所求
為得到數值解的穩定性,通常對進行奇異值分解(),再由得到。
三、多分類LDA
假定存在N個類,且第i類示例數為。
全局散度矩陣:,其中是所有樣本的均值向量。
類內散度矩陣:
類間散度矩陣:
然后與上面的二分類類似:目標函數為:
類似可得:
所以W的解為的特征向量組成的矩陣。
四、LDA用途與優缺點
1、用途
LDA既可以用來降維(將W視為投影矩陣),又可以用來分類,但主要還是用于降維。
2、優點
與另一個降維算法PCA對比
(1)在降維過程中可以使用類別的先驗知識經驗,而PCA(無監督學習)無法使用類別先驗知識
(2)LDA樣本分類依賴的是均值而不是方差,比PCA算法更優
3、缺點
(1)LDA不適合對非高斯分布的樣本降維
(2)LDA降維最多降到類別數N-1的維數,如果我們降維的維度大于N-1,則不能使用LDA
(3)LDA可能會過度擬合數據
五、LDA的python應用
1、調用函數LinearDiscriminantAnalysis
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis2、常用參數意義
(1)solver:字符串類型,指定求解最優化問題的算法
🌳'svd':奇異值分解。對于有大規模特征的數據,推薦用這種算法
🌳'lsqr':最小平方差,可以結合skrinkage參數
🌳'eigen' :特征分解算法,可以結合shrinkage參數
(2)skrinkage:取值:字符串‘auto’或者浮點數或者None。
該參數通常在訓練樣本數量小于特征數量的場合下使用。
🌳‘auto’:自動決定shrinkage參數的大小
🌳None:不使用shrinkage參數
🌳浮點數(位于0~1之間):自己指定的shrinkage參數
(3)n_components:(整數類型)指定了數組降維后的維度(該值必須小于n_classes-1)
(4)priors:一個數組,數組中的元素依次指定了每個類別的先驗概率。如果為None,則認為每個類的先驗概率都是等可能的
3、常用返回值
coef_:權重向量
intercept:b值
covariance_:一個數組,依次給出了每個類別的協方差矩陣
means_:一個數組,依次給出了每個類別的均值向量
xbar_:給出了整體樣本的均值向量
4、利用LDA進行二分類實例
來個簡單的小栗子
我們使用sklearn里的乳腺癌數據集
from sklearn.datasets import load_breast_cancer cancer = load_breast_cancer()然后對數據進行一個處理,讓我們看起來舒服點,計算機處理也舒服點
data=cancer["data"] col = cancer['feature_names'] x = pd.DataFrame(data,columns=col)#就是那些個特征 target = cancer.target.astype(int) y = pd.DataFrame(target,columns=['target'])#對應特征組合下的類別標簽訓練集測試集分分類
from sklearn.model_selection import train_test_split x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=1)直接進入訓練
clf = LinearDiscriminantAnalysis(n_components=1) model=clf.fit(x_train,y_train)訓練出來的模型對test集進行一個預測
y_pred = model.predict(x_test) print(classification_report(y_test, y_pred))完整代碼
from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn import metrics import matplotlib.pyplot as plt from sklearn.metrics import classification_report import pandas as pd import warnings warnings.filterwarnings('ignore')cancer = load_breast_cancer()data=cancer["data"] col = cancer['feature_names'] x = pd.DataFrame(data,columns=col) target = cancer.target.astype(int) y = pd.DataFrame(target,columns=['target'])x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=1) clf = LinearDiscriminantAnalysis(n_components=1) model=clf.fit(x_train,y_train)y_pred = model.predict(x_test) print(classification_report(y_test, y_pred))結果
歡迎大家在評論區批評指正,謝謝~
總結
以上是生活随笔為你收集整理的线性判别分析(LDA)详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电子招标采购系统源码 项目说明 开发类型
- 下一篇: 什么是云计算云计算能干什么?云计算学习笔