這次,我們來學習一種經典的降維方法:
線性判別分析(Linear Discriminant Analysis, 以下簡稱LDA)
.
在前面博客中(點我)我們講解了PCA降維算法。
PCA追求的是在降維之后能夠最大化保持數據的內在信息,并通過衡量在投影方向上的數據方差的大小來衡量該方向的重要性。
PCA優缺點:
優點:1.最小誤差 2.提取了主要信息
缺點:PCA將所有的樣本(特征向量集合)作為一個整體對待,去尋找一個均方誤差最小意義下的最優線性映射投影,而忽略了類別屬性,而它所忽略的投影方向有可能剛好包含了重要的可分性信息。
LDA所追求的目標和PCA不同,
不是希望保持數據最多的信息,而是希望數據在降維后能夠很容易地被區分開來。
LDA一種
有監督的
線性降維方法,,也就是說它的數據集的每個樣本是有類別輸出的。這點和PCA不同。PCA是不考慮樣本類別輸出的無監督降維技術。
核心思想
:
往線性判別超平面的法向量上投影
,使的區分度最大(高內聚,低耦合)。LDA是為了使得降維后的數據點盡可能地容易被區分!
用一句話概括,就是**“投影后類內方差最小,類間方差最大”**。
什么意思呢?
我們要將數據在低維度上進行投影,
投影后希望每一種類別數據的投影點盡可能的接近,
而不同類別的數據的類別中心之間的距離盡可能的大。
LDA算法計算步驟:
- 對d維數據進行標準化處理(d為特征數量)
- 對每一類別,計算d維的均值向量
- 構造類間的散步矩陣和類內的散步矩陣
- 計算矩陣的特征值和對應的特征向量
- 選取前k個特征值對應的特征向量 ,構造一個d x k維的轉換矩陣W,特征向量以列的形式排列
- 使用轉換矩陣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:
這里,我們使用了自己編程實現的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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
