数据降维之PCA(主成分分析)
本文代碼及數(shù)據(jù)集來自《Python大數(shù)據(jù)分析與機(jī)器學(xué)習(xí)商業(yè)案例實戰(zhàn)》
如果特征變量的數(shù)量非常多(如成百上千個特征變量),我們往往需要進(jìn)行數(shù)據(jù)降維。降維的方法主要有選擇特征和抽取特征兩種:選擇特征是從原有的特征中挑選出最佳的特征;抽取特征則是將數(shù)據(jù)由高維向低維投影,進(jìn)行坐標(biāo)的線性轉(zhuǎn)換。PCA即為典型的抽取特征的方法,它不僅是對高維數(shù)據(jù)進(jìn)行降維,更重要的是經(jīng)過降維去除噪聲,發(fā)現(xiàn)數(shù)據(jù)中的模式。
基本用法
# 三維空間降維Python代碼實現(xiàn) import pandas as pd X = pd.DataFrame([[45, 0.8, 9120], [40, 0.12, 2600], [38, 0.09, 3042], [30, 0.04, 3300], [39, 0.21, 3500]], columns=['年齡(歲)', '負(fù)債比率', '月收入(元)']) print(X)運(yùn)行結(jié)果:
運(yùn)行結(jié)果:
可以看到,pca.components_是一個二維數(shù)組,第1個元素中的3個數(shù)對應(yīng)的是下述公式中的系數(shù)a11、a12、a13,第2個元素中的3個數(shù)對應(yīng)的是下述公式中的系數(shù)a21、a22、a23。
運(yùn)行結(jié)果:
案例實戰(zhàn):人臉識別模型
首先從照片數(shù)據(jù)集中導(dǎo)入需要識別的人臉照片,這里使用的數(shù)據(jù)集是紐約大學(xué)提供的公開人臉數(shù)據(jù)庫Olivetti Faces。原圖是一整張圖片,含有40個人的臉部照片,每人10張。筆者將其拆分成400張jpg格式的圖片,放在本案例代碼所在的文件夾下的olivettifaces文件夾中,并按一定的規(guī)則對圖片的文件名進(jìn)行整理。以“10_0.jpg”為例,10代表編號為10的人的圖片,“_”是第1部分和第3部分的分隔符,0代表這個人的10張圖片中編號為0的那一張,“.jpg”為文件擴(kuò)展名。
# 1.讀取人臉照片數(shù)據(jù) import os names = os.listdir('olivettifaces') print(names[0:5])運(yùn)行結(jié)果:[‘10_0.jpg’, ‘10_1.jpg’, ‘10_2.jpg’, ‘10_3.jpg’, ‘10_4.jpg’]
# 讀取第一張圖片 from PIL import Image img0 = Image.open('olivettifaces\\' + names[0]) #img0.show()# 2.人臉數(shù)據(jù)處理 - 特征變量提取 import numpy as np img0 = img0.convert('L') # 參數(shù)'L'指轉(zhuǎn)換成灰度格式的圖像 img0 = img0.resize((32, 32)) # 調(diào)整圖像尺寸為32×32像素 arr = np.array(img0) # 將這1024個像素點的灰度值轉(zhuǎn)換為一個二維數(shù)組import pandas as pd print(pd.DataFrame(arr))運(yùn)行結(jié)果:
這樣就完成了第1張圖片的圖像數(shù)據(jù)到數(shù)值類型數(shù)據(jù)的轉(zhuǎn)換,為方便大家理解,可以將這個列表表達(dá)成下表的形式,第1張圖片共有1024個特征變量,每個變量為不同像素點的灰度值。
將上述方法結(jié)合for循環(huán),就可以將所有人臉圖片的圖像數(shù)據(jù)都轉(zhuǎn)換成數(shù)值類型數(shù)據(jù),從而構(gòu)造相應(yīng)的特征變量,代碼如下。
運(yùn)行結(jié)果:
首先來提取第1張人臉圖片的目標(biāo)變量。該圖片的文件名為10_0.jpg,其中的10是該圖片對應(yīng)的人的編號,即我們所需要的目標(biāo)變量。其中names[0]為第1張圖片的文件名10_0.jpg,split()函數(shù)根據(jù)“_”號將文件名分割為2個部分,通過[0]提取第1部分,即人的編號10。split()函數(shù)分割字符串得到的仍是字符串,但是目標(biāo)變量y需要為數(shù)字,所以需要用int()函數(shù)將字符串轉(zhuǎn)換為數(shù)字。
將上述方法結(jié)合for循環(huán),便能提取400張人臉圖片的目標(biāo)變量了。
y = [] for i in names:img = Image.open('olivettifaces\\' + i)y.append(int(i.split('_')[0])) print(y)運(yùn)行結(jié)果:
運(yùn)行結(jié)果:
在本例中降維的模型與不降維的模型得分差不多。本案例的數(shù)據(jù)量并不大,當(dāng)數(shù)據(jù)量更大時,利用PCA進(jìn)行數(shù)據(jù)降維會發(fā)揮更大的作用。
總結(jié)
以上是生活随笔為你收集整理的数据降维之PCA(主成分分析)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2048小游戏html制作,[ 逻辑锻炼
- 下一篇: ZOJ-2520