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