LDA PCA kNN 實現人臉識別

2021-08-19 15:38:38 字數 2821 閱讀 1571

回顧一下2023年夏天幫同學完成的乙個作業。雖然及其入門級,但對於基礎概念的理解還是有所幫助。現在做以回顧,算是總結機器學習演算法的開篇。

訓練集中\(n\)個樣本,每個樣本\(p\)個特徵,共包含\(k\)個類別。

從最終的測試結果來看,三種演算法的結合似乎沒有比單獨使用其中兩個甚至乙個演算法有特別大的提高。但是作為學習的過程,還是有其價值的。畢竟單獨的演算法就只是該演算法本身,而演算法的結合就需要從理論層面上考慮更多的因素。

2.1 lda用於分類的基本思路描述

這裡是指線性判決分析,linear discriminant analysis(lda),而非文字主題模型中的latent dirichlet allocation。已經忘了當初幫人做作業時候參閱哪本資料了,最近一年我是重新學習the element of statistical learning。湊著有這個心情,就簡單總結一下。

lda是一種生成模型,根據bayes原理直接用聯合概率分布直接表示後驗概率。\[\mathcal(\mathcal=k|x=x)=\frac(x=x|\mathcal=k)\mathcal(\mathcal=k)}(x=x)}\] lda模型對資料做兩個假設

似然概率\(\mathcal(x|\mathcal=k)\)近似服從高斯分布,即\(x_ \sim{}\mathcal(\mu_, \sigma_)\)

不同類別資料的協方差是相同的,即\(\sigma_=\sigma_, i\neq{}j\)。

這兩個都算是比較強的假設。尤其是假設(1),是使得bayes原理可以進一步計算的基礎。然而假設(2)通過修改,可以用來擴充套件演算法。比如,如果認為每種型別的協方差並不相同,則獲得二次判決分析,quadratic discriminant analysis,qda模型。再比如,如果二次多項式擴features,並仍然假設不同類別的協方差相同,則獲得另一種qda。這似乎比前一種qda有更多的約束條件,但是卻更容易計算。畢竟協方差可是乙個矩陣,太多總會影響計算效率。關於這些問題的討論,這裡不再一一展開,而專注於lda本身,即\(\sigma_=\sigma, k=1,\cdots,k\)。

既然後驗概率都滿足相同的比例關係,\(\mathcal(\mathcal=k|x=x)\propto{}\mathcal(x=x|\mathcal=k)\mathcal(\mathcal=k)\),模型假設又保證了計算的可行性,通過比較不同類別之間的概率大小就可以提供判別依據。顯然,應該選擇概率最大的類別。為便於計算,對後驗概率取對數。記\(\mathcal(\mathcal=k)=\pi_\)。則有如下判別函式,

\[\delta_(x)=-\frac(x-\mu_)^\sigma^(x-\mu_)-\frac\log|\sigma|\]這似乎是個二次函式,但是線性分類條件之所以是線性,是因為分類邊界是線性。這裡的二次項並不會對分類結果產生影響,算式上可以直接省掉。但是為了便於銜接上下文,也便於後續分析,這裡依然保留最原始的形式。

2.2 lda中的引數估計

根據判別函式\(\delta_(x)\),對於任意給定的新樣本,需要計算其對應函式值。顯然,需要\(k\)個類別的\(\mu_\),以及公共的協方差矩陣\(\sigma\),方法如下。

\[n_=\sum_^\mathcal(\mathcal_=k)\]

\[\hat_=\frac}\sum_\mathcal_}x_\]

\[\hat=\frac\sum_^\sum_\mathcal_}(x_-\hat_)(x_-\hat_)^t\]

到此為止,一切都很美好,過程非常的straightforward,故事似乎可以告一段落。很多看過lda的人一定要說,lda可以降維。我個人覺得降維或許是lda最初的動機,也或者是在某種程度上lda得以應用的關鍵因素。但是我個人認為,lda的分類核心思想確實應該到此為止。從功能上而言,這已經是完備的,也就是說,總是可以計算得到分類的,哪怕沒有降維。

2.3 資料降維

資料降維畢竟不是lda的專利,但是有了降維,這個演算法可以更大程度的發揮作用。相比於主成分分析,principal component analysis (pca),lda的降維是有監督的,也就是說把樣本類別資訊考慮在內。這應該算是一種巨集觀上的不同點。

此外,我相信也並非所有的演算法發明者從一開始就站在上帝的視角,用完美主義驅動著演算法的改進,或是敏銳地察覺到演算法本身的不足。改進永遠都是後話。資料降維也未必是從計算效率的角度出發的,而是遇到了實際上的難題。在lda演算法中,當特徵維度\(p\)十分大(\(p>n-k\))的時候,以上的計算就不可行了。因為計算得出的協方差矩陣\(\sigma\)不可逆。

由訓練資料樣本組成的矩陣,先進行排列重組,將同一類別的樣本相鄰存放,得到

\[x_=[x__,1}, \cdots, x__,n_}]^\]則整個訓練資料集為

\[x=[x__,1},\cdots,x__,n_};\cdots;x__,1},\cdots,x__,n_}]\]

則協方差用矩陣重新表示為

\[\hat=\fraca^a\]其中,

\[a=[x__,1}-\mu_,\cdots,x__,n_\mu_};\cdots;x__,1}\mu_,\cdots,x__,n_}-\mu_]\]

如果看起來很奇怪,可以先考慮類內協方差

\[\hat_=\frac-1} [x__,1}-\mu_, \cdots, x__,n_}-\mu_][x__,1}-\mu_, \cdots, x__,n_}-\mu_]^ \]

數學上容易證明,協方差的數值估計\(\hat\)與矩陣\(a\)有相同的秩。而\(rank(a)=min(p, n-k)\)。顯然,如果\(p>n-k\),矩陣非滿秩,因此不可逆。然而不必驚慌,pca這個原生態的降維手段總可以讓過程進行下去。只要將\(x\)的特徵維度縮減到\(n-k\)或以下即可。

2.3.1 pca降維

2.3.2 lda降維

2.4 資料分類

(未完待續……)

face 實現人臉識別

由於專案是在多年前完成,face 的sdk可能有調整,所以部分功能可能不再適用 2017.3 最近做了乙個使用face 實現人臉識別的功能,當初看著官方文件一點頭緒都沒有,看了好久才弄明白,所以在這裡記錄一下,希望可以幫到需要的人,首先要註冊乙個face 賬號,獲取apikey和apisecret,...

OpenCV Python 實現人臉識別

參考 1 2 haar特徵值反映了影象的灰度變化情況。例如 臉部的一些特徵能由矩形特徵簡單的描述,如 眼睛要比臉頰顏色要深,鼻樑兩側比鼻樑顏色要深,嘴巴比周圍顏色要深等。import cv2 image cv2.imread imagepath import cv2 gray cv2.cvtcolo...

python實現人臉識別

安裝opencv pip install opencv python 基礎知識例項 載入 匯入模組 import cv2 as cv 讀取 img cv.imread tiaotiao.jpg 路徑中不能有中文,否則載入失敗 顯示cv.imshow read img img 等待鍵盤輸入 單位毫秒 ...