<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          機器學(xué)習(xí)數(shù)學(xué)基礎(chǔ):從奇異值分解 SVD 看 PCA 的主成分

          共 4962字,需瀏覽 10分鐘

           ·

          2020-12-07 17:36

          今天我們來看一個在數(shù)據(jù)分析和機器學(xué)習(xí)領(lǐng)域中常用的降維方法,即主成分分析(PCA)。它是探索性數(shù)據(jù)分析(EDA)和機器學(xué)習(xí)算法對數(shù)據(jù)的基本處理方法。

          1引言

          首先,我們來看一下機器學(xué)習(xí)中數(shù)據(jù)的表示形式。如下圖所示,一般用一個矩陣 表示數(shù)據(jù)(特別是表格型數(shù)據(jù))

          可以是一個目標(biāo)向量,表示數(shù)據(jù)的標(biāo)簽。

          為什么要對 降維呢?我們可以找到多個理由,至少可以這么看

          • 長得太胖穿得太多,一下看不清。讓它減減肥,好觀察啊。

          用行話說就是,特征太多,讓人迷失,需要精簡,才能在屏幕上展現(xiàn)數(shù)據(jù)的整體樣貌。

          • 長得沒啥特點,沒有棱角,總之看了沒留下啥印象。

          用行話可以說是,特征不典型,特征之間線性相關(guān),不利于對數(shù)據(jù)的后續(xù)處理和分析。

          總之,嫌數(shù)據(jù)矩陣 的列多并且不好。那怎么讓它脫胎換骨,變得更好更美呢?!

          2主成分分析

          今天主要看的 PCA 方法就是試圖在原始高維數(shù)據(jù)矩陣中找到特征的線性組合以構(gòu)造更具代表性的數(shù)據(jù)特征表示形式,在降維的同時讓數(shù)據(jù)更有精氣神。

          降維問題本身可以看作最優(yōu)化問題,但本篇主要是從奇異值分解的角度來解讀 PCA,因此對于降維問題的描述不作詳細(xì)展開。簡而言之,PCA 降維的目標(biāo)為,

          • 一方面為了減少數(shù)據(jù)的特征數(shù),因此要挑選出最具代表性的一些特征。

          • 保持特征的可分性,即在原來空間中有明顯差異的數(shù)據(jù)在降維后也希望盡量保持差異。換句話說,保持?jǐn)?shù)據(jù)間的線性結(jié)構(gòu),比如在原始空間中離得遠(yuǎn)的數(shù)據(jù)在降維后也希望離得遠(yuǎn),近的自然也一樣。

          我們結(jié)合一個簡單例子來闡述一下 PCA。如上圖所示,給你一百個數(shù)據(jù),每個數(shù)據(jù)只用兩個特征(比如身高和體重),這里為了可視化,分別將它們看成 坐標(biāo)。

          PCA 的目的之一是從這些數(shù)據(jù)自身出發(fā),找出新的相互正交的坐標(biāo)軸(將它們看成新的特征),希望這些特征之間不線性相關(guān)。這些正交軸也稱為數(shù)據(jù)特征空間中的主成分(PC),最后將數(shù)據(jù)點投影到這些 PC 上得到新的坐標(biāo)表示。

          我們假設(shè)只用一個特征來刻畫上面這批數(shù)據(jù),也就是說只需要找出一個坐標(biāo)軸,即一個 PC。這些數(shù)據(jù)坐標(biāo)往這個 PC 投影得到新的坐標(biāo),而且每個數(shù)據(jù)只有一個坐標(biāo)了。那么你怎么選這個 PC 呢?

          為了讓新坐標(biāo)盡量能夠區(qū)分開不同的數(shù)據(jù),我們希望沿著這個 PC 能捕獲到數(shù)據(jù)中最大的差異??聪旅娴膭訄D,我們假設(shè) PC 經(jīng)過數(shù)據(jù)集的中心點,然后這些數(shù)據(jù)點往不同的 PC 上投影,最終都投到一條直線上,那么哪條線將這些數(shù)據(jù)分開得最好呢?

          相信大家能感覺出哪個方向好。但是問題來了,怎么用數(shù)學(xué)公式來量化不同方向的好差呢?

          對了,可以用方差。再加上如果考慮多個 PC 之間的相關(guān)性的話,那就是協(xié)方差矩陣。

          .協(xié)方差矩陣

          在機器學(xué)習(xí)中,計算兩個特征 、(都看成列向量的形式)的協(xié)方差公式為

          式中 表示 個樣本,上面除以 是為了無偏估計。

          而由兩個特征 、 定義的協(xié)方差矩陣為,

          如果有多個特征,記為 ,,... ,,它們的協(xié)方差矩陣為,

          協(xié)方差矩陣衡量的是數(shù)據(jù)的不同坐標(biāo)分量兩兩之間一起變化的程度。如果它是一個對角矩陣,說明特征之間沒有線性相關(guān)性,這也是 PCA 所追求的目標(biāo)之一。

          簡化形式

          如果將這些特征 先分別零中心化,即每列元素減去該列的平均值,再按列組裝成矩陣 ,那么此時的協(xié)方差矩陣可以簡寫為,

          接下來我們用兩種方法來得到 PC。

          .特征分解

          由于協(xié)方差矩陣是一個半正定對稱矩陣,因此我們可以對它作特征分解,

          可以看到,協(xié)方差矩陣被分解為由特征向量按列組成的矩陣 以及由特征值組成的對角矩陣 。而這些特征向量就是我們要找的 PC。

          這里需要注意的是,這些特征向量和特征值不是隨便排列的,例如,特征值在 對角線上是按從大到小排列的。

          然后,我們可以將數(shù)據(jù)投影到這些 PC 上去,即 。此時,我們再計算一下新特征間的協(xié)方差矩陣,

          新特征的協(xié)方差矩陣是對角矩陣,而且,對角線上的方差是從大到小排列的,這重要嗎?是的,不要忘了,我們還要降維,因此將數(shù)據(jù)點投影到前 個 PC 上,從而得到數(shù)據(jù)的新的坐標(biāo),

          而且,這些保留的前 個 PC 上的方差是從大到小排列的。回到上面那個平面數(shù)據(jù)點的例子,如果最后只保留一個 PC 的話,那就是導(dǎo)致方差最大的那個方向了。

          .奇異值分解

          我們也可以用奇異值分解來計算 PC,但不是分解協(xié)方差矩陣,而是分解特征矩陣。

          先對 作 SVD 分解,得

          然后代入?yún)f(xié)方差矩陣,

          現(xiàn)在的 PC 是矩陣 的列。將數(shù)據(jù)點投影到前 個 PC 上,從而得到數(shù)據(jù)的新的坐標(biāo),

          跟上面特征分解的協(xié)方差矩陣比較可得,

          但這里好像沒有用到它們啊。其實不然,一般來說,大佬是在幕后操作的,這里處在 C 位的奇異值或者特征值們也一樣。

          要知道,我們最后得到的 PC 都是按大佬們的大小來排座位的。

          .換個角度

          除了從方差角度考慮外,也可以從數(shù)據(jù)點到 PC 軸的垂直距離來考慮問題。

          你可以想象下圖中的黑線是實心桿,而每條紅線表示彈簧。彈簧的能量與它的長度平方成正比(物理學(xué)上稱為胡克定律),因此,如果所有彈簧長度平方之和達(dá)到最小時,桿子將處于平衡狀態(tài)。下圖模擬了達(dá)到平衡狀態(tài)的過程,

          這里其實想說的是,PCA 方法可以從多個角度去理解,那么對應(yīng)的數(shù)學(xué)問題也會有所不同,但這個不是本篇的重點。

          3降維實戰(zhàn)

          import?numpy?as?np
          import?seaborn?as?sns

          .小型數(shù)據(jù)集

          iris?=?sns.load_dataset('iris')

          先看一眼數(shù)據(jù),顯示前五行。

          iris.head()

          sepal_lengthsepal_widthpetal_lengthpetal_widthspecies
          05.13.51.40.2setosa
          14.93.01.40.2setosa
          24.73.21.30.2setosa
          34.63.11.50.2setosa
          45.03.61.40.2setosa

          Iris 鳶尾花數(shù)據(jù)集是一個經(jīng)典數(shù)據(jù)集。

          數(shù)據(jù)集內(nèi)包含 3 類共 150 條記錄,每類各 50 個數(shù)據(jù),每條記錄都有 4 項特征:花萼長度、花萼寬度、花瓣長度、花瓣寬度,可以通過這 4 個特征預(yù)測鳶尾花卉的品種。上面五列對應(yīng)的特征說明,

          • sepal_length 花萼長度
          • sepal_width 花萼寬度
          • petal_length 花瓣長度
          • petal_width 花瓣寬度
          • species 品種(共 setosa, versicolour, virginica 三類)

          .特征矩陣

          我們把最后一列去掉,只取前四列,可以拿來預(yù)測最后一列。因此,特征矩陣定義如下,

          X?=?iris.values[:,:-1]
          X?=?X.astype(np.float64)
          #?查看前五行數(shù)據(jù)
          X[0:5]
          array([[5.1, 3.5, 1.4, 0.2],
          [4.9, 3. , 1.4, 0.2],
          [4.7, 3.2, 1.3, 0.2],
          [4.6, 3.1, 1.5, 0.2],
          [5. , 3.6, 1.4, 0.2]])
          #?1、對特征矩陣零中心化
          X?-=?np.mean(X,?axis=0)

          看一下協(xié)方差矩陣

          cov_XTX?=?X.T@X
          cov_XTX
          array([[102.16833333,  -6.32266667, 189.873     ,  76.92433333],
          [ -6.32266667, 28.30693333, -49.1188 , -18.12426667],
          [189.873 , -49.1188 , 464.3254 , 193.0458 ],
          [ 76.92433333, -18.12426667, 193.0458 , 86.56993333]])

          .降維

          #?2、對特征矩陣進(jìn)行?SVD?分解
          U,?Sigma,?VT?=?np.linalg.svd(X,?full_matrices=False)
          U.shape,?Sigma.shape,?VT.shape
          ((150, 4), (4,), (4, 4))

          由于上面我們設(shè)置參數(shù) full_matrices=False,所以得到的矩陣 大小為 而不是 。

          我們來構(gòu)造新的特征,但要注意,上面函數(shù) np.linalg.svd 返回的矩陣 VT 是指 。所以,新的特征矩陣 對應(yīng)的代碼為,

          [email protected]

          再看一下這個新特征矩陣的協(xié)方差矩陣

          cov_YTY?=?Y.T@Y
          cov_YTY
          array([[ 6.30008014e+02, -8.12751455e-14, -1.46101800e-14,
          -6.74844752e-14],
          [-8.12751455e-14, 3.61579414e+01, -8.02807470e-15,
          9.98660131e-15],
          [-1.46101800e-14, -8.02807470e-15, 1.16532155e+01,
          -8.45168460e-16],
          [-6.74844752e-14, 9.98660131e-15, -8.45168460e-16,
          3.55142885e+00]])

          非對角線上的協(xié)方差都是極小了吧,當(dāng)零看,因此是個對角矩陣。

          4左奇異向量

          從前文中,大家已經(jīng)看到了 PCA 和 SVD 之間的聯(lián)系了。最后,我們來試圖對最終得到的 PC 從奇異值分解的角度作進(jìn)一步的解讀。

          我們知道,新的特征矩陣可以這么計算,。

          如果最終只想要 個維度,那就只需要取 的前 列,

          這就是將 個列向量看成一組基,然后將原始的特征數(shù)據(jù)往這組基上投影,得到新的坐標(biāo)。

          我們只知道現(xiàn)在確實已經(jīng)去除了新特征之間的線性相關(guān)性(協(xié)方差為零)。但是,得到的新坐標(biāo) 到底什么東西呢?它跟原來的特征矩陣到底什么關(guān)系呢?不知道大家會不會有這些疑問呢?

          另外,這里好像沒有左奇異向量什么事情呀。甚至連處在 C 位的矩陣之芯也沒有直接出場,只用到右奇異向量。這貌似總感覺不舒服,難道辛辛苦苦分解出仨,你就用了邊上一個就完事了?

          我們回到奇異值分解,。把 移到等號左邊,得 。

          發(fā)現(xiàn)了吧,這就是新坐標(biāo) 的另一種解讀呀,即 。如果只取 個維度,那就是

          好了,這樣來看的話,正是處在 C 位的矩陣之芯和左奇異向量聯(lián)手打造出了新的特征。

          這樣子是不是可以更好地理解新生成的特征呢?我們不妨用前一篇中的理論來試著解讀一番。

          矩陣之芯 SVD:?從奇異值分解看四個基本子空間

          .畫龍點睛

          那就是特征矩陣 (秩為 的列空間等于 列)的列張成的空間,

          的列是一組標(biāo)準(zhǔn)正交基,能更好地表示這個特征空間,而且它們不是隨便排列的,是由數(shù)據(jù)在空間中呈現(xiàn)時用坐標(biāo)表示后的方差決定的。

          如果要降維到 個維度,則只需要按次序挑選 列就能盡量保持?jǐn)?shù)據(jù)的線性結(jié)構(gòu)。這也正是我們千辛萬苦去找這些方向的原因。

          特征變換

          如何從數(shù)據(jù)的特征矩陣 重新塑造(變換)出所謂更好的特征呢?

          • 可知,其中 是對原來的特征矩陣的列(特征)進(jìn)行線性組合,再用 的對角元素分別縮放,構(gòu)造出了最終的新特征。

          • 如果把特征矩陣 看成線性變換,那就是,

          5小結(jié)

          矩陣 可以有不同身份,例如

          • 矩陣作為變換的化身,往往是以 這樣的形式發(fā)揮作用。給人感覺矩陣以這種身份出現(xiàn)的情況更多?

          • 矩陣僅僅表示數(shù)據(jù),并不是用來變換別人。這種場景也不少,比如本篇里的例子,它是以列向量集合的形式出現(xiàn)。

          但不管它是什么身份,都可以對矩陣作奇異值分解,而且分解以后可以得到更好的解讀,不管是變換也好,還是數(shù)據(jù)表示也好。

          看到這還沒來得及跑的同學(xué),給個三連好嗎?

          微信5000好友是什么體驗?

          機器學(xué)習(xí)最好的入門課程是什么?

          機器學(xué)習(xí)從 入 門 到 精 通 路 線 圖

          阿里云Python訓(xùn)練營總結(jié):聊聊堅持的意義

          瀏覽 48
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲影院第一页在线观看 | 狠狠色7777 | 国产AV综合 | 三级片天天日 | 大鸡吧日视频在线观看 |