您當前的位置:首頁 > 動漫

【05】、特徵提取:PCA演算法詳細實現

作者:由 鴿子 發表于 動漫時間:2021-12-12

特徵提取的目的

主要目的是為了排除資訊量小的特徵

減少計算量等

特徵提取的主要方法

主成分分析

PCA

PCA演算法是如何實現的?

#1、中心化

#2、求協方差矩陣

#3、求特徵空間

#4、對資料降維

import numpy as np

class PPCA(object):

def __init__(self,X,K):

#X:原始資料,K:降到幾階

#centrX:矩陣X的中心化

#C:協方差矩陣

#U:降維轉換矩陣

#Z:將本X的降維矩陣

self。X,self。K,self。C,self。U,self。Z,self。centrX = X,K,[],[],[],[]

#求centrX:中心化過的陣列

self。centrX = self。_centralized()

#C:協方差矩陣

self。C = self。_cov()

#U:降維轉換矩陣

self。U = self。_U()

#Z:將X進行PPCA降維之後的矩陣

self。Z = self。_Z()

#1、中心化

def _centralized(self):

#求每個屬性上的均值

#np。arry:建立一個數組

#np。mean:求均值

#這裡的mean:對X的每一列資料求均值

mean = np。array([np。mean(attr) for attr in self。X。T])

#樣本集X中心化

self。centrX = self。X - mean

return self。centrX

#2、求協方差矩陣

def _cov(self):

# np。shape():返回兩個資料1、陣列中的樣例個數 2、一個樣例包含了幾個維度

# ns:樣例的總個數

ns = np。shape(self。centrX)[0]

# 求樣本的協方差矩陣C:這裡套用做完中心化之後的公式

self。C = np。dot(self。centrX。T, self。centrX) / (ns - 1)

return self。C

#3、求降維轉換矩陣

def _U(self):

#求樣本X的特徵值和特徵向量

#char_value,char_vector:特徵值,特徵向量

char_value,char_vector = np。linalg。eig(self。C)

# np。argsort:將下標按照值的大小:從小到達排列

#這裡*-1,所以是將char_value的值的下標,從大到小排列

ind = np。argsort(-1*char_value)

#構建K階降維矩陣U

#ind[i]] for i in range(self。K) :取前0~K個char_value

#char_vector[:,ind[i]]:按照ind得到對應的char_vector

UT = [char_vector[:,ind[i]] for i in range(self。K)]

#求降維轉換矩陣U

#np。transpose:矩陣的轉置

self。U = np。transpose(UT)

return self。U

#求降維後的矩陣

def _Z(self):

#套用公式:

self。Z = np。dot(self。X,self。U)

print(self。Z)

return self。Z

if __name__ == ‘__main__’:

‘10樣本3特徵的樣本集, 行為樣例,列為特徵維度’

X = np。array([[10, 15, 29],

[15, 46, 13],

[23, 21, 30],

[11, 9, 35],

[42, 45, 11],

[9, 48, 5],

[11, 21, 14],

[8, 5, 15],

[11, 12, 21],

[21, 20, 25]])

K = np。shape(X)[1] - 1

# print(‘樣本集(10行3列,10個樣例,每個樣例3個特徵):\n’, X)

pca = PPCA(X, K)

標簽: self  np  矩陣  char  centrX