從這些「幽靈」照片中你能看出什麼?PCA幫你恢復它的本來面貌

點擊上方關注,All in AI中國

這種機器學習方法將幫助你以更小的內存存儲更多信息,而它只需要一些線性代數基礎。通過這種方法,我們將從一些幽靈形狀的混亂照片中恢復人類面孔。

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

嗯,是個可愛的幽靈

你一定聽說過,獨立的向量以一種抽象的方式創建空間。現在,想象一下,所有空間都由向量組成,所以這些空間內的東西也是如此。這些載體中的一些向量比其他載體更有助於某些事物。 除了它們之外的其他載體可能是微不足道的。 在介紹了一些背景之後,這就是我將在這篇文章中向你展示關於特徵面孔的內容。

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

我們的主題是PCA。它是一種廣泛應用於各種領域的算法。在特徵面孔上使用它可以使它更具人類特徵和可解釋性,因此它是最受歡迎的應用之一。特徵面孔是一種通過確定人臉圖像集合中人臉的方差,進而確定人臉識別和檢測的方法。然後利用計算出的方差以機器學習的方式對人臉進行編碼和解碼,而不需要充分的信息來減少計算和空間複雜度。儘管它在1991年首次被Turk和Pentland使用,並且與當今的技術相比具有侷限性,但它的作用依舊不容忽視。

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

LFW

在開始實施之前,我想先介紹一下所提到的基本概念。此外,你可以在此處找到完整的腳本和數據集(LFW_cropped的一小部分:http://conradsanderson.id.au/lfwcrop/)。

特徵向量和特徵值

我們都知道特徵向量和特徵值是如何工作的。對於那些不瞭解的人,這裡有一個小小的解釋:

我們有一個A矩陣平方。當我們期望它們乘以A時,意味著幾乎所有的向量都會改變方向。但是,某些向量x與Ax具有完全相同的方向。你怎麼看?那就是我們的特徵向量。即使它們處於同一個方向,Ax和 x仍然可能是兩個不同的向量。這是一個熟悉的等式:AX =λx。使這兩者相等的是λ,我們的特徵值。這將告訴我們特徵向量在相乘之後是如何變化的。

從上面,你可以瞭解它們在實踐中有用的原因。為了更深入的理解和欣賞,請到麻省理工學院的特徵值和特徵向量章節學習觀看。(http://math.mit.edu/~gs/linearalgebra/ila0601.pdf)

主成分分析(PCA)

PCA的主要目標是降低維數。它在可視化、特徵提取、數據壓縮等方面有很多應用。其核心思想是將原始數據線性投影到較低維度子空間,提供投影數據的主要成分(特徵向量)的最大方差和/或最小值失真誤差。最終,兩者得到的結果是相同的,這是最好的重構公式。作為補充說明,該子空間稱為主子空間。

對於最大化方差和最小化失真誤差的計算,你可以參考ANU關於PCA的講義。(https://machlearn.gitlab.io/isml2018/lectures/11a_Principal_Component_Analysis.pdf)此外,youtube上另一個名為Principal Components Analysis的視頻--Georgia Tech-Machine Learning幫助我更好地理解了這些概念。(https://www.youtube.com/watch?v=kw9R0nD69OU)

實施

現在準備好實施它。首先,我們將導入所需的庫。我假設你都知道它們的用途。我將重點講解算法的解釋部分。

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

然後,我們需要一個函數,以一種漂亮的方式可視化我們的數據集中的圖像。

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

我們把它放在我們的數據集lfwcrop_grey.zip上。(http://conradsanderson.id.au/lfwcrop/lfwcrop_grey.zip)在這裡,由於計算的複雜性,我只採用了前1000張面孔,但實際上是無關緊要的。我還將圖像轉換為numpy數組(shape 1000,64,64)進行處理。

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

上圖:我感興趣的人/下圖:從1000個數據集中找出的我並不關心的隨機16個名人

下邊的圖像是我實際使用的圖像。我基本上可視化了1000個數據集中的前16個圖像。上邊的圖像是我從原始數據集中收集的數據集,當時我不知道自己在做什麼。然而,我注意到最好有更多數據可以更清楚地解釋這些概念。

接下來,下一步是定義PCA。它的參數是X,它是圖像的向量,n_pc是主成分的數量。作為一個小余數,主成分定義了一個標準正交基,它可以提取原始數據中的最大方差。在我們的例子中,它的形狀是(1000,4096),因為我們需要將圖像轉換為PCA的向量。然後,我們求出均值並從我們的數據中減去它,使其圍繞原點居中。之後,我們需要做的是對居中數據執行奇異值分解,以找到那些稱為特徵面孔的主成分。

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

S矩陣沿對角線具有奇異值,而U和V是奇異向量

(SVD很難獲得,而且複雜得多。想得到有用的示例,請轉到麻省理工學院開放式課件視頻:https://www.youtube.com/watch?v=cOUTpqlX-Xs)

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

順便說一句,這是數據集中所有1000張面孔的平均面孔。我們試圖找到使個體與其他人不同的特徵。我希望減去每個人的平均面孔,使最大化方差更有意義。

接下來的步驟是操縱我們的圖像成為向量,調用pca函數並使我們的特徵面孔再次成為圖像。

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

名為n_components的第一個參數決定了我們要創建多少個特徵面孔。這些是我們的主要組成部分,我們將從中恢復人臉數據。 需要強調的是,更改它不會改變此圖表,除非它小於16。而且,我可以保證我們只有50個圖像可以信任而不是一開始的1000張。 (eigenfaces.shape =(50,64,64))

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

對於重構,我們將使用那些特徵面孔。如你所說,每一張臉都是這些特徵面孔的加權組合。為了找到權重,我們應該將我們的中心數據和特徵面孔點乘。然後,我們應該對特徵面孔進行加權,這樣可以使我們得到中心的臉並將其再次添加到平均臉上。畢竟,我們已經準備好看看與原始面孔相比的恢復面孔。

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

n_components= 50

不好看!但是,不要忘記我們從1000 x 64 x 64變成了50 x 64 x 64。這樣,我們可以比以前保存少20倍的數據。不過,那些還不夠好。很明顯,我們還去掉了一些重要的主要組成部分。讓我們看看我們能做些什麼。我將嘗試使用前100個組件(圖片)。

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

n_components= 100

變得更好但仍然不夠好。

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

n_components= 250

這個對我來說非常令人滿意。僅用了四分之一的時間,我們就恢復了完全可分辨的面孔。實際上你可以使用1000個特徵面孔獲得確切的原始結果。下面我將進行一些計算和提高空間複雜度。

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌

n_components= 1000

總的說,我希望你能看到這個應用程序之外的東西,並開始考慮大膽創新。這篇文章實際上展示了當你擁有足夠的信息和非常小的數據時可以做什麼,這無疑也是我們對機器學習最重要的期望。

從這些“幽靈”照片中你能看出什麼?PCA幫你恢復它的本來面貌


分享到:


相關文章: