遠處有一座大樓,小明想要測量大樓的高度,他想到了一個好辦法:
小明找到一根長度是y1的木棍插在地上,當他趴在 A點時,木棍的頂端正好遮住樓頂,此時他記錄下自己的觀察點到木棍的距離x1 。之后小明又找到另一個長度是y2的木棍,用同樣的方法再觀察一次,這次記錄的數值是 x2。由於測量時存在誤差,因此 x1/y1≠x2/y2,現在小明可以通過相似三角形可以建立起一個有唯一解的方程組:
小明的兩次觀測數據是x1=1.061,y1=1.310,x2=1.094,y2=1.350。為了便於使用計算機計算,小明用矩陣表示方程組:
這相當於把方程組轉換為Ax=b的線性形式,進而求得 x=A-1b:
1 import numpy as np 2 x1, y1 = 1.061, 1.310 3 x2, y2 = 1.094, 1.350 4 A = np.mat(np.array([[-y1, x1], [-y2, x2]])) 5 b = np.mat(np.array([x1 * y1, x2 * y2])).T 6 x = A.I * b 7 print(x)
結果是 x≈58.77,y≈73.87。
幾天后,為了在同學面前炫耀,小明又去測量了一次。因為工具粗糙且視角略有差別,這次的數據是x3=1.143,y3=1.410,x4=0.922,y4=1.140 ,得到的結果是x≈94.85,y≈118.41 ,這可與之前的結果相差很大。於是小明繼續測量,算上前幾天的2組數據,小明一共記錄了8組數據:
這下可壞了,任意兩組數據都能得到唯一解,任意三組數據都無解!怎么辦呢?
最小二乘法
常規的方法無法回答小明的問題,幸好高斯老爺子發現了最小二乘法。最小二乘法(又稱最小平方法)是一種通過最小化誤差的平方和,尋找數據最佳函數匹配的優化策略。
微積分視角
由於測量大樓時存在誤差,所以每次計算結果都是大樓高度的近似值,這就導致8次測量的數據實際上構成了一個大型的約等方程組:
現在的問題是,約等方程組不能按照直等方程組的方法求解。對此,我們的解決思路是尋找到一組x 和y ,使得方程組中所有方程的左右兩側都盡最大可能相等。在進一步解釋前,先將約等方程組轉換成熟悉的線性形式:
大樓就在那里,它的高度是固定不變的。既然每次測量都存在誤差,那么y的真實值實際上是計算值加誤差:
我們的目標是尋找一組合適的x 和y ,使得所有方程中的誤差都盡可能小,這相當於讓總體的誤差最小:
誤差有正有負,將負號去掉的方式有兩種,取誤差的絕對值或取誤差的平方,顯然平方比絕對值更簡單,因此先將各項取平方后再嘗試找出最小值:
上式就是最小二乘法的公式,其中ai 和 bi是已知的,表示約等方程組中第 個方程的相關系數。如果把 J 展開,就可以直觀地看出它表達的含義:
最小二乘法作為一種策略,並未指出具體的求解方案。由於極值通常出現在臨界點上,所以一種可行的方案是通過尋找臨界點(也就是 J 的偏導等於0的點)求解。
這個看上去有點嚇人的求導其實很簡單:
以展開式的第一項為例:
展開式的每一項都將得到類似的結果,由此我們將得到一個新的方程組:
這里需要抑制住沖動,方程組中的兩個方程都是和式運算,每一項的ai都不同,因此第一個方程的等式兩側不能除以 ai,即不能使用下式:
現在有兩個方程,兩個未知數,可以求得唯一一組解。
已經知道了ai和bi ,可以計算出方程組的解:
import numpy as np x = np.array([1.061, 1.094, 1.143, 0.922, 1.110, 1.156, 1.123, 1.020]) y = np.array([1.310, 1.350, 1.410, 1.140, 1.370, 1.425, 1.385, 1.260]) a = y / x b = y p1 = np.sum(a ** 2) p2 = np.sum(a) p3 = np.sum(a * b) q1 = p2 q2 = np.sum(b) A = np.mat(np.array([[p1, -p2], [q1, -np.alen(x)]])) b = np.mat(np.array([-p3, -q2])).T x = A.I * b print(x)
線性代數視角
從微積分的視角來看,最小二乘法相當於求解約等方程組,那么最小二乘法的線性代數視角又是什么呢?
先來看向量的投影:
b,p,e 是3個向量,其中p是b 在平面上的投影, e是b和p 的誤差向量,e=b-p 。平面可以看作二維向量張成的向量空間,p 在該空間上。將向量投影到向量空間有什么意義呢?這要從方程 Ax=b 說起。
小明根據測量結果得到了一個方程組,並將它進一步化簡為矩陣的形式:
對於小明的數據來說, Ax=b無解,實際上大多數這種類型的方程都無解。 A的列空間的含義是方程組有解時b 的取值空間,當b 不在 A的列空間時,方程無解。具體來說,當A 是行數大於列數的長方矩陣時,意味着方程組中的方程數大於未知數的個數,此時肯定無解。
雖然方程無解,但我們還是希望能夠運算下去,這就需要換個思路——不追求可解,轉而尋找最能接近問題的解。對於無解方程Ax=b 來說,Ax 總是在列空間上(因為列空間本來就是由 Ax確定的,和b 無關),而 b就不一定了,所以需要微調 ,將p 調整至列空間中最接近它的一個,此時Ax=b 變成了:
p就是 b在 A的列空間上的投影, x上加一個小帽子表示x 的估計值。當然,因為方程無解,所以本來也不可能有 Ax=b。此時問題轉換為尋找最好的估計值 ,使它盡可能滿足原方程:
在上圖中,A的秩是2,平面表示A的列空間,平面上的向量有無數個,其中最接近b 的當然是b 在平面上的投影,因為只有在這時 b-p 才能產生模最小的誤差向量。
如何求得估計值呢?
在小明的測量數據中,A的列空間是一個超平面,A的兩個列向量都在這個超平面上,b和p 的誤差向量e垂直於超平面,因此e也垂直於超平面上的所有向量,這意味着e 和 A的兩個列向量的點積為0。
將二者歸納為一個矩陣方程:
矩陣方程已經去掉了關於 的信息,通過該方程可進一步求得估計值:
這就是最終結果了,它是由矩陣方程推導而來的,所以這個結果叫做“正規方程”。
還有一種更簡單的方式可以得到正規方程。Ax=b無解的原因是因為 A 是一個長方矩陣,只要在等式兩側同時乘以 AT,就可以把長方矩陣轉換成方陣,進而求解。
import numpy as np x = np.array([1.061, 1.094, 1.143, 0.922, 1.110, 1.156, 1.123, 1.020]) y = np.array([1.310, 1.350, 1.410, 1.140, 1.370, 1.425, 1.385, 1.260]) a1 = -(y / x) a2 = np.array([1] * 8) A = np.mat(np.array([a1, a2])).T b = np.mat(y).T x = (A.T * A).I * A.T * b print(x)
概率統計的視角
在實際應用中,我們把 J函數稱為“平方差損失函數”或“平方損失函數”,通過名字自然地聯想到概率統計中方差的概念。作為衡量實際問題的數字特征,方差有代表了問題的波動性,這里如何理解“波動性”呢?
大樓就在哪里,它的高度是一個真實值,假設這個值是100。接下來為了便於說明,我們把問題簡單化,假設小明只需要一次測量就可以計算出大樓的高度。
表中計算結果與真實值的差就是每次計算結果與真實值的波動,把每次波動累加起來就是整體的波動,也就是問題的“波動性”。 由於每次波動都有正有負,如果直接相加的話會正負抵消,得到波動性是0的結論,這顯然是荒謬的。解決這個問題的一個方法是每次波動都取絕對值,另一個方法是取波動的平方,平方不用考慮符號的問題,因此比絕對值更簡單。
現在可以計算出小明8次計算的總體波動和平均波動:
相比較而言,第3次、第5次、第6次計算結果的平均波動較小,看起來似乎應該只取這3次的測量結果。問題是,小明並不知道哪些結果是波動較小的。此外,根據“大樣本理論(large sample theory)”,在大樣本下,只要研究數據的漸進分布即可。簡單地說,只有當測量數據達到一定規模時才能得到較為正確的結果,數據越多會越好。比如乒乓球比賽偶爾會出現“爆冷”的場景,某個成績平平的外國選手戰勝了中國的頂尖選手,但你並不能因此說這名外國選手的實力更強,只能說在本次比賽中二者的波動都較大,外國選手打出了太多的“超級球”,而中國選手正好不在狀態;當二者的交手逐漸增多時,他們的平均波動也將趨近於各自的真實實力,中國選手自然會找回場子。
回到原問題,從概率統計的視角來看,最小二乘法的意義是讓所有樣本波動之和最小化:
如果在平方和基礎上除以測量的次數,則變成了讓樣本的平均波動最小:
最小二乘法與線性回歸
回歸(Regression)是一類重要的監督學習算法,其目標是通過訓練樣本的學習,得到從樣本特征到目標值之間的映射。在回歸中,樣本的標簽是連續值。線性回歸(Linear Regression)是回歸問題中的重要一類。在線性回歸中,樣本特征與目標值之間是線性相關的。
回歸的重要應用是預測,比如根據人的身高、性別、體重等特征預測鞋子的尺碼;根據學歷、專業、工作經驗等特征預測薪資待遇;根據房屋的面積、樓層、戶型等特征預測房屋的價格。
一元線性回歸
只有一個特征的線性回歸問題稱為一元線性回歸,其擬合曲線是一條直線,它的假設函數(hypothesis function)是:
我們的目標是根據給定的訓練樣本找出合適的模型參數,使假設函數變成明確的模型,從而使得該模型與訓練樣本達到最大的擬合度。
可以使用最小二乘法作為一元線性回歸的學習策略:
在機器學習中J稱為損失函數(cost function),這里m 是訓練樣本的個數,y 表示樣本的標簽,也就是真實結果。乘以1/m 的目的是為了使損失值不至於變得過大,以便更地直觀感受到模型的優劣。最小化損失函數的幾何意義是所有樣本到直線的函數距離最小化:
這里 x和y是已知的,而θ1和θ2才是未知的,雖然這里與小明在測量大樓時的公式有所不同,但是讓整體誤差到達最小的道理是一樣的。推導時需要對θ1和θ2求偏導,當m=1 時:
在求偏導時出現了系數2,為了約掉這個系數,通常在損失函數中除以2:
由此得到新的偏導:
推廣到 m個數據集:
令每個偏導的值都等於0,便得到了一個二元一次方程組,從而求得具體的模型參數。
多元線性回歸
我們比較熟悉的概念是二維平面和三維空間,有人說四維包含了時間、五維包含了靈魂……別信他的!空間的每一個維度都可以代表任意事物,這完全取決於你對每一個維度的定義。多維空間只是個概念,不要試圖在平面上通過幾何的方式描述四維以及四維以上的空間。
實際上多維空間很常見,關系型數據庫的表就可以看作一個多維空間,表的每個字段代表了空間的一個維度,下面就是一個十維空間的例子。
可以看到,維度的內容不僅僅包含數量,同樣可以包含文字,只是為了能夠計算,需要制定一些規則將文字轉換成數字。
在真實的世界中,訓練樣本的特征可能是成千上萬維,多元線性回歸通過一個超平面來擬合數據。不要試圖畫出超平面,實際上連四維空間都沒法有效地展示。畫不出來沒關系,能表達就好了,n維空間的超平面可以寫成:
如果用向量表示:
這就又變成了我們熟悉的直線方程。如果令 x0=1,可以更進一步簡化 :
在多元線性回歸中,我們依然使用最小二乘法的策略:
最終將求得:
作者:我是8位的
出處:http://www.cnblogs.com/bigmonkey
本文以學習、研究和分享為主,如需轉載,請聯系本人,標明作者和出處,非商業用途!
掃描二維碼關注公作者眾號“我是8位的”