主成分分析(PCA)算法实现iris数据集降维
主成分分析(PCA)算法
1.PCA簡介:
 PCA(Principal Component Analysis),主成分分析,是一種常用的數據降維算法。數據降維是指對高維度特征數據進行處理,保留重要的特征,去除噪聲和不必要的特征,以達到提升 數據處理速度的目的。
 PCA的主要思想是將原有數據的n維特征映射到k維上(k<n),這k維是全新的正交特征,也被稱作主成分。PCA的工作是從原空間中找出一組相互正交的新坐標軸。新坐標軸的選擇按照方差最大來進行選擇。第一個坐標軸為原始數據中方差最大的方向,第二個坐標軸為與第一個坐標軸平面正交的方差最大的方向,第三個坐標軸為與一、二兩個坐標軸平面正交的方差最大的方向,以此類推。可以發現,方差最大的基本包含在前k個坐標軸中,后面的基本方差為0,故我們保留前k個特征維度,以實現數據的降維。
2.方差、協方差、協方差矩陣
樣本方差:
 
 每個樣本值與全體樣本值的平均數之差的平方值的平均數,代表著樣本數據的偏離程度。
樣本X和樣本Y的協方差:
 
 協方差是用于衡量兩個變量的總體誤差。如果兩個變量的變化趨勢一致,如X大于自身期望值,Y也大于自身期望值,說明X和Y是正相關關系,則協方差大于0,反之,X和Y是負相關關系,協方差小于0。若協方差等于0,則說明X和Y相互獨立。,方差是協方差的特殊情況,Cov(X,X)就是X的方差。
 方差和協方差的除數是n-1,是為了得到方差和協方差的無偏估計。
協方差矩陣:
 當樣本為n維數據時,它的協方差實際就位協方差矩陣(對稱方陣)。例如對于三維數據(X,Y,Z),它的協方差就是:
 
3.PCA算法的兩種實現方法:
 (1)基于特征值分解協方差矩陣實現PCA算法
 輸入:數據集X(n維),需要降到k維
 1.原始數據進行標準化,均值為0,方差為1
 2.計算協方差矩陣Cov
 3.計算協方差矩陣的特征值和對應的特征向量
 4.對特征值按大小進行排序,選擇其中最大的k個。然后將其對應的特征向量分別作為行向量組成特征向量矩陣P
 5.將數據轉換到由k個特征向量構成的新空間中,即Y=PX
 (2)基于SVD分解協方差矩陣實現PCA算法
 輸入:數據集X(n維),需要降到k維
 1.去平均值,每一位特征減去自己的平均值
 2.計算協方差矩陣Cov
 3.通過SVD(奇異值分解)計算協方差矩陣的特征值和對應的特征向量
 4.對特征值按大小進行排序,選擇其中最大的k個。然后將其對應的特征向量分別作為列向量組成特征向量矩陣P
 5.將數據轉換到由k個特征向量構成的新空間中,即Y=PX
4.最大方差理論與最小平方誤差理論
 對于二維樣本點,我們的目標是是求一條直線,并且盡可能使這條直線盡可能更好。
 (1)最大方差理論
 在信號處理中認為信號具有較大的方差,噪聲有較小的方差,信噪比就是信號與噪聲的方差比,越大越好。因此我們認為,最好的k維特征是將n維樣本點變換為k維后,每一維上的樣本方差都盡可能的大,也就是讓數據在主軸上投影的方差最大(在我們假設中方差最大的有用信號最大化減少了噪聲的影響)。
 (2)最小平方誤差理論
 我們可以使用點到直線的距離d′來度量直線的好壞。
 現在有m個樣本點x(1),…,x(m),每個樣本點為n維。將樣本點x(i)在直線上的投影記為x(1)′,那么我們就是要最小化
 
 這個公式稱作最小平方誤差(Least Squared Error),這樣的話使點都盡可能聚集在新的坐標軸周圍。
5.PCA算法實現iris數據集降維實例:
from sklearn.neural_network import MLPClassifier from sklearn.datasets import load_digits from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report, confusion_matrix import numpy as np import matplotlib.pyplot as pltiris = load_iris() x_data = iris.data y_data = iris.targetdef zeroMean(dataMat):meanVal = np.mean(dataMat, axis= 0)newData = dataMat - meanValreturn newData, meanValdef PCA(dataMat, top):#數據中心化newData, meanVal = zeroMean(dataMat)#cov用于求協方差矩陣,參數rowvar = 0說明數據一行代表一個樣本covMat = np.cov(newData, rowvar=0)#np.linalg.eig用于求矩陣的特征值和特征向量eigVals, eigVects = np.linalg.eig(np.mat(covMat))#對特征值從小到大排列eigValIndice = np.argsort(eigVals)#得到最大的n個特征值的下標n_eigValIndice = eigValIndice[-1:-(top + 1): -1]#得到下標對應的特征向量n_eigVects = eigVects[:, n_eigValIndice]#低維特征空間的數據lowDDataMat = newData * n_eigVects# print(newData)print(n_eigVects)# print(lowDDataMat)#利用低維度數據來重構數據reconMat = (lowDDataMat * n_eigVects.T) + meanValreturn lowDDataMat, reconMat#將數據降至2維 lowDDataMat, reconMat = PCA(x_data, 2)x = np.array(lowDDataMat)[:, 0] y = np.array(lowDDataMat)[:, 1] plt.scatter(x, y, c = y_data) plt.show()降維后并可視化的結果為:
 
總結
以上是生活随笔為你收集整理的主成分分析(PCA)算法实现iris数据集降维的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 物联网开发者被疯抢,华为做了什么?
- 下一篇: 面试官不讲武德,居然让我讲讲蠕虫和金丝雀
