c++2个三维向量求角度差_交叉学科入门指南(2)——线性回归
本文使用 Zhihu On VSCode 創作并發布
由于上一章的內容主要圍繞編程實戰展開(現在還在整合原稿第一章和附錄,敬請期待),也就是說,這一章才是魔鬼數學的開始。
為什么把“線性回歸”作為整個專欄的第一篇呢?因為“線性”(Linear)是我們從小學開始就不停接觸的性質之一,到了大學仍然是重中之重,甚至絕大多數理工科都有一門名為“線性代數”(Linear Algebra)的必修課,其魔鬼版本“高等代數”更是和數學分析共同作為整個專業課的基石之一。
同時,線性函數(Linear Function)是最簡單的一種函數,同時具有十分優異的性質,比如涉及參數極少、既是凹函數又是凸函數等。因此線性函數對入門者來說,是一個非常好的切入角度。
為了大家能對線性函數的本質有更深刻的理解,十分有必要在進入正題前,談談什么是線性性質。
注:什么是回歸我就不多講了吧,實在不知道的話請溫習本專欄的置頂文章“數學與交叉學科簡介”。
預備篇:線性函數
線性函數——直線、平面與超平面
我們不妨回憶一下,從小到大學了多少和線性函數有關的知識:
小學:正比例和反比例,指出若
始終是的倍數,則和是正比例關系。初中:七年級引入函數后,指出線性函數的解析式為
,在平面直角坐標系下是一條直線。高中:在立體幾何中,指出
代表空間內的平面。
憑借這些定義,我們可以合理外推:在平面直角坐標系下,給定一組
,便可唯一確定一條直線;三維空間中,給定一組,并可唯一確定一個平面。換言之,若在維向量空間中,給定一組,可以唯一確定一個超平面當
時,這個超平面恰好經過原點。這就是線性函數的精髓所在:在表達式中,只有對分量的數乘運算,以及整合各分量的加法運算。換言之,線性函數就是只有加法和數乘的函數,線性性質就是圍繞加法和數乘展開的性質。上述公式反映了線性函數最本質的特征,代表了一類具有線性性質的所有函數。顯然,這個公式囊括了二維、三維以及更高維數的情況,因此在之后提到線性函數時,不必特指空間的維數。
線性組合——基與線性相關性
我們再把目光聚焦在線性函數的圖像上。在二維平面上,定義
,得到的圖像是一維的直線;在三維空間上,定義,得到的圖像是二維的平面。那三維空間里的一維直線長啥樣呢?空間解析幾何告訴我們,選定初始點和方向,空間中的直線可用如下參數方程表示:或者用一種更帥氣的寫法:
觀察上面給出的幾個實例,相信大家都能發現規律:當所有分量都能用某些變量表示時,變量的個數直接決定了得到圖像的維數。比如空間直線只有一個變量
,就是一維的;空間平面有兩個變量和,就是二維的。由于這種表示方式都只涉及變量的加法和數乘,因此我們將其稱為線性表示。繼續考慮二維平面上的線性組合:
之前說了,這條直線上的每一點都肯定符合此方程。如果要讓平面上的所有點都符合此方程,又該如何是好呢?首先
一定要是,因為原點得符合此方程;其次也得是,因為得符合此方程;同理可得到。也就是說,如果要讓平面上的所有點符合,必須得有!我們繼續把這個結論合理外推到有限維向量空間
,這里就直接代入原點,把去掉:如果要讓空間內所有點都滿足這個方程,首先代入
,得到;代入,得到;;代入,得到。這樣就得到了最終結論:維空間中的所有點均滿足上述方程當且僅當。反映到幾何直觀上,如果高維空間上的一個點集能和低維的超平面
(不全為零)建立聯系,比如二維平面中所有點都在同一直線上,三維空間中所有點都在同一平面上,那么它們之間就存在線性的關系,即在該點集上線性相關;反之,若當且僅當,那么這個點集上就不存在線性關系,即它們線性無關。這時候,各分量大致是這樣的:不存在線性關系時的各分量我們用的
是什么呢?時,它們就是軸和軸上的單位向量;時,它們分別是軸、軸和軸上的單位向量。我們可以把任意一個維向量表示為,那么很自然地有:當且僅當
。按照上面的定義,可以類似地稱向量線性無關。這時候,稱為維空間上的一組基,因為以它們為基礎,能任意地表示上的任何向量:實際上,在
空間上遠不止這一組基。比方說,在平面上,隨便把平面直角坐標系轉一下,照樣能用它表示所有點。學到深處你們就知道,兩組基之間其實就差了一個可逆的方陣,而且任何一組基都可以通過Shimidt正交化,轉化為一組相互垂直(正交)的基。但再深入下去能拓展開一整本《高等代數》,作為線性回歸的鋪墊,明白這一組自然正交基和線性相關的定義已經完全足夠,故在此不繼續展開了。線性映射
維空間上的維超平面確立了一個從
空間到實數域的線性映射。若用向量形式改寫之:則這個線性映射有相當簡單的形式
。那如何建立到之間的線性映射呢? 如果把列向量的每一個分量分別用線性映射表示,那么此時等式左邊是
維向量,等式右邊則是一個矩陣和列向量的乘積。因此這個映射又可以寫作是不是感覺整個世界都清爽了?也就是說,線性映射就可以和矩陣對等起來,這在高等代數(2)里有更深入的闡述。如果面對更復雜的情況,比如需要擬合的回歸變量不止一個,那就可以用上
。一般情況下,我們只擬合一個因變量,所以建模時只用線性函數就足夠了~線性回歸模型的建立
注:通常用向量下標
表示第個樣本,標量下標表示第個特征分量,它們同時出現時,代表第個樣本的第個特征分量。如果手機端無法正常顯示加粗,請轉戰電腦端。隨便來一個數據集,特征為
,因變量為,它們絕大部分時候不存在絕對的線性關系。這也沒辦法,畢竟線性關系實在太理想化了。那么我們就想到:能不能在誤差盡可能小的情況下,給它們強加一個線性關系呢?我們先前講到,一個線性函數就是形如
的函數,希望控制的取值,使得線性函數的輸出與真實值盡可能接近。如何刻畫它們的距離呢?假設第個樣本的真實值為,預測結果為,有一種很常用的方法就是最小二乘法,即把所有的平方距離相加:這種誤差標準下,我們的目標就是選取
使得最小。用最通用的優化問題寫法,我們得到優化問題的求解
多元函數求導:梯度與雅可比矩陣
想必大家都對一元函數求導
不陌生。而我們知道,多元函數對每一個分量都有一個偏導數。將它們組合為列向量,我們可以得到其中
代表,下同。這么表示不僅僅是簡單地將偏導數堆積,借助梯度我們可以求任意方向上的方向導數: 將方向用單位列向量表示,則函數在該方向上的方向導數為由向量內積的柯西-施瓦茨不等式,
,當且僅當和方向一致時相等。因此可以得到一條重要結論:梯度方向是函數增加最快的方向,這也是后續梯度下降等迭代優化算法的理論基礎。如果將求偏導的操作再抽象一下,即引入Nabla算子
則梯度又可以用
表示。這么表示在場論里有莫大的好處,比如散度就可以直接寫成,旋度可以直接寫成。但這里只用到梯度,再往下展開就扯偏了,所以到此為止吧。現在我們已經把多元函數的導數摸清了,且求多元函數的導數,就等同于求
的梯度向量。我們將其合理外推到更一般的情況,即到的映射。顯然對于輸出,每一個分量都可以用元函數表示。還記得我們之前怎么把線性函數外推到線性映射的么?我們接下來要做的是: 超級拼裝!將每一個分量的梯度向量按行拼裝為矩陣,則我們可以得到這樣一個矩陣,稱為雅可比矩陣(Jacobian):
之后讓我們用
表示雅可比矩陣。和多元函數類似,雅可比矩陣就可以代表一個映射的導數了。因此,后文中的“求導”均代指求梯度向量/雅可比矩陣。對線性函數求導
考慮關于
的線性函數。直接用梯度向量的定義可知,,即的導數就是。對線性映射求導
考慮關于
的線性映射,其中為維向量。將線性映射關于拆分:一眼就可以看出,雅可比矩陣的第
行第列元素就是。換言之,對線性映射求導的結果就是矩陣。對二次型求導
考慮關于
的二次型,此時為實對稱矩陣。在二次型中,的系數為,的系數為。 因此第個梯度分量這正好是
的第個行向量和的矩陣乘積。因此將所有分量拼裝為梯度向量后,我們有至此,我們已經有了充足的矩陣微積分知識儲備,接下來就是干掉線性回歸問題的時候了!
利用矩陣微積分求解線性回歸
假設數據集給出
個樣本,每個樣本含有個特征。為表述方便,將樣本信息統一轉化為矩陣形式則優化目標又可表示為
其中利用了向量范數的等價形式
以為唯一主元,將展開整理:其中
相對而言是常數,為線性函數,為二次型。對上式求導:令導數為
,得到參數的最小二乘估計:注:整個求解過程都看不懂也無大礙!只要記住本公式,并記下矩陣
的形式,照樣可以接著往下展開。直接對作無約束優化,推導過程比這間便多了,但結果不好看,詳見文末理論習題3。如何進一步改善性能
到目前為止,我們僅僅是按照最理想的形式構造線性關系。但是數據集中存在太多不確定因素,真實的數據集很有可能長得奇形怪狀,比如存在一個離群值:
離群值:跟我比,在座的各位都是弟弟這一個離群值直接把整個擬合結果帶跑偏了。因為平方距離受離群值的干擾很大(就比如
可以毫無壓力地干掉個),所以擬合出的直線必須遷就于這個離群值,這就導致線性回歸的擬合結果很差。此外,最小二乘估計式中,涉及到大規模矩陣乘法,更要命的是還有矩陣逆運算。一旦矩陣規模變得非常大,或者
接近于一個奇異矩陣,的估計值很有可能會失控。至此,我們把影響擬合結果的兩大誘因總結如下:太大,離群值讓結果炸;太大,矩陣乘法裝不下。
為了應對上述現象,一種可行的方法就是引入正則化方法(Regularization),通過向損失函數
中加入模型參數的范數實現,通常能大大提升線性回歸算法的精確度。常用的有以下兩種:(1)嶺回歸(Ridge Regression): 將參數的
范數引入目標函數:可解得
其中
是自定義參數,我一般會取0.1或0.2。參數越大,得到的參數越接近0,需要根據擬合效果調參。新的估計值能抑制參數的大小,以防止過擬合。(2)Lasso回歸:將參數的
范數引入目標函數:其中
。該方法無解析解,需要用數值逼近近似求解。LASSO的好處是,參數解比嶺回歸更稀疏。大家可以思考一下,往目標函數里塞入參數向量
的長度,為什么就能解決上述問題?提示:針對導致算法性能下降的兩大因素分析。實戰操練
在本章的實踐環節中,我們一起編寫一個嶺回歸模型。當內置參數
時,嶺回歸模型恰好退化為普通線性回歸,故不贅述線性回歸模型的寫法。嶺回歸的算法接口為:
def Regression(X, Y, c=0)其中矩陣
、的定義與推導過程一致,即嶺回歸參數。數據預處理與算法設計
當接受輸入的pandas.DataFrame對象時,首先將其轉化為需要的算法輸入X。
- 構建一個全1向量,附加到數據表data的最后一列,屬性名為"One"。
- 分離輸入中的和。從輸入數據中,提取需要的屬性組成矩陣(不要漏了One這一列),將預測目標提取為向量。
- 使用、、作為輸入,得到算法輸出。直接套用公式即可。
- 使用得到的參數預測。若輸入為,則先在后面加一列“1",再返回。
數據分析實戰
這章給出的數據集是某世界一流大學7102屆數學院大一學生的百分制成績,含:數學分析,高等代數,代數與幾何基礎,學術英語,體育。預測目標為每位同學的平均學分績。
P.S. 由于7102屆的學生績點使用五分制等級,實際上每門課的成績都有一個不可觀測的隱變量,即按照閾值劃分的成績等級,完整數據生成流程可參見“成績單(完整版).csv”。
- 首先提取數據中的有效成分和:
- 之后直接調用先前編寫的接口:
- 使用模型預測新樣本點。此處我造了一份成績:(98,96,84,77,92)。
預測結果為4.945。而通過隱變量計算,得到的真實績點應為4.82,差距不小。是選用算法不行么?還是需要再調調參?給大家留下一個思考題:如何修正算法或調整數據集,改善這個模型的算法效果。感興趣的同學們可以編寫代碼,以驗證你的猜想。
課后習題
理論習題
則稱
為線性映射。試驗證之前給出的和都是線性映射。若
維向量空間中,是一組線性無關的向量,試證明任意一個維向量都能用線性表示。這個結論告訴我們,線性空間的維數是由線性無關向量的最多個數(極大線性無關組)決定的。我采用矩陣寫法和矩陣形式求導純粹是因為最終結果超級好看。對初學者來說,求解這個優化問題遠沒我寫的那么復雜。嘗試以
為變元,對作無約束優化,將線性回歸的求解用自己的語言描述。嘗試自己使用矩陣微積分或無約束優化的知識,求解嶺回歸問題:
上機操練
(1)錄取難度:由于錄取難度與招生總人數成反比,與最低錄取分數線成正比,但不能用純分數線刻畫(如江蘇和海南的高考總分不是750),應該用分數線和總分的比值來衡量。因此,設錄取難度為
,該省招生總人數為,最低錄取分數線的線差(減去本省一本線)與總分之比為,則定義其中系數
是使得總分落入區間的標準化向量。具體實現方法是先將所有省份的計算出來,再減去最小值,之后除以最大值。錄取難度越接近,表示該省越難考進世一大。(2)題意:既然給定了這四個特征,那么我們的目的就是將錄取分數表示為它們的線性組合。任務中每一個省份的每一個專業都構成一條樣本,同一省份的各個專業共享參數“一本線、錄取難度”,同一專業的各個省份共享參數“同專業全國招生人數”。明確了這點,整理數據集就有頭緒了。
(3)預測目標是19年浙江省的錄取分數線。在19年數據未知的情形下,如何估計同專業全國招生人數、錄取難度和本專業錄取人數是一個值得仔細思考的問題。
(1)建議的訓練模式:七三開,用隨機抽取的
數據訓練,用另外數據作測試,以評估算法。(2)數據標準化:周薪、身價、國際聲譽這些特征的數據尺度完全不一樣,需要將它們調整一下,使得數據尺度接近,這樣算法效果會更好哦~
總結
以上是生活随笔為你收集整理的c++2个三维向量求角度差_交叉学科入门指南(2)——线性回归的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python连接池原理_python r
- 下一篇: python中def fun(a、b=2