一 PCA分析法介紹
可以理解為是一種降維的思想,將M列資料降維成對應的N列資料,用主要的幾個欄位解釋整體方差變異
也可以理解為一種低維度的映射,舉例將三維的資料找到一個二維映射面,同時可以盡力解釋出較多的資訊來
舉例如下圖所示:

二 PCA分析法的基礎步驟
1.對資料求平均值,即求取對應的均值u=E(X)
2.對特征資料進行去中心化處理,即X= X-E(X)=X-u
3.對去中心化處理的特征矩陣求取協方差矩陣COV(X)
4.對協方差矩陣求特征根和特征向量numta1,namuta2,numta3…及對應特征向量
5.求前K個對應大的特征向量
6.將原始M維去中心化的特征矩陣乘上由特征向量(按列組合)組成的矩陣,就可得到最終的結果N維
三 相關代碼
3.1 手工計算對應的代碼
#加載庫
import numpy as np
import matplotlib.pyplot as plt
#加載資料
def load_data(file_name, delim='\t'):
fr = open(file_name)
str_arr = [line.strip().split(delim) for line in fr.readlines()]
dat_arr = [list(map(float,line)) for line in str_arr]
return np.mat(dat_arr)
#定義PCA方法
def pca(data_mat, topNfeat = 999999):
# 求平均值
mean_val = np.mean(data_mat, axis = 0)
#去中心化
mean_removed = mean_val - data_mat
# 獲取協方差矩陣
cov_mat = np.cov(mean_removed, rowvar=0)
# 獲取特征根及特征向量
eigen_vals, eigen_vecs = np.linalg.eig(cov_mat)
# 特征根排序
eigen_val_ind = np.argsort(eigen_vals)
# 洗掉解釋量小的特征根
eigen_val_ind = eigen_val_ind[:-(topNfeat+1):-1]
print(eigen_val_ind)
# 由高到低排序
red_eigen_vecs = eigen_vecs[:,eigen_val_ind]
print(red_eigen_vecs)
# l新維度的資料
low_data_mat = mean_removed * red_eigen_vecs
# 獲取目標向量值
recon_mat = (low_data_mat * red_eigen_vecs.T) + mean_val
return low_data_mat, recon_mat
# 主函式呼叫
if __name__ == '__main__':
data_mat = load_data("data.txt")
low_data_mat, recon_mat = pca(data_mat, 1)
plt.figure()
plt.scatter(data_mat[:,0].flatten().A[0], data_mat[:,1].flatten().A[0], marker='^', s = 90)
plt.scatter(recon_mat[:,0].flatten().A[0], recon_mat[:,1].flatten().A[0], marker='o', s = 50, c = "red")
plt.show()
3.2 機器學習PCA計算的代碼
## 使用機器學習的內置函式計算,使用鳶尾花資料
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
#加載資料
iris = load_iris()
x = iris.keys()
data_x = iris.data
data_y = iris.target
#print(data_y,data_x)
#PCA方法訓練并求取新維度的資料
pca = PCA(n_components=2)
pca = pca.fit(data_x)
x_dr = pca.transform(data_x)
#圖形化顯示
plt.scatter(x_dr[data_y==0,0],x_dr[data_y==0,1],c='red',label=iris.target_names[0])
plt.scatter(x_dr[data_y==1,0],x_dr[data_y==1,1],c='green',label=iris.target_names[1])
plt.scatter(x_dr[data_y==2,0],x_dr[data_y==2,1],c='blue',label=iris.target_names[2])
plt.legend
plt.title("iris dataset")
plt.show()
鳶尾花的二維顯示效果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/306035.html
標籤:區塊鏈
上一篇:量化交易機器人
