日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PCA降维原理

發布時間:2024/9/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PCA降维原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PCA最重要的降維方法之一,在數據壓縮消除冗余和數據噪音消除等領域都有廣泛的應用,一般我們提到降維最容易想到的算法就是PCA,目標是基于方差提取最有價值的信息,屬于無監督問題。

方差

方差描述的是樣本集合的各個樣本點到均值的距離之平均,一般用來描述一維數據的離散程度的度量,在概率論和統計方差用來度量隨機變量和數據期望之間的偏離程度。
Var(a)=1m∑i=1m(ai?μ)2Var(a) = \frac{1}{m}\sum_{i=1}^m(a_i-\mu)^2 Var(a)=m1?i=1m?(ai??μ)2

協方差

方差和協方差的關系:方差是用來度量單個變量的“自身變異大小”的總體參數,方差越大表明該變量變化越大。協方差是兩個變量相互影響大小的參數,協方差的參數越大,則兩個變量相互影響越大。

可以通俗的理解為:兩個變量在變化過程中是同方向變化?還是反方向變化?同向或反向程度如何?你變大,同時我也變大,說明兩個變量是同向變化的,這時協方差就是正的。你變大,同時我變小,說明兩個變量是反向變化的,這時協方差就是負的。從數值來看,協方差的數值越大,兩個變量同向程度也就越大。反之亦然。

協方差公式如下:
Cov(X,Y)=E[(X?μx)(Y?μy)]Cov(X,Y) = E[(X-\mu_x)(Y-\mu_y)] Cov(X,Y)=E[(X?μx?)(Y?μy?)]
如果有X,Y兩個變量,每個時刻的“X值與其均值之差”乘以“Y值與其均值之差”得到一個乘積,再對這每時刻的乘積求和并求出均值,也可以寫成如下形式:
Cov(X,Y)=1m∑i=1m(Xi?μx)(Yi?μy)Cov(X,Y) = \frac{1}{m}\sum_{i=1}^{m}{(X_i-\mu_x)(Y_i-\mu_y)} Cov(X,Y)=m1?i=1m?(Xi??μx?)(Yi??μy?)

假設均值為0

如果協方差為0,表示兩個特征是線性無關的,所以為了盡可能的展示數據更多的原始信息,我們需要特征之間是線性無關的,也即協方差為0。
優化目標:將一組N維向量降為K(0<k<n)維,目標選擇K個單位正交基,使得原始數據變換到這組基上后,各字段兩兩間協方差為0,字段的方差盡可能最大。
X=(a1a2?amb1b2?bm)1mXXT=(1m∑i=1mai21m∑i=1maibi1m∑i=1maibi1m∑i=1mbi2)X= \begin{pmatrix} a_1&a_2&\cdots&a_m\\ b_1&b_2&\cdots&b_m\\ \end{pmatrix} \\ \frac{1}{m}XX^\mathrm{ T }= \begin{pmatrix} \frac{1}{m}\sum_{i=1}^ma_i^2&\frac{1}{m}\sum_{i=1}^ma_ib_i\\ \frac{1}{m}\sum_{i=1}^ma_ib_i&\frac{1}{m}\sum_{i=1}^mb_i^2\\ \end{pmatrix} X=(a1?b1??a2?b2?????am?bm??)m1?XXT=(m1?i=1m?ai2?m1?i=1m?ai?bi??m1?i=1m?ai?bi?m1?i=1m?bi2??)
協方差矩陣對角線上的元素分別是字段的方差,而其他元素是a和b的協方差。并且是實對稱矩陣。

舉例

數據:
(?1?1020?20011)\begin{pmatrix} -1&-1&0&2&0\\ -2&0&0&1&1\\ \end{pmatrix} (?1?2??10?00?21?01?)
協方差矩陣:
C=15(?1?1020?20011)(?1?2?10002101)=(65454565)C=\frac{1}{5} \begin{pmatrix} -1&-1&0&2&0\\ -2&0&0&1&1\\ \end{pmatrix} \begin{pmatrix} -1&-2\\ -1&0\\ 0&0\\ 2&1\\ 0&1 \end{pmatrix} =\begin{pmatrix} \frac{6}{5}&\frac{4}{5}\\ \\ \frac{4}{5}&\frac{6}{5}\\ \end{pmatrix} C=51?(?1?2??10?00?21?01?)????????1?1020??20011????????=???56?54??54?56?????
特征值:
λ1=2,λ2=25\lambda_1=2, \lambda_2=\frac{2}{5} λ1?=2,λ2?=52?
特征向量:
c1=(11)c2=(?11)c_1= \begin{pmatrix} 1\\ 1\\ \end{pmatrix} \\ c_2= \begin{pmatrix} -1\\ 1\\ \end{pmatrix} c1?=(11?)c2?=(?11?)
對角化:
PCPT=(1212?1212)(65454565)(12?121212)=(20025)PCP^\mathrm{ T }= \begin{pmatrix} \frac{1}{\sqrt2}&\frac{1}{\sqrt2}\\ \\ \frac{-1}{\sqrt2}&\frac{1}{\sqrt2}\\ \end{pmatrix} \begin{pmatrix} \frac{6}{5}&\frac{4}{5}\\ \\ \frac{4}{5}&\frac{6}{5}\\ \end{pmatrix} \begin{pmatrix} \frac{1}{\sqrt2}&\frac{-1}{\sqrt2}\\ \\ \frac{1}{\sqrt2}&\frac{1}{\sqrt2}\\ \end{pmatrix} =\begin{pmatrix} 2&0\\ \\ 0&\frac{2}{5}\\ \end{pmatrix} PCPT=???2?1?2??1??2?1?2?1????????56?54??54?56????????2?1?2?1??2??1?2?1?????=???20?052?????
降維:
Y=(1212)(?1?1020?20011)=(?32?1203212)Y= \begin{pmatrix} \frac{1}{\sqrt2}&\frac{1}{\sqrt2} \end{pmatrix} \begin{pmatrix} -1&-1&0&2&0\\ -2&0&0&1&1\\ \end{pmatrix}= \begin{pmatrix} \frac{-3}{\sqrt2}&\frac{-1}{\sqrt2}&0&\frac{3}{\sqrt2}&\frac{1}{\sqrt2} \end{pmatrix} Y=(2?1??2?1??)(?1?2??10?00?21?01?)=(2??3??2??1??0?2?3??2?1??)

使用sklearn實現PCA降維

  • 參數n_components:這個參數可以幫我們指定希望PCA降維后的特征維度數目。最常用的做法是直接指定降維到的維度數目,此時n_components是一個大于等于1的整數。當然,我們也可以指定主成分的方差和所占的最小比例閾值,讓PCA類自己去根據樣本特征方差來決定降維到的維度數,此時n_components是一個(0,1]之間的數。當然,我們還可以將參數設置為"mle", 此時PCA類會用MLE算法根據特征的方差分布情況自己去選擇一定數量的主成分特征來降維。我們也可以用默認值,即不輸入n_components,此時n_components=min(樣本數,特征數)。
  • whiten :判斷是否進行白化。所謂白化,就是對降維后的數據的每個特征進行歸一化,讓方差都為1.對于PCA降維本身來說,一般不需要白化。如果你PCA降維后有后續的數據處理動作,可以考慮白化。默認值是False,即不進行白化。
  • import pandas as pd import numpy as np from sklearn.decomposition import PCA# ========================================================================================== X1 = pd.DataFrame(np.arange(9).reshape((3, 3)), index=['a', 'b', 'c'],columns=['one', 'two', 'three']) print(X1) print('=' * 8, 'shape:', X1.shape) pca = PCA(n_components=1)newData1 = pca.fit_transform(X1) print(newData1) print('=' * 8, '降維后shape:', newData1.shape)pca.fit(X1) newData12 = pca.transform(X1)""" newData1和newData2結果一致 """ # ========================================================================================== a = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]X2 = pd.DataFrame(np.array(a), index=['a', 'b', 'c'],columns=['one', 'two', 'three']) print(X2) print('=' * 8, 'shape:', X2.shape) pca_new = PCA(n_components=1) pca_new.fit(X2) newData12 = pca_new.transform(X2) print(newData12) print('=' * 8, '降維后shape:', newData12.shape)

    輸出結果如下:

    one two three a 0 1 2 b 3 4 5 c 6 7 8 ======== shape: (3, 3) [[ 5.19615242][-0. ][-5.19615242]] ======== 降維后shape: (3, 1)one two three a 0 1 2 b 3 4 5 c 6 7 8 ======== shape: (3, 3) [[ 5.19615242][ 0. ][-5.19615242]] ======== 降維后shape: (3, 1)

    總結

    以上是生活随笔為你收集整理的PCA降维原理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。