兩件事會不會一起動 —— 共變異數與它的矩陣
玩完這關,你會親手把「兩欄數字」壓成一個數字、再排成一張 2×2 表格。而那張表格,就是 PCA 唯一吃的那道菜。
① 這關在解什麼問題
你手上有一份實價登錄:500 筆成交,每筆有坪數和總價兩欄。你算得出坪數的標準差是 8.4 坪、 總價的標準差是 620 萬 —— 兩個數字都很正確,而且都很沒用,因為你真正想知道的那句話它們一個字都沒回答:
標準差的結構性缺陷在這裡:它一次只看一欄。坪數的標準差不管總價那欄長什麼樣、總價的標準差也不管坪數 —— 你可以把總價那欄整個打亂順序,兩個標準差完全不變,但「一起動」這件事已經被你毀掉了。 所以答案不可能藏在任何單一欄位的統計量裡,它必須是一個跨兩欄、而且會被配對順序影響的量。
這關給你的工具叫共變異數(covariance),以及把它排成表格之後的共變異數矩陣。 後者是這份教材的軸心零件:04 關要拆它、05 關整個 PCA 就是在對它動手。
02 關的結論是一句很漂亮的話:把一欄數字中心化,它就是一條向量, 而變異數 = 這條向量跟自己的內積 ÷ (n−1)。
既然是「跟自己」的內積,那下一個問題根本是自動冒出來的:跟別人的內積是什麼意思? 這關就是在回答這一句,而答案短得有點好笑 —— 那就是共變異數,什麼新東西都不用學。
② 從國中的「正負相乘」開始
先把國中座標平面搬過來,但做一個關鍵動作:把原點搬到平均。每個點的座標不再寫「唸了 12 小時、考 16 分」, 而是寫「比平均多唸 3.2 小時、比平均多考 4.6 分」。以平均為中心畫一個十字,平面被切成四塊:
- 右上:x 偏差正、y 偏差正 → 相乘 正(兩件事都在平均以上)
- 左下:兩個偏差都是負 → 負負得正,相乘還是 正(兩件事都在平均以下)
- 左上 / 右下:一正一負 → 相乘 負(一件事高、另一件事低)
國中的「負負得正」在這裡突然變得很有意義:它讓「一起低」跟「一起高」算成同一件事,因為兩者都是同步。 共變異數就是把每個點的(x 偏差 × y 偏差)全部加起來、再平均掉,讓正負互相抵消,剩下的就是這團資料的傾向。
拖動那顆點走遍四個象限,看它的貢獻怎麼變號。虛線框的面積就是這個點的貢獻大小 —— 離十字越遠,框越大,發言權越大。
—
跟 02 關的變異數同一個理由:你想要的是「平均而言的傾向」,不是「資料越多數字越大」。 分母用 n−1 而不是 n,是因為 x̄ 和 ȳ 是從同一批資料估出來的,已經吃掉一個自由度。 全站統一樣本版(ddof = 1),LAB.M 的預設值就是它。
③ 主實驗:九個同學的唸書時數與分數
橫軸是每週唸書時數(小時),縱軸是週考分數(滿分 20)。九個點都可以拖。 綠點正在把共變異數往上推,紅點正在往下扯。
藍虛線 = x̄(平均時數)、橘虛線 = ȳ(平均分數),交叉點就是新原點。 背景淡綠是正貢獻象限、淡紅是負貢獻象限。拖動任一點會畫出它到新原點的矩形 —— 那塊面積就是它的貢獻。
—
① 按「無關」,然後只拖最右邊那一點往右上角拉到底。貢獻條會冒出一根長長的綠色,cov 從幾乎 0 一路衝上去 —— 一個點就能改寫整份結論,這正是「一點離群值翻盤」那個 preset 想讓你看的事。
② 從「正相關」開始,把最右邊那個高分同學垂直往下拖到分數很低。他的貢獻條會翻紅、整體 cov 明顯掉下來 —— 因為他從「右上」跑到了「右下」象限。象限決定符號,離十字的距離決定份量,就這兩件事。
④ 共變異數就是內積 —— 把這座橋整條搭完
上面那個 Σ(x−x̄)(y−ȳ) 你會算了,但它跟01 關的箭頭、影子、夾角 有什麼關係,到現在還是一句「聽說是同一件事」。這一節把橋一格一格鋪到底 —— 而且鋪完之後你會多拿到一個東西: 迴歸的斜率。
第一步:把資料筆數砍到最小,直到看得見為止
九個同學的中心化向量是 9 維的,畫不出來。所以先砍到只剩三個同學(叫他們甲、乙、丙), 每人只有兩個數字:唸書時數與分數。中心化之後,時數那一欄變成三個偏差,排成一條向量:
3 維還是不好畫。但這裡有一件事救了我們:那三格加起來一定是 0。 因為平均就是從這三個數字算出來的 —— 減掉平均之後,正的部分和負的部分必然剛好抵光 (下面那張表最後一列會現場驗證,你怎麼拖它都是 0.00)。
「三個數字,但加起來被綁死是 0」= 其實只有兩個是自由的(這就是分母為什麼是 n−1 而不是 n 的真正原因)。 兩個自由度 = 一張平面。所以我們可以把 cx、cy 原封不動地畫成平面上的兩支箭頭。
圖上橫軸是 (甲−乙)/√2、縱軸是 (甲+乙−2×丙)/√6。 你完全不用管這兩條式子從哪來,唯一要知道的是:它們互相垂直、長度都是 1 (就像普通座標紙的 x 軸和 y 軸一樣)。這代表換到這張平面上不會扭曲任何長度或角度。
不用相信我:讀數盤裡有兩行刻意並列 —— 一行是「圖上兩支箭頭的內積」, 一行是「用三個同學的偏差直接乘出來的內積」。它們永遠是同一個數字。
下圖(資料空間):甲乙丙三個人的散點、平均十字、以及綠色迴歸線。 你可以動什麼:拖藍點或橘點(就是兩支箭頭的尖端); 或按四顆按鈕直接跳到「同方向 / 垂直 / 反方向 / 完全平行」。你一拖,下圖那三個同學的成績就跟著改 —— 因為那兩支箭頭就是他們的成績。 要看出什麼:上面那三個大數字永遠一模一樣(內積 = 長度×長度×cos θ = cov×(n−1)); 而箭頭的夾角決定 cov 的正負:小於 90° 正、垂直就是 0、大於 90° 負。
向量空間:一支箭頭 = 一整欄資料。藍是時數欄、橘是分數欄。 綠是「cy 之中沿著 cx 的那一塊」,跟 01 關的投影是同一張圖、同一組顏色。
資料空間:同一件事的另一種畫法 —— 一個點 = 一個同學。 綠線的斜率就是上圖那個投影係數(下面第三段會對數字)。
| 同學 | 時數 | 分數 | cx 的一格 | cy 的一格 | 相乘 |
|---|
—
兩個同學會壞掉:只有兩筆資料時,中心化後的兩格必然是「一正一負、大小相同」 (因為要加起來等於 0),所以 cx 一定長成 (d, −d) 這個樣子。 兩支箭頭永遠躺在同一條線上,夾角只可能是 0° 或 180°,corr 只可能是 ±1 —— 「垂直 → cov = 0」那一格根本畫不出來。三筆是能同時演出正、零、負的最小筆數,所以用三個。
第二步:三句對應,這是本節的結論
把上面拖出來的東西寫成三句話。反白那一列就是你現在的狀態:
| 兩支箭頭的關係 | 夾角 θ | 內積 cx · cy | cov(x, y) | 影子(投影) |
|---|---|---|---|---|
| 朝同一邊 | < 90° | 正 | 正 | 綠箭頭跟藍箭頭同向 |
| 互相垂直 | = 90° | 0 | 0 | 綠箭頭縮成一點(藍這把尺量不到橘) |
| 朝相反邊 | > 90° | 負 | 負 | 綠箭頭指向藍箭頭的後方 |
三句話合起來就是一條等式,而它是01 關那條的原封不動搬過來:
共變異數不是「跟內積有關」,它就是內積本人,只差一個除以 (n−1)。 「兩件事會不會一起動」這個統計問題,被翻譯成「兩支箭頭是不是朝同一邊」這個幾何問題 —— 一步都沒有遺漏。
第三步:投影係數 = 迴歸的斜率(順手拿到的贈品)
上面那張圖裡的綠箭頭還沒被榨乾。01 關說過, 把 cy 投影到 cx 上,那個影子是 cx 的幾倍,這個倍數叫投影係數:
而這個數字有一個你天天在用的名字:最小平方迴歸的斜率。也就是「x 每多 1 單位,y 平均多多少」。 讀數盤最後兩行就是在對這件事的帳:投影係數 跟 cov ÷ var(時數) 永遠是同一個數字, 而它就是下圖那條綠線的斜率。
直覺一句話:迴歸在做的事是「用 cx 的倍數去逼近 cy,讓剩下的誤差最小」。而「誤差最小」在幾何上就是 誤差必須垂直於 cx(不垂直的話,沿著 cx 再挪一點就能更短)—— 那正是圖上紅虛箭頭跟直角記號在演的事。所以迴歸 = 投影, 最小平方法就是「取影子」的別名。
完整的推導(含多個變數、含截距、含 (XTX)−1XTy 那條公式) 不在這份教材的射程內 —— 那是迴歸分析那本書的內容。這裡只要你抓到一件事: 那條式子裡的 XTX,就是這一關的共變異數矩陣(⑧ 會拆給你看)。
第四步:回到九筆資料 —— 畫不出來,但一個字都不用改
三個同學能畫,九個不能,因為 cx 變成 9 維向量,而你沒有 9 維的紙。 但算法完全沒有變:內積還是「對應格子相乘再加起來」,只是從 3 格變成 9 格;長度還是「平方和開根號」; 夾角還是「內積除以兩個長度再取反餘弦」。維度只是 for 迴圈跑幾圈的差別。
02 關已經把這件事在「跟自己」的情況下講過一次了: 變異數 = cx 跟自己的內積 ÷ (n−1)。這一關只是把第二個參數換成別人, 於是整條主線收成一句話:
dot。⑤ 為什麼有了共變異數還要相關係數
共變異數有一個致命的實務問題:它帶單位。上面那個數字的單位是「小時 × 分」,你根本沒辦法回答 「18.6 小時·分算大還是小」。更糟的是,我只要換個單位、資料一個點都沒動,這個數字就會整個變掉。
拉兩個滑桿(把時數換成分鐘、把 20 分制換成 100 分制),盯著這張圖: 形狀一模一樣、點的相對位置完全沒動,只有座標軸上的刻度數字變了。然後看右邊 cov 怎麼暴衝、corr 怎麼一動不動。
—
| 共變異數 cov | 相關係數 corr | |
|---|---|---|
| 單位 | 小時 × 分(沒人看得懂) | 沒有單位 |
| 換單位會不會變 | 會,乘上兩邊的倍數 | 不會,完全免疫 |
| 範圍 | −∞ ~ +∞,大小沒有基準 | 固定 −1 ~ +1 |
| 能不能跨題目比 | 不能(房價的 cov 跟身高的 cov 沒得比) | 可以,0.8 就是比 0.3 強 |
| 能不能加減、排成矩陣 | 可以,這是它存在的理由 | 可以,但丟掉了各欄的量級資訊 |
| 幾何身分 | 兩條中心化向量的內積 | 同一組向量的 cos |
讀數盤最後一行不是巧合,是同一條算式。01 關的餘弦相似度是「內積除以兩條向量的長度」, 目的就是把長度的影響洗掉、只留方向。把 x 那欄中心化得到 cx、 y 那欄中心化得到 cy,那麼:
於是 corr 的兩個性質完全不用背,直接從 01 關繼承:cos 一定落在 −1 ~ 1; 而 |corr| = 1 就代表 θ = 0° 或 180°,兩條中心化向量完全平行 —— 平行的意思是 cy = k·cx,也就是所有點精準落在一條直線上。 你可以在上面主實驗把九個點排成一條斜線試試,corr 會走到 ±1.000。
⑥ 共變異數矩陣:把所有內積排成一張表
現在有兩欄,於是有四種配對:x 跟 x、x 跟 y、y 跟 x、y 跟 y。四個內積排成 2×2,就是共變異數矩陣:
下面四格熱力圖吃的就是上面主實驗那份資料(你在上面拖點,這裡會跟著變)。顏色表示正負與大小: 綠=正、紅=負,越深代表絕對值越大。
這張圖是中心化後的那團資料(原點就是新原點)。軸上的藍色刻痕是每個點的 x 座標、 橘色刻痕是 y 座標 —— 它們的散開程度就是對角線那兩個數字。
—
你轉了半圈,對角線兩個數字瘋狂互相搬東西,但它們的和從頭到尾沒動過。這個和叫矩陣的跡(trace), 意思是「這團資料的總變異量」—— 轉座標軸不會憑空生出或消滅資訊,只會換一種分法。 05 關算「主軸解釋了幾成變異」,分母就是它。
慢慢拉那個滑桿,你會抓到某個角度讓非對角線趨近 0(讀數會變綠並跳出提示)。非對角線 = 0 的意思是: 在這組新座標軸下,兩個座標完全不一起動、彼此無關。整團資料被擺正了 —— 一根軸吃下絕大部分的變異,另一根軸只剩薄薄一層。
能不能不用手拉、直接算出那個角度?它有什麼特別?這個問題的答案就是 PCA 的全部內容 —— 那個方向叫主軸,算它的工具是04 關的特徵向量,成品在 05 關的角度掃描。先把「非對角線歸零」這個畫面記住,那是你之後所有直覺的來源。 (順手記住你拉到的那個角度 —— 這份九個同學的資料,答案是 52.5°;轉半圈後的 142.5° 是同一根軸。05 關會換成一份身高體重的資料,用一行算式把角度直接解出來,你回來對一下這兩件事是不是同一回事。)
n 欄就是 n×n:三欄的靜態示範
共變異數矩陣沒有「只能 2×2」這回事。十個人量了身高(cm)、體重(kg)、鞋號(EU)三欄, 配對方式從 4 種變成 9 種,於是矩陣是 3×3。下表每一格都是頁面載入時用 JS 真的算出來的 (合成資料,不是真的量誰):
| cov | 身高 | 體重 | 鞋號 |
|---|
淡底那條對角線一路都是變異數(身高自己的、體重自己的、鞋號自己的),因為 cov(a, a) 就是 var(a)。 非對角線一定沿對角線鏡射對稱。每一格的單位都不一樣(cm²、cm·kg、kg·EU…)—— 這就是為什麼實務上會再看一張相關係數矩陣:
| corr | 身高 | 體重 | 鞋號 |
|---|
相關係數矩陣的對角線永遠是 1.000(任何東西跟自己完全相關),非對角線一律落在 −1 ~ 1,可以直接互相比大小。
⑦ 這個數字越大越小,到底要怎麼讀
你已經會算那張 C 了。真正卡人的是下一步:「18.61」這個數字算大還是算小? 這一節把「怎麼讀」拆成四件可以逐條檢查的事,每一件都用你在 ③ 主實驗拖出來的那份資料現場算給你看 —— 你回上面拖點,這一節的每個數字都會跟著變。
一、cov 的絕對大小本身沒有意義,因為它帶單位
這件事你在 ⑤ 換單位那個實驗已經親眼看過了:兩個滑桿一拉,散點圖的形狀一模一樣、 每個點的相對位置一格都沒動,只有座標軸上的刻度數字變了 —— 而 cov 從 18 暴衝到六萬多。這裡只把結論釘死:
—
看 cov 的時候只准看三件事,其他都是幻覺:
- 正負號 —— 唯一不受單位影響的資訊(換單位只會乘上正的倍數)。
- 跟自己比 —— 跟同一張 C 裡的對角線比,也就是下面第三點的柯西上限。
- 轉成 corr —— 把單位洗掉之後才有「大小」可言。
反過來說:「這個 cov 是 18.61,所以關係中等」是一句沒有意義的話,因為 18.61 可以是 0.0052 也可以是 66996, 取決於你用什麼單位量。
二、正負號怎麼讀(這一半的資訊完全可靠)
符號是四象限投票的結果(② 那張圖),也是兩條中心化向量的夾角(④ 那張圖)。 下表反白的那一列就是你現在這份資料:
| cov 的符號 | 兩條向量的夾角 | 資料雲長什麼樣 | 一句人話 |
|---|---|---|---|
| cov > 0 | 小於 90°(偏同一邊) | 雲從左下往右上斜 | x 大的時候 y 通常也大 —— 唸得多的分數也高 |
| cov ≈ 0 | 約 90°(垂直) | 雲是圓的、或平的、或對稱的曲線 | 看不出直線傾向(注意:不等於無關,見 ⑩ 反例區) |
| cov < 0 | 大於 90°(偏相反邊) | 雲從左上往右下斜 | x 大的時候 y 通常小 —— 一個高另一個就低 |
對角線沒有這個問題:C11、C22 是變異數, 是「一堆平方加起來」,所以永遠 ≥ 0,永遠沒有符號可讀 —— 它們只回答「這一欄自己有多散」。
三、跟自己比:非對角線有一個天花板,而它占了幾成就是 |r|
這是把「大小」變成可讀量表的關鍵一步。非對角線不是隨便多大都行,它被對角線綁住:
—
「這個 cov 很大」正確的說法是「它頂到自己天花板的九成」。天花板由兩個對角線決定, 所以非對角線永遠要跟對角線一起讀 —— 單獨看一格數字,永遠讀不出東西。 而「占幾成」這個百分比不是別的東西,它就是 |r|,所以你其實一直都只需要 r。
四、相關係數量表:|r| 多少才叫「有關係」
把 cov 換成 r 之後才有量表可用。但先講一句誠實話:下面這張表是領域慣例,不是鐵則。 量化交易裡日報酬 r = 0.05 就足以賺錢;物理實驗的校正曲線 r = 0.98 會被退件說雜訊太大。 同一個 0.5,在不同領域是「很強」和「垃圾」。
r 不是設定值,是從畫面上那 26 顆點真的算出來的(LAB.M.corr)。
雜訊的大小固定不動,你唯一在改的是趨勢主軸的長度與方向。
—
| |r| | r²(解釋掉幾成變異) | 實務上的意思(一般社會科學 / 工程慣例) |
|---|---|---|
| < 0.3 | < 9 % | 幾乎看不出關係。這種強度不要拿來做決策,很可能是雜訊或樣本太小。 |
| 0.3 ~ 0.7 | 9 ~ 49 % | 看得出趨勢,但單筆預測會錯得很兇。可以說「有傾向」,不能說「可以用 x 推 y」。 |
| 0.7 ~ 0.95 | 49 ~ 90 % | 很強,拿來預測有實用價值。大部分教科書說的「高度相關」在這一格。 |
| > 0.95 | > 90 % | 幾乎是同一件事。實務上看到這種值先懷疑自己:是不是兩欄本來就是同一個東西換算過來的(例如公分與英吋)。 |
① r² 比 r 好懂:r = 0.7 聽起來很強,但 r² = 0.49,意思是「還有一半的變異你完全解釋不了」。 報告數字時給 r²,別人比較不會誤會。
② r 大不代表斜率大。r 只講「點有多貼那條線」,不講那條線有多斜。 斜率是另一個數字(④ 那節的投影係數 cov/var(x))—— 一條幾乎水平但點貼得死緊的線,r 可以到 0.99。
③ n 很小的時候 r 隨便就很大。三個點就幾乎一定排得像一條線。看到 r = 0.9 先問「n 是多少」。
拿到一張共變異數矩陣,逐格盯著數字大小是白費工。正確的讀法只有三步: ① 對角線看「每一欄自己有多散」(永遠 ≥ 0,兩個加起來是 tr(C) = 總變異量); ② 非對角線只讀符號; ③ 要讀強弱就換成 r(= 非對角線占天花板的比例),再套量表。
⑧ 數學長怎樣
先看程式。整關的三個等式寫成 JS 就這幾行,而且核心只有 dot 一個函式:
// 一欄數字 = 一條 n 維向量(n = 幾筆資料,不是幾欄)
const hours = [2, 3.5, 5, 6.5, 8, 10.5, 12, 14.5, 17];
const score = [6, 9, 7, 12, 10, 11, 16, 14, 18];
const n = hours.length;
const mean = (a) => a.reduce((s, v) => s + v, 0) / a.length;
const center = (a) => { const m = mean(a); return a.map((v) => v - m); };
const dot = (a, b) => a.reduce((s, v, i) => s + v * b[i], 0);
const len = (a) => Math.sqrt(dot(a, a));
const cx = center(hours), cy = center(score); // 兩條中心化向量
const varx = dot(cx, cx) / (n - 1); // 變異數:自己跟自己(02 關)
const cov = dot(cx, cy) / (n - 1); // 共變異數:換成跟別人 ← 就這樣
const corr = dot(cx, cy) / (len(cx) * len(cy)); // 把長度洗掉 ← 就是 cos(01 關)
const C = [[varx, cov], [cov, dot(cy, cy) / (n - 1)]]; // 共變異數矩陣
這頁的互動全部走 LAB.M,不另外寫一份:LAB.M.cov(x, y)、LAB.M.corr(x, y)、 LAB.M.covMatrix(pts)(ddof 預設 1,樣本版)。三欄示範的 3×3 是自己補的兩層迴圈,因為 LAB.M 只做 2×2。
換成符號版,注意它跟程式是逐字對應的:
Σi = 把 i 從 1 跑到 n 全部加起來 · n = 資料筆數(9 個同學) · n − 1 = 自由度
分母就是兩條向量的長度(各除以 √(n−1))—— 除以長度=把單位洗掉,只剩純粹的方向關係
如果你想要一眼看穿的寫法:把中心化後的資料排成一個 n×2 矩陣 X(每列一筆資料、每欄一個變數),那麼 C = XTX / (n − 1)。 上標 T 唸作轉置(transpose),意思就是把矩陣的列跟欄對調 —— 本來 n×2 的 X,轉過來就是 2×n 的 XT(原本一列一筆資料,變成一列一個變數)。 於是 XTX 這個動作的效果 就是把每一欄跟每一欄兩兩做內積、排成一張表 —— 共變異數矩陣沒有任何新東西,它是一張內積表。
本頁符號小抄(畫面上出現過的每一個字母)
這一頁凡是出現在圖上、讀數盤上、按鈕上的符號,全部列在這裡。看到不認識的符號就查這張表:
| 符號 | 怎麼唸 | 它是什麼 |
|---|---|---|
| xi / yi | x-sub-i | 第 i 筆資料的兩個值。下標 i 就是「第幾個同學」。 |
| n | n | 資料筆數(幾個同學),不是幾欄。主實驗是 9、④ 是 3。 |
| x̄ / ȳ | x-bar / y-bar | 那一欄的平均。加一橫就是「取平均」。圖上的藍虛線 / 橘虛線就是它,交叉點是新原點。 |
| cx / cy | c-x / c-y | 中心化向量:把一欄的每個值減掉自己那欄的平均之後排成的向量。有 n 筆資料它就有 n 格。 ④ 圖上那兩支箭頭就是它。 |
| |cx| | c-x 的長度(norm) | 向量的長度 = √(每格平方加起來)。它跟標準差只差一個 √(n−1)。 |
| cx · cy | c-x dot c-y | 內積:對應格子相乘再全部加起來。cov 就是它除以 (n−1)。 |
| Σi | sigma(大寫) | 加總:把 i 從 1 跑到 n,把後面那串東西全部加起來。 |
| n − 1 | n 減一 | 自由度。分母不用 n 是因為 x̄ 是從同一批資料估出來的,已經吃掉一個自由度(全站統一 ddof = 1,樣本版)。 具體症狀在 ④ 的表格:三個偏差加起來一定是 0,所以只有 2 個是自由的。 |
| θ | theta | 兩條中心化向量的夾角(0°~180°)。它決定 cov 的正負:<90° 正、=90° 零、>90° 負。 |
| cos θ | cosine theta | 夾角的餘弦,範圍 −1~1。它就是相關係數。 |
| σx | sigma-x(小寫) | x 那一欄的標準差 = √var(x)。跟大寫 Σ(加總)是完全不同的東西,只是長得像。 |
| r | r | 相關係數(= corr = cos θ),永遠在 −1~1,沒有單位。 |
| r² | r squared | r 的平方,讀作「拿 x 猜 y 能解釋掉 y 的變異的幾 %」。 |
| C | 大寫 C | 共變異數矩陣。兩欄資料 → 2×2;三欄 → 3×3。 |
| C11 C22 | C-one-one / C-two-two | C 的對角線:var(x) 與 var(y)。第一個下標是列、第二個是欄。永遠 ≥ 0。 |
| C12 C21 | C-one-two / C-two-one | C 的非對角線:cov(x, y)。兩格永遠是同一個數字(內積可交換)。 |
| tr(C) | trace C(跡) | 對角線兩個數字相加 = C₁₁ + C₂₂ = 這團資料的總變異量。轉座標軸不會改變它。 |
| X | 大寫 X | 把中心化後的資料排成的矩陣:每一列一筆資料、每一欄一個變數(所以是 n×2)。 |
| XT | X transpose(轉置) | 把 X 的列跟欄對調:n×2 變成 2×n(本來一列一筆資料,變成一列一個變數)。 |
| XTX | X-transpose X | 這個乘法的效果就是把每一欄跟每一欄兩兩做內積、排成一張表。除以 (n−1) 就是 C。 |
| 甲 / 乙 / 丙 | — | ④ 那三個同學的名字,對應 cx 的三格。 |
| (甲−乙)/√2、(甲+乙−2×丙)/√6 | — | ④ 那張圖的兩根座標軸。你不用管它們從哪來,唯一要知道的是 它們互相垂直、長度都是 1,所以圖上的長度/夾角/內積跟 3 維裡算出來的完全一樣 —— 那節的讀數盤有兩行在現場對帳。 |
⑨ 工程師的「原來如此」
你有兩檔資產,報酬率的標準差各是 σ1、σ2。直覺會說「各買一半,風險就是兩者平均」。錯。各半的組合,變異數是:
如果兩檔的 cov 是負的(一個跌的時候另一個常常漲),總風險會比兩檔各自的風險都小。 這不是話術,是上面那條等式的算術結果 —— 「分散風險」的嚴格定義就是「湊出負的共變異數」。 Markowitz 靠這件事拿了諾貝爾獎,而現代投組最佳化程式裡最大的那個物件,就是一張 n×n 的共變異數矩陣。
反過來也解釋了 2008 為什麼那麼慘:模型全都假設不同房貸資產的 cov 很低,結果崩盤時它們一起掉 —— cov 突然全部變成正的,號稱分散的組合其實是同一個押注。
卡爾曼濾波(GPS 定位、無人機姿態、SLAM、感測器融合的標準配備)追蹤的從來不是一個位置,而是 一個位置 + 一張共變異數矩陣 P。P 的對角線是「我對 x / y 各自的不確定度」,非對角線是「這兩個誤差會不會一起錯」。 把 P 畫出來就是誤差橢圓:對角線決定它多胖,非對角線決定它斜多少。整個演算法在做的事, 就是每收到一筆新觀測就更新這張矩陣。
另一個天天在用的是白化(whitening):如果輸入特徵之間的 cov 不是 0,代表你的維度彼此重複、 誤差面被拉成一條斜的長峽谷,梯度下降只能沿谷壁 zigzag。白化就是「把共變異數矩陣變成單位矩陣」—— 把非對角線壓成 0(=上面那個滑桿的目標)再把對角線正規化。BatchNorm 只做了對角線那一半, 做滿的版本叫 ZCA / PCA whitening,而怎麼把非對角線變 0,就是 04 到 05 關的內容。
⑩ 反例區:共變異數看不見的東西
共變異數很有用,但它有一個非常硬的限制:它只回答「有沒有直線傾向」。下面三組資料是三種不同的翻車方式,切換看看。
—
—
踩坑清單
只等於「沒有直線關係」。上面那條拋物線的 cov 是 0.00,但 y 完全由 x 決定 —— 關係強到不能再強,只是不是直線。 cov = 0 的正確唸法是「不線性相關」,不是「獨立」。(反過來成立:真正獨立 → cov 一定是 0。)
它帶單位。房價資料的 cov 可能是 3.7×10⁷(坪·萬元),同學資料的 cov 是 18.61(小時·分),比大小完全沒有意義 —— 換單位那個實驗已經證明:資料一個點都沒動,我光換單位就能讓 cov 大一萬倍。要比強弱,一律用 corr。「那到底要怎麼讀那個數字」整套讀法在 ⑦ 這個數字怎麼讀:只讀符號、跟自己的天花板比、換成 r。
上面反例 ② 的九個點裡有八個毫無關係(corr ≈ 0.07),加進一顆離群值就讓 corr 跳到 0.79。 因為每個點的貢獻是「兩個偏差相乘」,離群值的兩個偏差都很大,相乘之後以平方的速度放大它的發言權 —— 這跟 02 關變異數怕離群值是同一個病,而且更嚴重。 習慣動作:先畫散點圖,或改用 Spearman(對排名做 corr)。
反例 ③ 的 corr 高達 0.96,但冰淇淋不會讓人溺水 —— 背後有第三個變數(氣溫)同時推動兩者。 共變異數只量「一起動」,對「誰造成誰」完全沒有意見。要談因果得靠實驗設計或因果推論,不是算一個數字就好。
⑪ 這關回答了什麼
什麼是共變異數?
兩欄數字「一起偏離自己平均」的平均程度。做法只有三步:以兩欄的平均為新原點算出每筆的偏差、把兩個偏差相乘、 把所有乘積加起來除以 (n−1)。
正的代表「同步」(大的一起大、小的一起小),負的代表「反向」,接近 0 代表沒有直線傾向。 象限那張圖是它最直觀的樣子:右上與左下的點投贊成票、左上與右下投反對票,離十字越遠票越重。
有了標準差為什麼還要共變異數?它多回答了什麼?
標準差是單欄的量,只知道「這一欄自己有多散」。你把另一欄整個打亂順序,兩欄的標準差一模一樣, 但配對關係已經被毀了 —— 所以標準差結構上不可能回答「一起動」。
共變異數多回答的是配對關係:坪數大的是不是同時比較貴、A 股跌的時候 B 股會不會一起跌。 它是第一個「看得到兩欄之間」的統計量,也是為什麼它能排成矩陣,而標準差只能排成一排數字。
共變異數矩陣是什麼意思?那四格分別在講什麼?為什麼一定對稱?
它是「所有欄位兩兩配對的內積表」。第 i 列第 j 欄 = cov(第 i 欄, 第 j 欄)。兩欄的版本是 2×2:
- 左上 var(x):x 跟自己的內積 ÷ (n−1) —— x 自己有多散
- 右上 cov(x, y):x 的中心化向量 · y 的中心化向量 ÷ (n−1) —— 兩欄一起動的程度
- 左下 cov(y, x):跟右上是同一個數字
- 右下 var(y):y 自己有多散
對稱的原因就是內積可以交換:a · b = b · a,所以 cov(x, y) 和 cov(y, x) 是同一條算式。 這不是巧合而是保證 —— 也正因為它是對稱矩陣,04 關才能保證它的特徵值一定是實數、 特徵向量一定互相垂直,PCA 才成立。去四格熱力圖拖上面的點,右上和左下永遠一起變。
共變異數跟內積有什麼關係?
是同一件事,不是「有關係」。把 x 那欄中心化成 cx、y 那欄中心化成 cy,則:
02 關證明了變異數是「cx 跟自己的內積」,這關只是把第二個參數換成別人。 整條線是:內積 → 跟自己=變異數 → 跟別人=共變異數 → 全部排成表=共變異數矩陣(XTX / (n−1))。 沒有任何新公式,只有同一個內積被用在不同地方。
共變異數跟「投影」有什麼關係?(Max 直接問的那題)
有,而且是同一套東西的兩種讀法。內積 cx · cy 可以拆成 「影子的長度 × 尺的長度」(01 關的結論)。所以:
- 看正負 → 看兩條向量的夾角:小於 90° 就是 cov 正、等於 90°(垂直)就是 cov = 0、大於 90° 就是 cov 負。
- 看強弱 → 看 cos θ,那就是相關係數 r。
- 看「x 變 1 單位 y 會變多少」 → 看投影係數 (cy · cx) / (cx · cx), 也就是 cov(x, y) / var(x) —— 這正是最小平方迴歸的斜率。
去 ④ 那一節拖那兩支箭頭:三個數字(內積、|cx||cy|cos θ、cov×(n−1))永遠一模一樣, 而綠色投影箭頭的係數永遠等於下面那條迴歸線的斜率。
相關係數跟共變異數差在哪?什麼時候用哪一個?
差在有沒有除掉長度。cov 是內積、corr 是 cos。cov 帶單位、大小沒有基準;corr 沒有單位、永遠在 −1 ~ 1,可以跨題目比較。
要判斷關係強弱、要跟別的資料集比、要報告給人看 → 用 corr。要繼續算下去 (投組風險、卡爾曼濾波、PCA、任何要把矩陣丟進線代運算的場合)→ 用 cov,因為它保留了各欄的實際量級,而且可加。
補一個常見誤會:corr 矩陣就是「先把每欄除以自己的標準差,再算 cov 矩陣」。所以對標準化過的資料做 PCA 等於對 corr 矩陣做 PCA —— 而它跟直接對 cov 矩陣做 PCA 的結果會不一樣,細節在 05 關的單位陷阱。
共變異數矩陣裡那個數字「越大越小」到底代表什麼?(Max 直接問的那題)
先講結論:cov 的絕對大小本身沒有意義,因為它帶單位。同一份資料,我把時數從小時換成秒, cov 就大 3600 倍,關係一點都沒變強。所以看 cov 只有三種讀法:
- 讀正負號:正=一起動、負=反向、≈0=沒有直線傾向。這一半的資訊是可靠的。
- 跟自己的上限比:非對角線的絕對值永遠 ≤ √(C11·C22)(柯西不等式)。 「它占了上限幾成」這個百分比就是 |r| —— 這才是「大小」唯一有意義的讀法。
- 換成 corr:直接把上面那個百分比讀出來,順便得到可以跨資料集比較的量表。
對角線就單純多了:它一定 ≥ 0(那是變異數),越大代表那一欄自己越散;兩個加起來(跡 tr(C))= 這團資料的總變異量。 完整的現算對帳在 ⑦ 這個數字怎麼讀。
共變異數 = 0 是不是代表兩件事沒關係?
不是。只代表沒有直線關係。反例 ① 的拋物線 cov = 0.00, 可是 y 完全由 x 決定(y = a·x² + b),關係強到 100%。cov 的四象限投票機制在對稱的拋物線上正負剛好抵消,所以它什麼都看不到。
正確的邏輯方向只有一邊成立:獨立 → cov = 0;但 cov = 0 ⇏ 獨立。 實務上的習慣動作是:算 corr 之前先畫散點圖,五秒鐘就能看出是不是直線。
你現在手上有一張 2×2 的共變異數矩陣,而且已經親眼看到:資料的形狀就塞在這四個數字裡 —— 胖瘦看對角線、斜不斜看非對角線。問題是,這四個數字擺在那裡,你看不出形狀,更算不出「主軸朝哪」。 你唯一找到那個角度的方法還是拉滑桿硬試。
所以下一步不是繼續學統計,而是回頭學一件更基本的事:一個矩陣要怎麼被看穿。矩陣有沒有「不會被它轉歪的方向」? 有的話那些方向在說什麼?04 關先把矩陣拆開來看骨架(特徵向量), 然後05 關把骨架裝回這張共變異數矩陣上 —— 那個你拉滑桿硬找的角度,會用一行算式解出來。
還有一個順便留下的洞:這張 C 除了「被拆開看主軸」之外,還有另一個身分 —— 把它反過來(求逆)當一把尺用, 就能量「這個點離資料中心算不算遠、算不算奇怪」,那把尺畫出來就是一顆橢圓。那是 機率統計 05 關:橢圓的真身 —— 拿 C 當一把尺。