【05】、特徵提取:PCA演算法詳細實現
特徵提取的目的
:
主要目的是為了排除資訊量小的特徵
,
減少計算量等
特徵提取的主要方法
:
主成分分析
(
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)
上一篇:如何求方法的檢出限
下一篇:zbrush是什麼軟體