第27集 python機器學習:PCA的屬性及其使用PCA提取特徵臉

2021-01-11 中原說教育

PCA對象的主要成分都保存在components_.shape屬性中,其屬性中的每一行對應一個主成分,他們按重要性來排序(第一主成分排在首位,以此類推)。列對應PCA的原始特徵屬性,如下:

print("PCA component shape: {}".format(pca.components_.shape))

print("PCA components:\n{}".format(pca.components_))

運行結果為:

PCA component shape: (2, 30)

PCA components:

[[ 0.21890244 0.10372458 0.22753729 0.22099499 0.14258969 0.23928535

0.25840048 0.26085376 0.13816696 0.06436335 0.20597878 0.01742803

0.21132592 0.20286964 0.01453145 0.17039345 0.15358979 0.1834174

0.04249842 0.10256832 0.22799663 0.10446933 0.23663968 0.22487053

0.12795256 0.21009588 0.22876753 0.25088597 0.12290456 0.13178394]

[-0.23385713 -0.05970609 -0.21518136 -0.23107671 0.18611302 0.15189161

0.06016536 -0.0347675 0.19034877 0.36657547 -0.10555215 0.08997968

-0.08945723 -0.15229263 0.20443045 0.2327159 0.19720728 0.13032156

0.183848 0.28009203 -0.21986638 -0.0454673 -0.19987843 -0.21935186

0.17230435 0.14359317 0.09796411 -0.00825724 0.14188335 0.27533947]]

我們還可以用熱圖將其數據可視化,這樣可能更加容易理解,對應代碼如下:

plt.matshow(pca.components_, cmap='viridis')

plt.yticks([0, 1], ["First component", "Second components"])

plt.colorbar()

plt.xticks(range(len(cancer.feature_names)), cancer.feature_names, rotation=60, ha='left')

plt.xlbael("feature")

plt.ylabel("principal components")

運行後結果如下:

乳腺癌數據集前兩個主成分熱圖

可以看到,在第一個主成分中,所有的特徵符號相同(均為正,但是前面我們提到過,箭頭只想那個方向無關緊要)。這意味著在所有特徵之間存在普遍性和相關性。如果一個測量值較大的話,其他測量值可能也較大。第二個主成分則有正有負,且兩個主成分都包含有30個特徵,這種所有特徵會和使得解釋其過程變得十分困難。

特徵提取的特徵臉:前面提到過,PCA的另一個應用是特徵提取,特徵提取背後的思想是,可以找到一種數據表示,比給定的原始表示更適合分析。特徵提取很有用,一個很好的應用就是圖形。因為圖像是由像素組成,通常存儲為紅藍綠(RGB)強度。不過一般圖片都是由上千個像素組成,只有將其存放到一起才有意義。

下面我們來看一個利用PCA對圖像做特徵提取的應用——處理Wild數據集Labeled faces(標記人臉)中的人臉對象。對應代碼如下:

from sklearn.datasets import fetch_lfw_people

people = fetch_lfw_people(min_faces_per_person=40, resize=0.7)

image_shape = people.images[0].shape

fix, axes = plt.subplots(2, 5,figsize=(15, 8),subplot_kw={'xticks': (), 'yticks': ()})

for target, image, ax in zip(people.target, people.images, axes.ravel()):

ax.imshow(image)

ax.set_title(people.target_names[target])

運行後結果如下:

來自Wild數據集中Labeled faces的一些圖像

我們來看看總共有多少張圖像、有多少個不同的人,並對任務出現的次數進行統計,對應的代碼如下:

for target, image, ax in zip(people.target, people.images, axes.ravel()):

ax.imshow(image)

ax.set_title(people.target_names[target])

print("the number of pictures and pixel are:{}".format(people.images.shape))

print("number of classes: {}".format(len(people.target_names)))

#計算目標出現的次數

counts = np.bincount(people.target)

#將次數與目標名稱一列印出來

for i, (count, name) in enumerate(zip(counts, people.target_names)):

print("{0:25}, {1:3}".format(name, count), end=' ')

if(i+1)%3 == 0:

print()

運行後結果如下:

labeled中出現的人物數及每個人物出現的次數

由運行結果可以看出,該數據集收錄了24個人物共1985張照片,照片的像素是87*65。

人臉識別的一個常見任務就是看某個人是否屬於資料庫中某個已知人物。這在照片收集、社交媒體和安全應用中都常用到。解決這個問題的方法之一是構建一個分類器,每個人都是一個單獨的類別,但人臉資料庫中通常有許多不同的人,而同一個人的圖像很多(也就是說,每個類別的訓練樣例很少)。這使得大多數分類器的訓練都很困難。

為了解決此類問題,我們可以使用單一的近鄰分類器,尋找與你要分類的人臉最為相似的人臉,這個分類器原則上可以處理每個類別只有一個訓練樣例的情況,我們下面來看一下KneighborsClassifier的表現如何:

mask = np.zeros(people.target.shape, dtype=np.bool)

for target in np.unique(people.target):

mask[np.where(people.target == target)[0][:50]] = 1

x_people = people.data[mask]

y_people = people.target[mask]

#將灰度值縮放到0-1之間,而不是0-255,以便得到更好的穩定性

x_people =x_people/255

from sklearn.neighbors import KNeighborsClassifier

#將數據分為訓練集和測試集

x_train , x_test, y_train, y_test = train_test_split(x_people, y_people, stratify=y_people, random_state=0)

#使用一個鄰居構建KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=1)

knn.fit(x_train, y_train)

print("test set score of 1-knn: {:.2f}".format(knn.score(x_test, y_test)))

運行結果如下:

test set score of 1-knn: 0.35

由此可見,我們的預測精度為35%,對於包含24個類別的分類問題來說,其結果算是馬馬虎虎。下面我們嘗試一下通過PCA,比較兩張圖的灰度(這裡如果比較兩張的像素之間的空間距離是不行的,因為照片中像素和像素之間的空間距離不具有代表性)。

我們首先啟用PCA 的白化(whitening):mglearn.plots.plot_pca_whitening()

效果如下圖:

啟用白化的PCA對數據進行變換

由運行結果我們可以看出,PCA白化將主成分縮放到相同的尺度。變換後的結果與使用StandardScaler相同,白化不僅對應於數據旋轉,還對應於縮放數據使其形狀是圓而不是橢圓。我們訓練數據擬合PCA對象,並提取前100個主成分,然後對數據進行變換:

pca = PCA(n_components=100, whiten=True, random_state=0).fit(x_train)

x_train_pca = pca.transform(x_train)

x_test_pca = pca.transform(x_test)

#列印對應的PCA數據特徵及主成分結果

print("x_train_pca.shape: {}".format(x_train_pca.shape))

knn = KNeighborsClassifier(n_neighbors=1)

knn.fit(x_train_pca, y_train)

print("Test set accuracy: {:.2f}".format(knn.score(x_test_pca, y_test)))

運行後其精度結果如下:

Test set accuracy: 0.44

由此可以看出,通過pca選擇主要成分來進行預測時,精度有了一定的提高。

相關焦點

  • 第26集 python機器學習:將PCA應用於cancer數據集並可視化
    PCA最常見的應用之一就是將高維數據可視化,它可以將具有兩個及以上特徵的數據進行可視化,下面我們利用PCA來對cancer數據集進行可視化(良性腫瘤和惡性腫瘤),不使用PCA時可視化只能一個一個去對比其中的數據,其代碼如下:import numpy as npfrom sklearn.datasets import load_breast_cancer
  • 機器學習——PCA 主成分分析
    (方差最大)- 有損數據壓縮,特徵提取和數據可視化等應用程式。我們要找到最大方差也就是協方差矩陣最大的特徵值,最佳投影方向就是最大特徵值所對應的特徵向量,次佳就是第二大特徵值對應的特徵向量,以此類推。這將產生一個平均值為零的數據集,減去均值將簡化方程,從而簡化方差和協方差的計算。
  • PCA 主成分分析
    前一篇提到的中,我們在使用SVM支持向量機做人臉分類之前使用到PCA提取人臉數據中的主要成分,降低計算的維度,那麼具體PCA是如何提取的呢?下文了解一下。這個過程其實也是一個降維的過程,對高維度的數據集進行降維,減少一些信息含量,保留主要的那些維度。主要的那些維度是指在這些維度上具有更大的差異,而對於那些差異化不大的特徵,有時候反而會影響我們的模型學習,而成為一種噪音,也會影響我們training時候的速度。所以在機器學習的過程中,去掉那些無關緊要的變量會使得我們的學習模型效率提高。
  • 如何使用特徵提取技術降低數據集維度
    如果這些特徵數量與數據集中存儲的觀察值數量相差無幾(或者前者比後者更多)的話,很可能會導致機器學習模型過度擬合。為避免此類問題的發生,需採用正則化或降維技術(特徵提取)。在機器學習中,數據集的維數等於用來表示它的變量數。
  • 主成分分析(PCA)算法介紹及matlab實現案例
    主成分分析經常被用做模型分類時特徵的降維,本篇首先介紹PCA的步驟,並根據步驟撰寫對應的MATLAB代碼,最後指明使用PCA的步驟。我們在做分類時,希望提取的特徵能夠最大化將數據分開,如果數據很緊密,模型就比較難將其分開,如果數據比較離散,那麼就比較容易分開,換句話說,數據越離散,越容易分開。那怎麼讓數據離散呢?離散又用什麼指標衡量呢?
  • 使用PCA可視化數據
    數據集讓我們來看看一個實際的例子。我們將使用PCA來探索乳腺癌數據集(http://archive.ics.uci.edu/ml/datasets/breast+cancer+wisconsin+(diagnostic)),我們使用下面的代碼導入該數據集。
  • 使用PCA可視化數據
    數據集讓我們來看看一個實際的例子。我們將使用PCA來探索乳腺癌數據集(http://archive.ics.uci.edu/ml/datasets/breast+cancer+wisconsin+(diagnostic)),我們使用下面的代碼導入該數據集。
  • 使用DeepWalk從圖中提取特徵
    目錄數據的圖示不同類型的基於圖的特徵 節點屬性 局部結構特徵 節點嵌入DeepWalk簡介在Python中實施DeepWalk以查找相似的Wikipedia頁面數據的圖示當你想到「網絡」時,會想到什麼?通常是諸如社交網絡,網際網路,已連接的IoT設備,鐵路網絡或電信網絡之類的事物。在圖論中,這些網絡稱為圖。網絡是互連節點的集合。
  • 如何在表格數據上使用特徵提取進行機器學習
    特徵提取為表格數據的數據準備提供了另一種方法,其中所有數據轉換都並行應用於原始輸入數據,並組合在一起以創建一個大型數據集。如何使用特徵提取方法進行數據準備,以提高標準分類數據集的基準性能。。如何將特徵選擇添加到特徵提取建模管道中,以進一步提升標準數據集上的建模性能。
  • 使用PCA可視化數據 - 人工智慧遇見磐創
    數據集讓我們來看看一個實際的例子。我們將使用PCA來探索乳腺癌數據集(http://archive.ics.uci.edu/ml/datasets/breast+cancer+wisconsin+(diagnostic)),我們使用下面的代碼導入該數據集。
  • GCTA PCA分析以及軟體安裝教程
    利用構建好的G矩陣, 計算PCA分析--grm test: 這裡的xx是前綴, 它其實包括三個文件:test.grm.bin,test.grm.N.bintest.grm.id命令:gcta64 --grm grm --pca 3 --out out_pca--grmgrm文件
  • 第25集 python機器學習:預處理對監督學習的作用
    小提示:transform的快捷方式與高效的替代方法,通常來說,你想要在某個數據集上fit一個模型,然後再將其transform。這是一個非常常見的任務,可以比先調用fit再調用transform更搞笑的方法來計算。對於這種使用場景,所有具有transform方法的模型也都具有fit_transform。
  • 基於Scikit-Learn的機器學習入門系列(一)
    np.random.random((3,5))X圖2 查看X中的第一行sklearn.datasets import load_irisiris = load_iris()查看iris 數據集的屬性iris.keys()
  • 用StackOverflow訪問數據實現主成分分析(PCA)
    演講的重點主要是我對於PCA的理解,而這篇文章中,我將主要介紹我是如何實現PCA的,以及我是如何製作演講中使用到的圖表的。rstudio :: conf 2018https://www.rstudio.com/resources/videos/understanding-pca-using-shiny-and-stack-overflow-data/高維數據此次分析使用的是去年Stack Overflow上註冊用戶訪問量前500的標籤數據。
  • 機器學習理論類常見面試題(三)
    PCA,全稱為 Principal Component Analysis,也就是主成分分析方法,是一種降維算 法,其功能就是把 N 維的特徵,通過轉換映射到 K 維上(K<N),這些由原先 N 維的投射 後的 K 個正交特徵,就被稱為主成分。
  • python乾貨:如何使用Python對音頻進行特徵提取?
    內容如下:聲音信號介紹使用Python對音頻進行特徵提取使用Keras對歌曲的題材進行分類主要涉及的背景知識有:傅立葉變換採樣定理Python機器學習聲音基礎知識開發工程師,這裡有我自己整理了一套最新的python系統學習教程,包括從基礎的python腳本到web開發、爬蟲、數據分析、數據可視化、機器學習等。
  • 機器學習算法基礎(使用Python代碼)
    現在使用這個方程,我們可以求出重量,而知道一個人的身高。創建本指南背後的想法是簡化世界各地有抱負的數據科學家和機器學習愛好者的旅程。通過本指南,我將幫助您解決機器學習問題並從經驗中獲益。我提供了對各種機器學習算法的高級理解以及運行它們的R&Python代碼。這些應該足以弄髒你的手。線性回歸主要有兩種類型:簡單線性回歸和多元線性回歸。簡單線性回歸的特徵在於一個自變量。
  • 機器學習算法的基本知識(使用Python和R代碼)
    但是,如果你正在尋找並開始構建機器學習項目,那麼這篇文章給你帶來極大好處。  3類機器學習算法(廣義上)  監督學習  工作原理 :該算法由一組目標/結果變量(或因變量)組成,該變量將根據給定的一組預測變量(獨立變量)進行預測。 使用這些變量集,我們生成一個將輸入映射到所需輸出的函數。
  • Python實現數據壓縮如此簡單
    作者 | 蘿蔔來源 | 早起Python(ID: zaoqi-python>藉以引出因子分析的優勢和學習的必要性是本文的目標需求說明公司希望從事數據分析崗位的你僅用兩個短句就概括出以下數據集所反映出的經濟現象