爲什麼要降維
在真實的數據中有各種問題,PCA的思想是將n維特徵映射到m維上(m<n)
1、如多餘的數據,商店的客流量與營業額,很明顯這兩組的數據相關度比較高
,簡單的理解就是把上述客流量與營業額合併成一個維度
2、由於信道不理想的,怎麼濾去傳輸過程中的噪音
,簡單的理解就是減少特徵數
本文將以一個2維數據來說明PCA的計算過程,PCA的具體步驟
1、求平均值(dataAvg)
2、求每個值與平均值的差(dataAdjust)
3、求協方差矩陣
4、求協方差矩陣的特徵值與特徵向量
5、將特徵值從大到小排序,選擇最大的M個,取的這M個特徵向量。
同時另一個實驗性的例子通過鳶尾花的特徵作爲數據,來查看降維後的效果
點擊查看 機器學習(3.2)--PCA降維鳶尾花數據降維演示
# -*- coding:utf-8 -*-
import numpy as np
#建立十個樣本的二維數組
data=[[2.5,2.4] ,[0.5,0.7] ,[2.2,2.9] ,[1.9,2.2] ,[3.1,3.0]
,[2.3,2.7] ,[2,1.6] ,[1,1.1] ,[1.5,1.6] ,[1.1,0.9]]
data=np.array(data).astype(np.float)
#1、求平均值(dataAvg)
dataAvg=np.average(data,axis=0)# x的均值是1.81,y的均值是1.91
#print(dataAvg)
#2、求每個值與平均值的差(dataAdjust)
dataAdjust=data-dataAvg# X-avg(x) 與y-avg(y)的值
#print(dataAdjust)
#3、求協方差矩陣
#計算任意兩組數據協方差函數,
def covariance(getDataAdjust,index1,index2):
x=getDataAdjust[:,index1:index1+1]
y=getDataAdjust[:,index2:index2+1]
n=x.shape[0]
return (x*y).sum()/(n-1)
#計算協方差矩陣,
'''
在二維數據中這個矩陣就是
[[cov(x,x),cov(x,y)]
,[cov(y,x),cov(y,y)]]
同理在三維數據這個矩陣就是
[[cov(x,x),cov(x,y),cov(x,z)]
,[cov(y,x),cov(y,y),cov(y,z)
,[cov(z,x),cov(z,y),cov(z,z)
]]
'''
CovMatrix=[[covariance(dataAdjust,0,0),covariance(dataAdjust,0,1)]
,[covariance(dataAdjust,1,0),covariance(dataAdjust,1,1)]]
print('協方差矩陣爲:')
print(CovMatrix)
#4、求協方差矩陣的特徵值與特徵向量,如果不知道什麼是特徵值與特徵向量,可以查查線性代數
e1,e2 = np.linalg.eig(CovMatrix)
print('------------------------')
print('協方差矩陣的特徵值:')
print(e1) #[0.0490834 1.28402771] ,這裏的兩個值,當要降到M維(本例只能降到1維),即取最大的值,這裏是1.28402771
print('------------------------')
print('協方差矩陣的特徵向量:')
print(e2)
#5、將特徵值從大到小排序,選擇最大的M個,取的這M個特徵向量。這裏只是取數,沒有計算步驟
#[[-0.73517866 -0.6778734 ] 因數爲上述特徵值最大的取1.28402771,爲第2個,所以,這裏我們取每個元素數組的第2個,即e2[:,1:]
# [ 0.6778734 -0.73517866]]
#取出的值應該是[-0.6778734, -0.73517866]
#做矩陣乘法,將dataAdjust 乘以上述 e2[:,1:] 得出的結果即爲降維後的值
finalDataX=np.matmul(dataAdjust,e2[:,1:])
print('------------------------')
print('降維後的數據:')
print(finalDataX)
本例使用二維數據,降維前,降維後都是數字,很多東西並不是直觀,可以參考,機器學習(3.2)--PCA降維鳶尾花數據降維演示