因為對pca演算法的好奇,所以就寫一篇筆記記錄一下自己學習的過程。
三、小結
在現實生活中,我們人類總會存在一種這樣的習慣:關注自己所關心的,與此同時會忽略掉自己所不關心的事情。就像看一場足球比賽一樣,我們面對的顯示螢幕包含了幾十萬個畫素,那麼這其中的人或者球只佔了其中的一部分,那麼我們自然而然的會對我們的螢幕中的畫素進行降維處理,只關注其中的人和球的畫素就可以了。不過即使僅僅只面對人和球的畫素,我們仍然還有很多資訊要進行處理,但是正如ai教父hinton所說的那樣:「人也是機器,絕妙的機器」,我們的大腦採用了一種更為有效的方式來處理這些資料,也就是將其轉換為乙個三維影象。在這個過程中,我們就已經將顯示屏中的幾十萬個維度最終轉換為乙個三維資料。當然轉換的前提肯定是資料之間具有一定的相關性,這才能讓我們實現這個轉換過程,這也就是我們經常會提到的資料降維。
pca演算法就是一種很典型的一種降維方法,在pca中,其將資料從原來的座標系轉換到了新的座標系下,在這個轉換過程中,我們就需要為原始資料構建乙個超平面。那麼這個超平面就需要有下面這兩個性質:1、最近重構性:也就是樣本點到這個超平面的距離足夠近。
2、最大可分性:樣本點在這個超平面上的投影能盡可能的分開。
1、對所有樣本進行中心化,其實也就是將原始樣本減去其質心xˉ\bar
xˉ進行平移。
2、計算樣本的協方差矩陣cov
covco
v(1mxx
t\fracxx^t
m1xxt
)。3、對協方差矩陣cov
covco
v進行特徵值分解,並按照特徵值從大到小排序,取前k
kk個特徵值所對應的特徵向量組成低維超平面。
#-*- coding=utf-8 -*-
#@time : 2020/9/24 20:30
#@file : pca.py
#@software : pycharm
from numpy import
*from tkinter import filedialog
import matplotlib.pyplot as plt
"""函式說明:載入資料集
"""def
loaddataset
(delim=
'\t'):
dlg = filedialog.askopenfile(title=
'開啟檔案'
, filetypes=[(
"文字檔案"
,"*.txt"),
('python原始檔'
,'*.py')]
) filename = dlg.name # 獲取資料檔案路徑
fr =
open
(filename)
stringarr =
[line.strip(
).split(delim)
for line in fr.readlines()]
fr.close(
)# datarr=[line for line in stringarr]
return mat(stringarr)
.astype(
float
)'''
函式說明:pca方法使用
'''def
pca(datamat,topnfeat=
9999999):
meanvals=mean(datamat,axis=0)
meanremoved = datamat - meanvals #中心化
covmat = cov(meanremoved , rowvar=0)
#建立協方差矩陣
ei**als,ei**ects = linalg.eig(mat(covmat)
)#求解特徵值和特徵向量
ei**alind=argsort(ei**als)
#對特徵值進行排序
ei**alind = ei**alind[:-
(topnfeat +1)
:-1]
redei**ects = ei**ects[
:,ei**alind]
#獲取前k個特徵向量,組成投影矩陣
lowddatamat = meanremoved * redei**ects #進行投影轉換
reconmat =
(lowddatamat * redei**ects.t)
+ meanvals
return lowddatamat, reconmat
'''函式說明:顯示資料
'''def
showdata
(datamat,lowmat,reconmat)
: fig = plt.figure(
) ax = fig.add_subplot(
111)
ax.scatter(datamat[:,
0].flatten(
).a[0]
, datamat[:,
1].flatten(
).a[0]
,marker=
'^',s=90)
ax.scatter(reconmat[:,
0].flatten(
).a[0]
,reconmat[:,
1].flatten(
).a[0]
,marker=
'o',s=
10,c=
'red'
)# ax.scatter(lowmat[:,0].flatten().a[0],lowmat[:,1].flatten().a[0],marker='o',s=50,c='blue')
plt.show(
)'''
函式說明:主函式
'''if __name__ ==
'__main__'
: datamat = loaddataset(
) lowmat ,reconmat = pca(datamat,1)
showdata(datamat,lowmat,reconmat)
實現效果:
pca演算法的實驗過程可能相對簡單,不過其是乙個經典的降維方法,主要也被用於資料的壓縮和座標轉換這兩個方面。當遇到特徵個數過多或是想要提高演算法效率的情況時,可以考慮使用該方法來將原始資料降維處理,更多的用法還需要日後更為深入的學習了解。
pca主成分分析 PCA主成分分析(中)
矩陣 matrix,很容易讓人們想到那部著名的科幻電影 駭客帝國 事實上,我們又何嘗不是真的生活在matrix中。機器學習處理的大多數資料,都是以 矩陣 形式儲存的。矩陣是向量的組合,而乙個向量代表一組資料,資料又是多維度的。比如每個人的都具有身高 體重 長相 性情等多個維度的資訊資料,而這些多維度...
PCA演算法(主成分分析)
principle component analysis 顧名思義,是通過分析向量空間的主成分,將主成分提取出來,不重要的成分略去,從而達到降維壓縮資訊的目的。那什麼才是主成分呢?大家應該知道,乙個空間會有自己的一組基向量,空間中的任何乙個向量都可以通過基向量的組合來表示。舉個栗子,假如我們有一組2...
PCA(主成分分析)演算法
pca演算法,從名字看也知道是用於降維的,通過提取主特徵和主特徵向量,丟掉次要的特徵和特徵向量,實現降維。pca演算法流程 python 實現流程 1 零均值化 假如原始資料集為矩陣datamat,datamat中每一行代表乙個樣本,每一列代表乙個特徵。零均值化就是求每一列的平均值,然後該列上的所有...