【機器學習】1. 廣義線性模型

来源:https://www.cnblogs.com/jy333/archive/2023/03/10/ML_1.html
-Advertisement-
Play Games

1. 廣義線性模型 1.1 從簡單線性回歸開始 機器學習的任務是從已知的數據中提取知識, 從而完成對新數據的識別與預測, 即應用知識. 但是, 數據本身不會給予研究者想要的答案, 大多數時候人們很難通過觀察或者簡單的計算提取有用的結論. 為了從歷史數據中整合知識, 人們提出了"模型"這一概念, 認為 ...


1. 廣義線性模型

1.1 從簡單線性回歸開始

機器學習的任務是從已知的數據中提取知識, 從而完成對新數據的識別與預測, 即應用知識. 但是, 數據本身不會給予研究者想要的答案, 大多數時候人們很難通過觀察或者簡單的計算提取有用的結論. 為了從歷史數據中整合知識, 人們提出了"模型"這一概念, 認為數據是從模型中生成的, 遵循一定的規律, 如果規律是可知的, 那麼機器從數據中學習規律就是可能的.

由於數據不會說話, 最初的模型由人們假設(assumption)而來. 下麵用大家熟知的簡單線性回歸為例, 描述一個數據生成的過程. 假設數據為\(\{(y_i,x_i)\}_{i=1}^{n}\), 其中\(x_i\)是一個向量, 描述樣本點\(i\)的特征(features). 簡單線性回歸假設所有的樣本點由下麵的模型生成:

\[y=\theta^Tx+\epsilon \]

這裡\(\theta\)是一個與\(x\)同型的向量, 代表了模型的可知部分, \(\epsilon\)是一個不可知的正態零均值隨機誤差, 方差為\(\sigma^2\). 上述模型也可以寫成下麵的概率分佈形式:

\[y\sim N(\theta^Tx,\sigma^2). \]

我們獲得了從這個模型中生成的數據集\(\{(y_i,x_i)\}_{i=1}^{n}\), 希望從中學習到關於可知部分\(\theta\)的知識, 因為知道了\(\theta\), 就可以找到數據生成的過程, 從而對任何新觀測的特征\(x_{n+1}\), 即使不能知道對應的隨機誤差, 也能夠大概瞭解標簽\(y_{n+1}\)的期望\(\mathrm{E}[y_{n+1}]\), 這就是把從歷史數據中學到的知識應用於新數據的場景.

現在的目標是儘可能準確地估計一個\(\theta\)的值\(\hat{\theta}\)得到估計模型, 因為真實的\(\theta\)是不會直接呈現給我們的, 只能從歷史數據中估計. 對於每一個估計的\(\hat{\theta}\), 得到一個估計的概率分佈\(N(\hat{\theta}^Tx,\sigma^2)\), 即我們視為數據集是從這個分佈中產生的, 在期望意義下, \(h_{\hat\theta}(x)=\mathrm{E}[N(\hat{\theta}^Tx,\sigma^2)]=\hat{\theta}^Tx\)是從這個概率分佈中抽樣最應該出現的值.

如果模型準確, \(h_\hat{\theta}(x)\)和真實數據\(y\)的差異肯定儘可能小, 因此只需要想辦法刻畫模型結果和真實數據的差異並最小化之. 對兩個在\(\mathbb{R}^{n}\)上取值的向量, 衡量其差異的方法有很多, 選擇均方誤差作為其差異的度量, 要最小化兩個向量之間的均方誤差, 意味著我們的目標(objective)是

\[\hat\theta=\min_{\hat\theta}(h_\hat\theta(x)-y)^T(h_{\hat\theta}(x)-y). \]

優化不屬於我們討論的範疇, 我們只需要知道梯度下降法可以優化這個目標函數, 得到一個\(\hat\theta\)即可. 這樣, 我們就得到了估計模型.

但是, 簡單線性回歸模型顯得過於簡單了. 如果我們想獲得一個更加有應用價值的模型, 至少有下麵幾點是可以考慮的:

  • 在數據生成機制上, 沒有任何的非線性運算元使得數據的生成機制被我們描述得過於理想化, 但過多的非線性也會增大估計難度. 因此可以考慮保留核心的線性生成部分\(\theta^Tx\), 但對結果施加一個非線性函數.
  • 模型可能不由正態分佈所生成, 可以嘗試其他分佈.
  • 我們也許感興趣的不是隨機數\(y\)本身, 而是其某種變換\(T(y)\).

考慮以上三點, 就從簡單線性回歸模型進入了廣義線性模型.

1.2 指數族

現在先考慮前兩點, 嘗試某種其他的分佈\(\mathrm{Distribution}(\eta)\), 其中核心未知參數是\(\theta^Tx\)的某個變換, 即

\[y\sim \mathrm{Distribution}(a(\theta^Tx)). \]

假定我們知道分佈的具體形式, 也獲得了數據集\((y,x)\), 那麼對於任何\(\hat{\theta}\), 如果數據來源於模型\(\mathrm{Distribution}(a(\hat\theta^Tx))\), 那麼此分佈的期望和真實數據\(y\)必定差異較小(這裡我們用"距離"來表示, 以區別於一般的作差), 也就是說我們的目標依然是

\[\min_{\hat{\theta}} \mathrm{Distance}(y,\mathrm{E}[\mathrm{Distribution}(a(\hat\theta^Tx))]). \]

在簡單線性回歸中, 距離函數被我們選擇為均方差, 現在我們且不論距離的選擇. 現在擺在面前的問題是如何計算分佈的期望, 如果有可能的話, 最簡單的期望形式必然是\(a(\theta^Tx)\)的某個映射, 這讓我們不能對所選分佈太過隨意. 有一類特殊的分佈滿足我們的需求: 指數族(exponential family). 由於指數族定義不依賴於模型, 先用\(\eta\)代替\(\theta^Tx\).

如果某個參數分佈族的密度函數滿足下麵的形式:

\[p(y;\eta)=b(y)\exp(\eta T(y)-a(\eta)), \]

就稱此分佈族是指數分佈族, 這裡\(a(\cdot)\), \(b(\cdot)\)\(T(\cdot)\)都是可微函數. 我們關註它的期望:

\[\mathrm{E}[p(y;\eta)]=\int_{\mathbb{R}}yp(y;\eta)\mathrm{d}y=\int_{\mathbb{R}} yb(y)\exp(\eta T(y)-a(\eta))\mathrm{d}y, \]

直接求期望較困難, 註意到對分佈族中的任意概率分佈, 密度函數的積分為\(1\), 因此我們可以嘗試將指數族密度函數的積分對參數\(\eta\)求導, 其導數值應恆為\(0\). 指數族積分和求導可交換, 為計算提供了便利([2]中給出了不使用可交換性條件下的證明):

\[\begin{aligned} \frac{\partial }{\partial \eta}\int_{\mathbb{R}} p(y;\eta)\mathrm{d}y&=\int_{\mathbb{R}}\frac{\partial b(y)\exp(\eta T(y)-a(\eta))}{\partial \eta}\mathrm{d}y\\ &=\int_{\mathbb{R}}(T(y)-a'(\eta))b(y)\exp(\eta T(y)-a(\eta))\mathrm{d}y\\ &=T(\mathrm{E}[p(y;\eta)])-a'(\eta)\\ &=0, \end{aligned} \]

這樣我們求出了\(\mathrm{E}[p(y;\eta)]\)的一個變換的值, 如果\(T(\cdot)\)是可逆函數, 那麼\(\mathrm{E}[p(y;\eta)]=T^{-1}(a'(\eta))\); 特別地如果\(T(\cdot)\)是恆等變換, 那麼\(\mathrm{E}[p(y;\eta)]=a'(\eta)\). 這裡我們得到了指數族的期望, 證明指數族正是我們所關註的分佈族.

現在回到機器學習任務上, 假如我們選擇的分佈是指數族分佈\(\mathrm{ExponentialFamily}(\theta^Tx)\), 並取\(T(\cdot)\)為恆等映射, 那麼根據在簡單線性回歸一節中所討論的, 我們只需要:

  • 對每一個估計的\({\theta}\), 代入指數族中, 得到期望觀測向量\(a'(\theta^Tx)\).
  • 選擇一個合適的距離函數, 最小化\(\mathrm{Distance}(a'(\theta^Tx),y)\).
  • 如果最小化由迭代完成, 就重覆上述兩個步驟; 否則用其他方式最小化.

1.3 廣義線性回歸實例

現在回顧簡單線性回歸模型, 由\(N(\theta^Tx,\sigma^2)\)也就是\(N(\eta,\sigma^2)\)生成, 我們考慮將正態分佈化為指數族的形式:

\[p(y;\eta)=\frac{1}{\sqrt{2\pi\sigma^2}}\exp\left(-\frac{y^2-2\eta y+\eta^2}{2\sigma^2} \right)=\frac{\exp(-\frac{y^2}{2\sigma^2})}{\sqrt{2\pi\sigma^2}}\cdot\exp\left(\frac{\eta\cdot y-\eta^2}{\sigma^2} \right), \]

這裡存在另一個參數\(\sigma^2\), 這關係到指數族一個更廣泛的形式:

\[p(y;\eta,\tau)=b(y,\tau)\exp\left(\frac{\eta^TT(y)-a(\eta)}{c(\tau)} \right). \]

這裡\(\eta=\theta^Tx\)是向量, \(\theta\)是參數矩陣, \(T(y)\)是一個向量函數, 這種表述下文還會提到. 上式中\(\tau\)稱為擴散繫數, 也就是正態分佈中的\(\sigma^2\). 另外, 指數分佈族中包含眾多分佈: 正態分佈, 兩點分佈, 二項分佈, 泊松分佈, Gamma分佈等.

以兩點分佈\(B(1,p)\)為例, 它常常被視為二分類任務的生成模型. 要註意不能直接用\(\eta\)替換\(p\), 至少因為\(p\)的取值範圍只有\([0,1]\)\(\eta=\theta^Tx\in\mathbb{R}\), 具體\(\eta\)應該如何表現還應當先將兩點分佈的概率函數(在這裡為分佈列)改寫為指數族的形式.

\[p(y;p)=p^{y}(1-p)^{1-y}=\exp\left(y\log p+(1-y)\log(1-p) \right)=\exp\left(y\cdot\log\frac{p}{1-p}+\log(1-p) \right). \]

這個密度形式與指數族的標準形式不同, 但只要施加變換

\[\eta=\log\frac{p}{1-p}, \]

同時有

\[p=\frac{e^{\eta}}{1+e^\eta}, \]

就可以把密度變為

\[p(y;p)=\tilde p(y;\eta)=\exp\left(y\cdot\eta-\log(1+e^{\eta}) \right), \]

變成指數族標準形式, 且\(a(\eta)=\log(1+e^{\eta})\). 對比前面給出的結論, 從\(B(1,p)\)中抽出的樣本\(y\)應當與\(a'(\eta)\)一致, 即最小化

\[\mathrm{Distance}(y,a'(\eta))=\mathrm{Distance}\left(y,\frac{e^{\theta^Tx}}{1+e^{\theta^Tx}} \right)=\mathrm{Distance}\left(y,\mathrm{sigmoid}(\theta^Tx) \right). \]

這就是二分類器中, 用線性函數sigmoid變換作概率估計的由來. 同時, 對分類問題, 儘管均方差用作距離函數依然是可行的, 但梯度下降中均方差表現不好, 因此我們往往使用交叉熵函數作距離度量(原因這裡不談):

\[\mathrm{CrossEntropy}(y,\hat y)=-\sum_{i=1}^{n}y_i\log_2 \hat{y}_i. \]

最後, 回到上文我們提到的\(\theta\)為參數矩陣的情況, 此時對應的分佈族是多項分佈\(B(1;p)\), 其中\(p=(p_1,\cdots,p_k)'\), 每次生成一個單位向量\(y=(y_1,\cdots,y_k)\)其中有且僅有一個分量\(y_i=1\)(以概率\(p_i\)), 其餘分量為\(0\), , 它常常被認為是多分類任務的生成模型.

嘗試寫出多項分佈的概率函數, 註意, 一個生成\(k\)維向量的多項分佈中, 未知參數只有\(k-1\)個, 這是因為\(\sum_ip_i=1\)\(\sum_iy_i=1\).

\[\begin{aligned} p(y;p)&=p_1^{y_1}p_2^{y_2}\cdots p_k^{y_k} \\ &=\exp\left(\sum_{i=1}^{k-1}y_i\ln p_i+\left(1-\sum_{i=1}^{k-1}y_i \right)\ln\left(1-\sum_{i=1}^{k-1}p_i \right) \right)\\ &=\exp \left(\sum_{i=1}^{k-1}y_i\ln\frac{p_i}{1-\sum_{i=1}^{k-1}p_i}+\ln\left(1-\sum_{i=1}^{k-1}p_i \right) \right) \end{aligned} \]

至此, 令

\[\eta=\left(\ln\frac{p_1}{p_k},\cdots,\ln\frac{p_{k-1}}{p_k},0 \right), \]

可得\(p_i=p_ke^{\eta}(i=1,\cdots,k-1)\), 結合\(\sum_ip_i=1\)可得

\[p=\left(\frac{e^{\eta_1}}{1+\sum_{i=1}^{k-1}e^{\eta_i}},\cdots,\frac{e^{\eta_{k-1}}}{1+\sum_{i=1}^{k-1}e^{\eta_i}},\frac{1}{1+\sum_{i=1}^{k-1}e^{\eta_i}} \right), \]

上面兩個繁瑣的式子實際上就是\(\eta_i=\ln(p_{k-1}/p_k)\)以及\(p_i=e^{\eta_i}/\sum_je^{\eta_j}\). 此時密度函數為

\[p(y;p)=\tilde p(y;\eta)=\exp\left(y^T\eta-\ln \left(\frac{e^{\eta_k}}{\sum_{i=1}^{k}e^{\eta_i}} \right)\right):=\exp(y^T\eta-a(\eta)) \]

這裡\(a'(\eta)\)就是對其每個分量求導, 即

\[a'(\eta)=\begin{bmatrix} \frac{e^{\eta_1}}{\sum_i e^{\eta_i}} \\ \vdots \\ \frac{e^{\eta_k}}{\sum_{i}e^{\eta_k}} \end{bmatrix}=\begin{bmatrix} \frac{\exp(\theta_1^Tx)}{\sum_i\exp(\theta_i^Tx)}\\ \vdots \\ \frac{\exp(\theta_k^Tx)}{\sum_i\exp(\theta_i^Tx)} \end{bmatrix}. \]

此時\(\theta\)是參數矩陣, \(\theta_i\)代表矩陣的第\(i\)列.

1.4 廣義線性模型代碼

statsmodels庫中提供了單參數指數族對應的廣義線性模型. 以下假設我們有一個從泊松分佈中生成的模型, 這裡先驗證泊松分佈族是指數族.

\[p(y;\lambda)=\frac{\lambda^y}{y!}e^{-\lambda}=\frac{1}{y!}\exp(y\log \lambda-\lambda)\xlongequal{\eta=\log\lambda}\frac{1}{y!}\exp(y\eta-e^{\eta}), \]

也即數據從\(P(e^{\theta^Tx})\)中生成, 生成數據的期望為\(a'(\eta)=e^{\eta}=e^{\theta^Tx}\). 現在我們先生成數據. 假設\(x\)是三維數據, \(\theta=(1, 2, 5)^T\).

import numpy as np
import statsmodels.api as sm
np.random.seed(2000)

## Generate data from poisson distribution

theta = np.array([1, 2, 5])
x = np.random.normal(size=(100, 3))
y = np.random.poisson(lam=np.exp(np.dot(x, theta))) + np.random.normal(scale=1, size=(100,))

註意, GLM()函數是不會自己添加截距項的, 這裡簡化處理, 我們也認為模型不含截距項. 因為是泊松分佈族生成的數據, 因此要選擇分佈族為Poisson().

glm = sm.GLM(y, x, family = sm.families.Poisson())
res = glm.fit()
print(res.summary())

得到的結果為\(\hat{\theta}=(0.9964,1.9946,5.0010)'\), 非常接近真實值.

GLM()函數中可以設定聯結函數(link function), 每一個分佈族會自帶預設的聯結函數, 這個函數就是連接分佈參數\(\lambda\)和自然參數\(\eta=\theta^Tx\)的函數, 本例中為\(\log\), 因為\(\eta=\log\lambda\). 有關聯結函數的更多信息, 可參考[3].

Reference

[1] https://cs229.stanford.edu/notes2021fall/cs229-notes1.pdf

[2] https://xg1990.com/blog/archives/304

[3] https://www.statsmodels.org/stable/glm.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2.HelloSpring 思考問題? Hello對象是誰創建的? Hello對象是由Spring設置的 Hello 對象的屬性是怎麼設置的? Hello 對象的屬性是Spring容器設置的 這個過程就叫控制反轉 控制:誰來控制對象的創建,傳統應用程式的對象是由程式本身控制創建的,使用Spring後 ...
  • 哈嘍大家好 今天給大家分享一個用Python開發一款飛翔的小鳥游戲。 飛翔的小鳥(游戲英文名:Flappy Bird) 一款由越南獨立開發者開發的手機游戲,是之前非常流行的一款手機游戲 小游戲目標:讓小鳥穿過管子,不要碰到任何物體,挑戰更遠距離 今天,就讓我們一起用python來複刻一下這款游戲吧! ...
  • SpringBoot 文件上傳+攔截器 文件上傳原理 表單的enctype屬性規定在發送到伺服器之前應該如何對錶單數據進行編碼。 當表單的enctype="application/x-www-form-urlencoded"(預設)時,form表單中的數據格式為:key=value&key=valu ...
  • 我可以明確地回答.我們之所以選擇Postgres,是因為它在操作上比MySQL更可靠,而當時公司的創始人相信SQL資料庫的可移植性. 隨著年份的發展,我們發現了這一點,我們發現基本上,Postgres是Rough中的這款鑽石,它具有一系列功能和一個開發社區,這是我們見過的最不可思議的開源項目之一,並 ...
  • Lua語言線上運行編譯,是一款可線上編程編輯器,在編輯器上輸入Lua語言代碼,點擊運行,可線上編譯運行Lua語言,Lua語言代碼線上運行調試,Lua語言線上編譯,可快速線上測試您的Lua語言代碼,線上編譯Lua語言代碼發現是否存在錯誤,如果代碼測試通過,將會輸出編譯後的結果。 該線上工具由IT寶庫提 ...
  • 3.0版本以前listener中拋出的所有異常都會被easyexcel捕獲,並且包裝成ExcelAnalysisException,寫法如下: private void parseXmlSource(InputStream inputStream, ContentHandler handler) { ...
  • 直觀的界面、出色的計算功能和圖表工具,使Excel成為最流行的個人電腦數據處理軟體。在獨立的數據包含的信息量太少,而過多的數據又難以理清頭緒時,製作成表格是數據管理的最有效手段之一。這樣不僅可以方便整理數據,還可以方便我們查找和應用數據。後期我們還可以對具有相似表格框架,相同性質的數據進行合併彙總... ...
  • 作者:張飛洪 來源:www.cnblogs.com/jackyfei/p/13862607.html 離職的心態 人們在辭退或者被辭退都會對原公司抱有意見,因為疫情,公司業務告急,工資發不出來,我也失去了工作。雖然情緒上難免會有波動,但是轉念一想,我應該用開心的心態來看待這次辭職,並希望能快速翻過這 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...