PCA(主成分分析)思想及實現

PCA的概念:

PCA是用來實現特征提取的。
特征提取的主要目的是為了排除信息量小的特征,減少計算量等。
簡單來說:
當數據含有多個特征的時候,選取主要的特征,排除次要特征或者不重要的特征。
比如說:我們要區分貓和狗。那么,貓和狗是否有胡子就變得尤為重要,這屬于主要特征,但是貓和狗的顏色就變得不重要了,這就屬于不重要特征了。但是當我們要區分貓的種類的時候,貓的顏色又變成主要特征了。這說明主要特征是相對的,而不是絕對的。而我們要保留那些對結果更重要的特征,減少不重要的特征,這就是主成分分析。

PCA的實現:

PCA算法是如何實現的?

簡單來說,就是將數據從原始的空間中轉換到新的特征空間中,例如原始的空間是三維的(x,y,z),x、y、z分別是原始空間的三個基,我們可以通過某種方法,用新的坐標系(a,b,c)來表示原始的數據,那么a、b、c就是新的基,它們組成新的特征空間。在新的特征空間中,可能所有的數據在c上的投影都接近于0,即可以忽略,那么我們就可以直接用(a,b)來表示數據,這樣數據就從三維的(x,y,z)降到了二維的(a,b)。

問題是如何求新的基(a,b,c)?

一般步驟是這樣的:

  1. 對原始數據零均值化(中心化),
  2. 求協方差矩陣,
  3. 對協方差矩陣求特征向量和特征值,這些特征向量組成了新的特征空間。

1.PCA–零均值化(中心化):

只有中心化數據之后,計算得到的方向才能比較好的“概括”原來的數據。
此圖形象的表述了,中心化的幾何意義,就是將樣本集的中心平移到坐標系的原點O上。
(這一步其實也可以沒有,但是有了更加錦上添花)
在這里插入圖片描述

2.PCA–求協方差矩陣

這里更多是線性代數知識:
協方差就是一種用來度量兩個隨機變量關系的統計量。
同一元素的協方差就表示該元素的方差,不同元素之間的協方差就表示它們的相關性。
協方差:
在這里插入圖片描述
方差:
在這里插入圖片描述

協方差的性質:在這里插入圖片描述
由定義可看出:在這里插入圖片描述
比如,三維(x,y,z)的協方差矩陣:在這里插入圖片描述
在這里插入圖片描述
協方差矩陣的特點:
? 協方差矩陣計算的是不同維度之間的協方差, 而不是不同樣本之間的。
? 樣本矩陣的每行是一個樣本,每列為一個維度,所以我們要按列計算均值。
? 協方差矩陣的對角線就是各個維度上的方差

特別的,如果做了中心化,則協方差矩陣為(中心化矩陣的協方差矩陣公式):
在這里插入圖片描述

3. 對協方差矩陣求特征向量和特征值,這些特征向量組成了新的特征空間。

A為n階矩陣,若數λ和n維非0列向量x滿足Ax=λx,那么數λ稱為A的特征值,x稱為A的對應于特征值λ 的特征向量。 式Ax=λx也可寫成( A-λE)x=0,E是單位矩陣,并且|A-λE|叫做A 的特征多項式。當特征多項式等于0的
時候,稱為A的特征方程,特征方程是一個齊次線性方程組,求解特征值的過程其實就是求解特征方
程的解。
對于協方差矩陣A,其特征值( 可能有多個)計算方法為:
在這里插入圖片描述
在這里插入圖片描述
(這里就是線性代數知識)
接下來進行排序:特征值越大,意味著相關性越大
在這里插入圖片描述

PCA–評價模型的好壞,K值的確定

通過特征值的計算我們可以得到主成分所占的百分比,用來衡量模型的好壞。
對于前k個特征值所保留下的信息量計算方法如下:在這里插入圖片描述

PCA–PCA降維的幾何意義:

我們對于一組數據,如果它在某一坐標軸上的方差越大,說明坐標點越分散,該屬性能夠比較
好的反映源數據。所以在進行降維的時候,主要目的是找到一個超平面,它能使得數據點的分
布方差呈最大,這樣數據表現在新的坐標軸上時候已經足夠分散了。
PCA算法的優化目標就是:
① 降維后同一維度的方差最大
② 不同維度之間的相關性為0

PCA算法的優缺點:

優點:

  1. 完全無參數限制的。在PCA的計算過程中完全不需要人為的設定參數或是根據任何經驗模型對計
    算進行干預,最后的結果只與數據相關,與用戶是獨立的。
  2. 用PCA技術可以對數據進行降維,同時對新求出的“主元”向量的重要性進行排序,根據需要取前
    面最重要的部分,將后面的維數省去,可以達到降維從而簡化模型或是對數據進行壓縮的效果。同
    時最大程度的保持了原有數據的信息。
  3. 各主成分之間正交,可消除原始數據成分間的相互影響。
  4. 計算方法簡單,易于在計算機上實現。

缺點:

  1. 如果用戶對觀測對象有一定的先驗知識,掌握了數據的一些特征,卻無法通過參數化等方法對處
    理過程進行干預,可能會得不到預期的效果,效率也不高。
  2. 貢獻率小的主成分往往可能含有對樣本差異的重要信息。

PCA的代碼實現:

PCA接口實現:

import numpy as np
from sklearn.decomposition import PCA
X = np.array([[-1,2,66,-1], [-2,6,58,-1], [-3,8,45,-2], [1,9,36,1], [2,10,62,1], [3,5,83,2]])  #導入數據,維度為4
pca = PCA(n_components=2)   #降到2維
pca.fit(X)                  #訓練
newX=pca.fit_transform(X)   #降維后的數據
# PCA(copy=True, n_components=2, whiten=False)
print(pca.explained_variance_ratio_)  #輸出貢獻率
print(newX)                  #輸出降維后的數據

PCA函數實現:

import numpy as np
class PCA():def __init__(self,n_components):self.n_components = n_componentsdef fit_transform(self,X):self.n_features_ = X.shape[1]# 求協方差矩陣X = X - X.mean(axis=0)self.covariance = np.dot(X.T,X)/X.shape[0]# 求協方差矩陣的特征值和特征向量eig_vals,eig_vectors = np.linalg.eig(self.covariance)# 獲得降序排列特征值的序號idx = np.argsort(-eig_vals)# 降維矩陣self.components_ = eig_vectors[:,idx[:self.n_components]]# 對X進行降維return np.dot(X,self.components_)# 調用
pca = PCA(n_components=2)
X = np.array([[-1,2,66,-1], [-2,6,58,-1], [-3,8,45,-2], [1,9,36,1], [2,10,62,1], [3,5,83,2]])  #導入數據,維度為4
newX=pca.fit_transform(X)
print(newX)                  #輸出降維后的數據

PCA手動函數實現:

"""
使用PCA求樣本矩陣X的K階降維矩陣Z
"""import numpy as npclass CPCA(object):'''用PCA求樣本矩陣X的K階降維矩陣ZNote:請保證輸入的樣本矩陣X shape=(m, n),m行樣例,n個特征'''def __init__(self, X, K):''':param X,訓練樣本矩陣X:param K,X的降維矩陣的階數,即X要特征降維成k階'''self.X = X       #樣本矩陣Xself.K = K       #K階降維矩陣的K值self.centrX = [] #矩陣X的中心化self.C = []      #樣本集的協方差矩陣Cself.U = []      #樣本矩陣X的降維轉換矩陣self.Z = []      #樣本矩陣X的降維矩陣Zself.centrX = self._centralized()self.C = self._cov()self.U = self._U()self.Z = self._Z() #Z=XU求得def _centralized(self):'''矩陣X的中心化'''print('樣本矩陣X:\n', self.X)centrX = []mean = np.array([np.mean(attr) for attr in self.X.T]) #樣本集的特征均值print('樣本集的特征均值:\n',mean)centrX = self.X - mean ##樣本集的中心化print('樣本矩陣X的中心化centrX:\n', centrX)return centrXdef _cov(self):'''求樣本矩陣X的協方差矩陣C'''#樣本集的樣例總數ns = np.shape(self.centrX)[0]#樣本矩陣的協方差矩陣CC = np.dot(self.centrX.T, self.centrX)/(ns - 1)print('樣本矩陣X的協方差矩陣C:\n', C)return Cdef _U(self):'''求X的降維轉換矩陣U, shape=(n,k), n是X的特征維度總數,k是降維矩陣的特征維度'''#先求X的協方差矩陣C的特征值和特征向量a,b = np.linalg.eig(self.C) #特征值賦值給a,對應特征向量賦值給b。函數doc:https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.linalg.eig.html print('樣本集的協方差矩陣C的特征值:\n', a)print('樣本集的協方差矩陣C的特征向量:\n', b)#給出特征值降序的topK的索引序列ind = np.argsort(-1*a)#構建K階降維的降維轉換矩陣UUT = [b[:,ind[i]] for i in range(self.K)]U = np.transpose(UT)print('%d階降維轉換矩陣U:\n'%self.K, U)return Udef _Z(self):'''按照Z=XU求降維矩陣Z, shape=(m,k), n是樣本總數,k是降維矩陣中特征維度總數'''Z = np.dot(self.X, self.U)print('X shape:', np.shape(self.X))print('U shape:', np.shape(self.U))print('Z shape:', np.shape(Z))print('樣本矩陣X的降維矩陣Z:\n', Z)return Zif __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] - 1print('樣本集(10行3列,10個樣例,每個樣例3個特征):\n', X)pca = CPCA(X,K)

PCA應用——鳶尾花數據集

import matplotlib.pyplot as plt
import sklearn.decomposition as dp
from sklearn.datasets.base import load_irisx,y=load_iris(return_X_y=True) #加載數據,x表示數據集中的屬性數據,y表示數據標簽
pca=dp.PCA(n_components=2) #加載pca算法,設置降維后主成分數目為2
reduced_x=pca.fit_transform(x) #對原始數據進行降維,保存在reduced_x中
red_x,red_y=[],[]
blue_x,blue_y=[],[]
green_x,green_y=[],[]
for i in range(len(reduced_x)): #按鳶尾花的類別將降維后的數據點保存在不同的表中if y[i]==0:red_x.append(reduced_x[i][0])red_y.append(reduced_x[i][1])elif y[i]==1:blue_x.append(reduced_x[i][0])blue_y.append(reduced_x[i][1])else:green_x.append(reduced_x[i][0])green_y.append(reduced_x[i][1])
plt.scatter(red_x,red_y,c='r',marker='x')
plt.scatter(blue_x,blue_y,c='b',marker='D')
plt.scatter(green_x,green_y,c='g',marker='.')
plt.show()

PCA的一點思考:

正如開頭我舉的例子,當區分貓狗之間時,PCA將胡子等關鍵信息作為主要特征,但是當區分貓的種類時,PCA是如何做到在貓中把顏色也作為主要特征?就是說從隨著算法目標的改變,如何做到主要特征的改變?
我后來想了想,我覺得PCA是針對數據集中各數據互相之間的差距。當分析貓狗時,數據集中主要是貓和狗,當對數據集中進行PCA時,針對的是方差較大的一些數據特征,但是當分析貓的種類時,數據集中主要是貓,方差較大的數據特征就變成了顏色等主要特征。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389306.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389306.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389306.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【安富萊二代示波器教程】第8章 示波器設計—測量功能

第8章 示波器設計—測量功能 二代示波器測量功能實現比較簡單,使用2D函數繪制即可。不過也專門開辟一個章節,為大家做一個簡單的說明,方便理解。 8.1 水平測量功能 8.2 垂直測量功能 8.3 總結 8.1 水平測量功能 水平測量方…

深度學習數據更換背景_開始學習數據科學的最佳方法是了解其背景

深度學習數據更換背景數據科學教育 (DATA SCIENCE EDUCATION) 目錄 (Table of Contents) The Importance of Context Knowledge 情境知識的重要性 (Optional) Research Supporting Context-Based Learning (可選)研究支持基于上下文的學習 The Context of Data Science 數據科學…

熊貓數據集_用熊貓掌握數據聚合

熊貓數據集Data aggregation is the process of gathering data and expressing it in a summary form. This typically corresponds to summary statistics for numerical and categorical variables in a data set. In this post we will discuss how to aggregate data usin…

IOS CALayer的屬性和使用

一、CALayer的常用屬性 1、propertyCGPoint position; 圖層中心點的位置,類似與UIView的center;用來設置CALayer在父層中的位置;以父層的左上角為原點(0,0); 2、 property CGPoint anchorPoint…

GridView詳解

快速預覽:GridView無代碼分頁排序GridView選中,編輯,取消,刪除GridView正反雙向排序GridView和下拉菜單DropDownList結合GridView和CheckBox結合鼠標移到GridView某一行時改變該行的背景色方法一鼠標移到GridView某一行時改變該行…

訪問模型參數,初始化模型參數,共享模型參數方法

一. 訪問模型參數 對于使用Sequential類構造的神經網絡,我們可以通過方括號[]來訪問網絡的任一層。回憶一下上一節中提到的Sequential類與Block類的繼承關系。 對于Sequential實例中含模型參數的層,我們可以通過Block類的params屬性來訪問該層包含的所有…

QZEZ第一屆“飯吉圓”杯程序設計競賽

終于到了飯吉圓杯的開賽,這是EZ我參與的歷史上第一場ACM賽制的題目然而沒有罰時 不過題目很好,舉辦地也很成功,為法老點贊!!! 這次和翰爺,吳駿達 dalao,陳樂揚dalao組的隊&#xff0…

談談數據分析 caoz_讓我們談談開放數據…

談談數據分析 caozAccording to the International Open Data Charter(1), it defines open data as those digital data that are made available with the technical and legal characteristics necessary so that they can be freely used, reused and redistributed by any…

數據創造價值_展示數據并創造價值

數據創造價值To create the maximum value, urgency, and leverage in a data partnership, you must present the data available for sale or partnership in a clear and comprehensive way. Partnerships are based upon the concept that you are offering value for valu…

Java入門系列-22-IO流

File類的使用 Java程序如何訪問文件?通過 java.io.File 類 使用File類需要先創建文件對象 File filenew File(String pathname);,創建時在構造函數中指定物理文件或目錄,然后通過文件對象的方法操作文件或目錄的屬性。 \ 是特殊字符&#xff…

缺了一部分

學Java好多年,也參與一次完整項目,覺得讓自己寫項目寫不出來,總覺得缺了一部分。 在這方面愚笨,不知道缺在哪里。以前覺得是知識不夠牢固,于是重復去學,發現就那些東西。如果沒有業務來熟悉的話&#xff0c…

卷積神經網絡——各種網絡的簡潔介紹和實現

各種網絡模型:來源《動手學深度學習》 一,卷積神經網絡(LeNet) LeNet分為卷積層塊和全連接層塊兩個部分。下面我們分別介紹這兩個模塊。 卷積層塊里的基本單位是卷積層后接最大池化層:卷積層用來識別圖像里的空間模…

數據中臺是下一代大數據_全棧數據科學:下一代數據科學家群體

數據中臺是下一代大數據重點 (Top highlight)Data science has been an eye-catching field for many years now to young individuals having formal education with a bachelors, masters or Ph.D. in computer science, statistics, business analytics, engineering manage…

net如何判斷瀏覽器的類別

回復:.net如何判斷瀏覽器的類別?瀏覽器型號:Request.Browser.Type 瀏覽器名稱:Request.Browser.browser 瀏覽器版本:Request.Browser.Version 瀏覽器Cookie:Request.Browser.Cookies 你的操作系統:Request…

AVS 端能力模塊

Mark 轉載于:https://www.cnblogs.com/clxye/p/9939333.html

pwn學習之四

本來以為應該能出一兩道ctf的pwn了,結果又被sctf打擊了一波。 bufoverflow_a 做這題時libc和堆地址都泄露完成了,卡在了unsorted bin attack上,由于delete會清0變量導致無法寫,一直沒構造出unsorted bin attack,后面根…

優化算法的簡潔實現

動量法 思想: 動量法使用了指數加權移動平均的思想。它將過去時間步的梯度做了加權平均,且權重按時間步指數衰減。 代碼: 在Gluon中,只需要在Trainer實例中通過momentum來指定動量超參數即可使用動量法。 d2l.train_gluon_ch7…

北方工業大學gpa計算_北方大學聯盟倉庫的探索性分析

北方工業大學gpa計算This is my firts publication here and i will start simple.這是我的第一篇出版物,這里我將簡單介紹 。 I want to make an exploratory data analysis of UFRN’s warehouse and answer some questions about the data using Python and Pow…

泰坦尼克數據集預測分析_探索性數據分析-泰坦尼克號數據集案例研究(第二部分)

泰坦尼克數據集預測分析Data is simply useless until you don’t know what it’s trying to tell you.除非您不知道數據在試圖告訴您什么,否則數據將毫無用處。 With this quote we’ll continue on our quest to find the hidden secrets of the Titanic. ‘The …

各種數據庫連接的總結

SQL數據庫的連接 return new SqlConnection("server127.0.0.1;databasepart;uidsa;pwd;"); oracle連接字符串 OracleConnection oCnn new OracleConnection("Data SourceORCL_SERVER;USERM70;PASSWORDmmm;");oledb連接數據庫return new OleDbConnection…