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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++2个三维向量求角度差_交叉学科入门指南(2)——线性回归

發布時間:2024/10/8 c/c++ 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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"。
L = len(data) One = np.ones(L) data['One'] = One # 構造一個全為1的向量并附加到最后一列
  • 分離輸入中的和。從輸入數據中,提取需要的屬性組成矩陣(不要漏了One這一列),將預測目標提取為向量。
X = data[['屬性1', ..., '屬性n', 'One']].values # 所需的矩陣XY = data['預測目標'].values # 預測對象Yreturn X, Y
  • 使用、、作為輸入,得到算法輸出。直接套用公式即可。
def Regression(X, Y, c=0): # 此處的c就是嶺回歸中的懲罰參數,默認為0m, n = X.shape # X的行數和列數Xt = np.transpose(X)XtX = np.linalg.inv(np.dot(Xt, X) + c * np.identity(n)) # 計算(XtX+cI)^-1XtX = np.dot(XtX, Xt)omega = np.dot(XtX, Y) # 完全按照公式計算出線性回歸參數,并返回return omega
  • 使用得到的參數預測。若輸入為,則先在后面加一列“1",再返回。
def Predict(x, omega): # 使用得到的參數omega,為新的數據點x預測y的值x = np.concatenate([x, np.array([1])]) # 為新的數據點后面加一列"1"return np.dot(x, omega)

數據分析實戰

這章給出的數據集是某世界一流大學7102屆數學院大一學生的百分制成績,含:數學分析,高等代數,代數與幾何基礎,學術英語,體育。預測目標為每位同學的平均學分績。

P.S. 由于7102屆的學生績點使用五分制等級,實際上每門課的成績都有一個不可觀測的隱變量,即按照閾值劃分的成績等級,完整數據生成流程可參見“成績單(完整版).csv”。

  • 首先提取數據中的有效成分和:
def XY_Split(data): # 將數據中的X,Y分離為矩陣/向量并返回X = data[['數學分析', '高等代數', '學術英語', '體育', '代數與幾何基礎', 'One']].values # 所需的矩陣XY = data['均績'].values # 預測對象Y,即均績return X, Y
  • 之后直接調用先前編寫的接口:
omega = Regression(X, Y, c = 0.2)
  • 使用模型預測新樣本點。此處我造了一份成績:(98,96,84,77,92)。
x = np.array([98, 96, 84, 77, 92])print(Predict(x, omega))

預測結果為4.945。而通過隱變量計算,得到的真實績點應為4.82,差距不小。是選用算法不行么?還是需要再調調參?給大家留下一個思考題:如何修正算法或調整數據集,改善這個模型的算法效果。感興趣的同學們可以編寫代碼,以驗證你的猜想。

課后習題

理論習題

  • 我之前故意沒給出線性映射的正式定義,因為一正經起來就不直觀,也不好理解了。現在給定線性映射的定義:若映射保持加法和數乘運算:
  • 則稱

    為線性映射。試驗證之前給出的和都是線性映射。
  • 維向量空間中,是一組線性無關的向量,試證明任意一個維向量都能用線性表示。這個結論告訴我們,線性空間的維數是由線性無關向量的最多個數(極大線性無關組)決定的。
  • 我采用矩陣寫法和矩陣形式求導純粹是因為最終結果超級好看。對初學者來說,求解這個優化問題遠沒我寫的那么復雜。嘗試以

    為變元,對作無約束優化,將線性回歸的求解用自己的語言描述。
  • 嘗試自己使用矩陣微積分或無約束優化的知識,求解嶺回歸問題:

  • 上機操練


  • 使用“世一大歷年錄取分數線”數據集,根據2018年所有省份的一本線、錄取難度、同專業全國招生人數、本專業錄取人數這四個特征,設計線性回歸模型,以預測2019年浙江省各專業錄取分數,并和實際分數線比較,以對算法作出評價。任務說明如下:
  • (1)錄取難度:由于錄取難度與招生總人數成反比,與最低錄取分數線成正比,但不能用純分數線刻畫(如江蘇和海南的高考總分不是750),應該用分數線和總分的比值來衡量。因此,設錄取難度為

    ,該省招生總人數為,最低錄取分數線的線差(減去本省一本線)與總分之比為,則定義

    其中系數

    是使得總分落入區間的標準化向量。具體實現方法是先將所有省份的計算出來,再減去最小值,之后除以最大值。錄取難度越接近,表示該省越難考進世一大。

    (2)題意:既然給定了這四個特征,那么我們的目的就是將錄取分數表示為它們的線性組合。任務中每一個省份的每一個專業都構成一條樣本,同一省份的各個專業共享參數“一本線、錄取難度”,同一專業的各個省份共享參數“同專業全國招生人數”。明確了這點,整理數據集就有頭緒了。

    (3)預測目標是19年浙江省的錄取分數線。在19年數據未知的情形下,如何估計同專業全國招生人數、錄取難度和本專業錄取人數是一個值得仔細思考的問題。


  • 使用“FIFA球員現實信息”數據集,利用能力、潛力、身價、周薪、國際聲譽、逆足能力、花式技巧這些特征,建立線性回歸模型,預測每一位球員的關注度。任務說明如下:
  • (1)建議的訓練模式:七三開,用隨機抽取的

    數據訓練,用另外數據作測試,以評估算法。

    (2)數據標準化:周薪、身價、國際聲譽這些特征的數據尺度完全不一樣,需要將它們調整一下,使得數據尺度接近,這樣算法效果會更好哦~

    總結

    以上是生活随笔為你收集整理的c++2个三维向量求角度差_交叉学科入门指南(2)——线性回归的全部內容,希望文章能夠幫你解決所遇到的問題。

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