(三)K-L變換及其python實現
關於特徵選擇和提取
特徵選擇和提取是構造模式識別系統時的一個重要課題。在很多實際問題中,往往不容易找到那些最重要的特徵,或受客觀條件的限制,不能對它們進行有效的測量。因此在測量時,由於人們心理上的作用,只要條件許可總希望把特徵取得多一些。另外,由於客觀上的需要,為了突出某些有用資訊,抑制無用資訊,有意加上一些比值、指數或對數等組合計算特徵;如果將數目很多的測量值
不做分析,全部直接用作分類特徵,不但耗時,而且會影響到分類的效果
,產生“
特徵維數災難
”問題。在遙感影象分割上則體現在影象的多個光譜資訊,諸如植被指數、水體指數、建築物指數等各種建模指數。
為了設計出效果好的分類器,通常需要對原始的測量值集合進行分析,
經過選擇或變換處理
,組成有效的識別特徵。在保證一定分類精度的前提下,減少特徵維數,即進行“降維”處理,使分類器實現快速、準確和高效的分類。為達到上述目的,關鍵是所提供的識別特徵應具有很好的可分性,使分類器容易判別。為此,需對特徵進行選擇:應去掉模稜兩可、不易判別的特徵;所提供的特徵不要重複,即去掉那些相關性強且沒有增加更多分類資訊的特徵。
K-L變換
K-L變換(Karhunen-Loeve變換)屬於上述中的變換處理,將原來的特徵做正交變換,獲得的每個資料都是原來n個數據的線性組合,然後從新的資料中選出少數幾個,使其儘可能多地反映各類模式之間的差異,而這些特徵間又儘可能相互獨立,則比單純的選擇方法更靈活、更有效。
K-L變換是一種適用於任意機率密度函式的正交變換
。
在將整體模式進行K-L變換之前,應先將其均值作為新座標軸的原點,採用協方差矩陣C或自相關矩陣R來計算特徵值。
K-L變換的步驟:
求取協方差矩陣
求取協方差矩陣的特徵值、特徵向量
對特徵值從大到小排序,取前m個對應的特徵向量進行變換
例子:
•設有如下兩類樣本集,其出現的機率相等:
用K-L變換,分別把特徵空間維數降到二維和一維。
解題程式碼如下:
import
numpy
as
np
omega_1
=
np
。
array
([[
0
,
0
,
0
],[
1
,
0
,
0
],[
1
,
0
,
1
],[
1
,
1
,
0
]])
。
T
omega_2
=
np
。
array
([[
0
,
0
,
1
],[
0
,
1
,
0
],[
0
,
1
,
1
],[
1
,
1
,
1
]])
。
T
# 將Omega_1和Omega_2兩種模式作為一個整體考慮
x
=
np
。
concatenate
((
omega_1
,
omega_2
),
axis
=
1
)
# 求取均值(寫作業要用到)
m
=
np
。
mean
(
x
,
axis
=
1
)
# 求取協方差矩陣
C
=
np
。
cov
(
x
,
bias
=
True
)
# 求取協方差矩陣的特徵值、特徵向量
lamda
,
phi
=
np
。
linalg
。
eig
(
C
)
# 對特徵值從大到小排序
sort_lamda
=
-
np
。
sort
(
-
lamda
)
# 從大到小排序,輸出原始序列的索引
sort_index
=
np
。
argsort
(
-
lamda
)
# 降到2維,從大到小選取前2個特徵向量
Selected_phi2
=
np
。
concatenate
((
phi
[:,
sort_index
[
0
]]
。
reshape
(
3
,
1
),
phi
[:,
sort_index
[
1
]]
。
reshape
(
3
,
1
)),
axis
=
1
)
omega_1_tra2
=
np
。
dot
(
Selected_phi2
。
T
,
omega_1
)
omega_2_tra2
=
np
。
dot
(
Selected_phi2
。
T
,
omega_2
)
(
‘omega_1_tra2:’
,
omega_1_tra2
)
(
‘omega_2_tra2:’
,
omega_2_tra2
)
# 降到1維,從大到小選取前1個特徵向量
Selected_phi1
=
phi
[:,
sort_index
[
0
]]
。
reshape
(
3
,
1
)
omega_1_tra1
=
np
。
dot
(
Selected_phi1
。
T
,
omega_1
)
omega_2_tra1
=
np
。
dot
(
Selected_phi1
。
T
,
omega_2
)
(
‘omega_1_tra1:’
,
omega_1_tra1
)
(
‘omega_2_tra1:’
,
omega_2_tra1
)
後記
如有問題,歡迎交流批評指正。
上一篇:你的印章用對了嗎?
下一篇:該放下異地戀還是該堅守?