PCA 主成分分析 演算法

2021-10-09 18:18:20 字數 3366 閱讀 5969

因為對pca演算法的好奇,所以就寫一篇筆記記錄一下自己學習的過程。

三、小結

在現實生活中,我們人類總會存在一種這樣的習慣:關注自己所關心的,與此同時會忽略掉自己所不關心的事情。就像看一場足球比賽一樣,我們面對的顯示螢幕包含了幾十萬個畫素,那麼這其中的人或者球只佔了其中的一部分,那麼我們自然而然的會對我們的螢幕中的畫素進行降維處理,只關注其中的人和球的畫素就可以了。不過即使僅僅只面對人和球的畫素,我們仍然還有很多資訊要進行處理,但是正如ai教父hinton所說的那樣:「人也是機器,絕妙的機器」,我們的大腦採用了一種更為有效的方式來處理這些資料,也就是將其轉換為乙個三維影象。在這個過程中,我們就已經將顯示屏中的幾十萬個維度最終轉換為乙個三維資料。當然轉換的前提肯定是資料之間具有一定的相關性,這才能讓我們實現這個轉換過程,這也就是我們經常會提到的資料降維。

pca演算法就是一種很典型的一種降維方法,在pca中,其將資料從原來的座標系轉換到了新的座標系下,在這個轉換過程中,我們就需要為原始資料構建乙個超平面。那麼這個超平面就需要有下面這兩個性質:

1、最近重構性:也就是樣本點到這個超平面的距離足夠近。

2、最大可分性:樣本點在這個超平面上的投影能盡可能的分開。

1、對所有樣本進行中心化,其實也就是將原始樣本減去其質心x

ˉ\bar

xˉ進行平移。

2、計算樣本的協方差矩陣cov

covco

v(1mxx

t\fracxx^t

m1​xxt

)。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中每一行代表乙個樣本,每一列代表乙個特徵。零均值化就是求每一列的平均值,然後該列上的所有...