PCA实现教程
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
摘要:?手把手教你PCA降維技術(shù)!(有案例)
數(shù)據(jù)是機(jī)器學(xué)習(xí)模型的生命燃料。對(duì)于特定的問題,總有很多機(jī)器學(xué)習(xí)技術(shù)可供選擇,但如果沒有很多好的數(shù)據(jù),問題將不能很好的解決。數(shù)據(jù)通常是大部分機(jī)器學(xué)習(xí)應(yīng)用程序中性能提升背后的驅(qū)動(dòng)因素。
有時(shí),數(shù)據(jù)可能很復(fù)雜。在那么多的數(shù)據(jù)中,知道哪些數(shù)據(jù)是真正重要的,具有一定的挑戰(zhàn)性。降維是一種可以幫助我們更好地了解數(shù)據(jù)的技術(shù),它減少了數(shù)據(jù)集的特征數(shù)量,因此只剩下最重要的部分特征。
主成分分析(PCA)是一種用于降維的簡單而強(qiáng)大的技術(shù)。通過它,我們可以直接減少特征變量的數(shù)量,從而減少重要特征并節(jié)省計(jì)算量。從高層次來看,PCA有三個(gè)主要步驟:
(1)計(jì)算數(shù)據(jù)的協(xié)方差矩陣;
(2)計(jì)算該協(xié)方差矩陣的特征值和向量;
(3)通過特征值和向量來只選擇最重要的特征向量,然后將數(shù)據(jù)轉(zhuǎn)換為這些向量以降低維度。
(1)計(jì)算協(xié)方差矩陣
PCA產(chǎn)生一個(gè)特征子空間,使特征向量的方差最大化。因此,為了正確計(jì)算這些特征向量的方差,必須對(duì)它們進(jìn)行適當(dāng)?shù)钠胶?。為?shí)現(xiàn)此目的,我們首先將數(shù)據(jù)歸一化為零均值和單位方差,以便在計(jì)算中對(duì)每個(gè)特征進(jìn)行加權(quán)。假設(shè)我們的數(shù)據(jù)集為X:
from sklearn.preprocessing import StandardScalerX = StandardScaler().fit_transform(X)兩個(gè)變量的協(xié)方差衡量它們是如何“相關(guān)”的。如果兩個(gè)變量的協(xié)方差是正的,那么當(dāng)一個(gè)變量增加時(shí),另一個(gè)變量增加;在協(xié)方差為負(fù)的情況下,特征變量的值將在相反方向上改變。協(xié)方差矩陣只是一個(gè)數(shù)組,其中每個(gè)值基于矩陣中的x-y位置指定兩個(gè)特征變量之間的協(xié)方差。公式是:
其中帶有上劃線的x是X的每個(gè)特征的均值向量,將轉(zhuǎn)置矩陣乘以原始矩陣時(shí),我們最終將每個(gè)數(shù)據(jù)點(diǎn)的每個(gè)特征相乘!在numpy代碼中實(shí)現(xiàn)如下:
import numpy as np # Compute the mean of the data mean_vec = np.mean(X, axis=0) # Compute the covariance matrix cov_mat = (X - mean_vec).T.dot((X - mean_vec)) / (X.shape[0]-1) # OR we can do this with one line of numpy: cov_mat = np.cov(X.T)(2)計(jì)算特征值和向量
我們的協(xié)方差矩陣的特征向量(主成分)表示新特征空間的向量方向,而特征值表示這些向量的大小。由于我們正在研究協(xié)方差矩陣,因此特征值量化了每個(gè)向量的貢獻(xiàn)方差。
如果特征向量具有相應(yīng)的高幅度特征值,則意味著我們的數(shù)據(jù)在特征空間中沿著該向量具有高方差。因此,該向量包含有關(guān)數(shù)據(jù)的大量信息,因?yàn)檠刂撓蛄康娜魏我苿?dòng)都會(huì)導(dǎo)致大的“方差”。另一方面,具有小特征值的向量具有低方差,因此當(dāng)沿著該向量移動(dòng)時(shí),我們的數(shù)據(jù)不會(huì)有很大變化。由于在沿著特定特征向量移動(dòng)時(shí)沒有任何變化,即改變?cè)撎卣飨蛄康闹挡粫?huì)對(duì)我們的數(shù)據(jù)產(chǎn)生很大影響,那么我們可以說這個(gè)特征不是很重要,可以忽略它。
這是PCA中特征值和向量的全部本質(zhì),找到表示數(shù)據(jù)最重要的向量,并丟棄其余的向量。計(jì)算協(xié)方差矩陣的特征向量和值是一個(gè)簡單的單線性的numpy。之后,我們將根據(jù)它們的特征值按降序?qū)μ卣飨蛄窟M(jìn)行排序。
# Compute the eigen values and vectors using numpy eig_vals, eig_vecs = np.linalg.eig(cov_mat) # Make a list of (eigenvalue, eigenvector) tuples eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:,i]) for i in range(len(eig_vals))] # Sort the (eigenvalue, eigenvector) tuples from high to low eig_pairs.sort(key=lambda x: x[0], reverse=True)(3)映射到新的向量上
此時(shí),我們有一個(gè)特征向量列表,這些特征向量基于它們的特征值按照數(shù)據(jù)集的“重要性”進(jìn)行排序?,F(xiàn)在要做的是選擇最重要的特征向量并丟棄其余的,可以通過查看向量的可解釋方差百分比來巧妙地做到這一點(diǎn)。該百分比量化了總100%中每個(gè)主成分可歸因于多少信息(方差)。
我們舉一個(gè)例子來說明。假設(shè)一個(gè)最初有10個(gè)特征向量的數(shù)據(jù)集。在計(jì)算協(xié)方差矩陣之后,特征值是:
[12,10,8,7,5,1,0.1,0.03,0.005,0.0009]
該數(shù)組的總和= 43.1359,但前6個(gè)值代表:43 / 43.1359 =總數(shù)的99.68%!這意味著我們的前6個(gè)特征向量有效地保持了99.68%有關(guān)數(shù)據(jù)集的信息。因此,可以丟棄最后4個(gè)特征向量,因?yàn)樗鼈冎话?.32%的信息,這就節(jié)省了40%的計(jì)算量。
因此,我們可以簡單地定義一個(gè)閾值,這個(gè)閾值可以決定是保留還是丟棄每個(gè)特征向量。在下面的代碼中,設(shè)定閾值97%來決定每個(gè)特征向量是否丟棄。
# Only keep a certain number of eigen vectors based on # the "explained variance percentage" which tells us how # much information (variance) can be attributed to each # of the principal componentsexp_var_percentage = 0.97 # Threshold of 97% explained variance tot = sum(eig_vals) var_exp = [(i / tot)*100 for i in sorted(eig_vals, reverse=True)] cum_var_exp = np.cumsum(var_exp) num_vec_to_keep = 0 for index, percentage in enumerate(cum_var_exp):if percentage > exp_var_percentage:num_vec_to_keep = index + 1break最后一步是將我們的數(shù)據(jù)實(shí)際投射到?jīng)Q定保留的向量上。我們通過構(gòu)建投影矩陣來做到這一點(diǎn):我們將通過相乘將數(shù)據(jù)投影到新的向量上。為了創(chuàng)建它,簡單地與決定保留的所有特征向量進(jìn)行連接,最后一步是簡單地在原始數(shù)據(jù)和投影矩陣之間取點(diǎn)積。
維度降低了!
# Compute the projection matrix based on the top eigen vectors num_features = X.shape[1] proj_mat = eig_pairs[0][1].reshape(num_features,1) for eig_vec_idx in range(1, num_vec_to_keep):proj_mat = np.hstack((proj_mat, eig_pairs[eig_vec_idx][1].reshape(num_features,1))) # Project the data pca_data = X.dot(proj_mat)原文鏈接?
轉(zhuǎn)載于:https://my.oschina.net/u/1464083/blog/2878015
總結(jié)
- 上一篇: 高斯分布绘图的一些记录
- 下一篇: 在Rancher 1.6上部署Traef