機器學習(2)之正規方程組
上一章介紹了梯度下降算法的線性回歸,本章將介紹另外一種線性回歸,它是利用矩陣求導的方式來實現梯度下降算法一樣的效果。
1. 矩陣的求導
首先定義表示m×n的矩陣,那么對該矩陣進行求導可以用下式表示,可以看出求導后的矩陣仍然為m×n
這里要用到矩陣跡的特性,trace. 對於一個n階的方陣(n×n),它的跡(tr)為對角線元素之和:
1. 對於一個實數,它的跡即為它本身
tr a = a
2. 如果AB是一個方陣,那么
tr AB = tr BA
3. 由此可推導出
trABC = trCAB = trBCA
trABCD = trDABC = trCDAB = trBCDA
4. 假設A 和 B為方陣,a為實數,那么又可以推導出以下的特性:
trA = trAT
tr(A + B) = trA + trB
tr aA = atrA
5.對跡進行求導,具有以下特性:
2. Least squares revisited
現在就可以利用1中矩陣求導的相關知識來重新求解線性回歸問題。
假設訓練樣本:
定義目標集合:
因為,所以
又因為,根據最小二乘規則,代價函數可以寫成:
對J(θ)進行求導:
上述推導使用了第1部分的特性。
miniminzes J(θ) 即
3. 代碼實例
python代碼實現
1 # coding=utf-8 2 #!/usr/bin/python 3 4 ''' 5 Created on 2014年9月10日 6 7 @author: Ryan C. F. 8 9 ''' 10 11 import numpy 12 13 #Training data set 14 #each element in x represents (x0,x1,x2) 15 #x = [(1,0.,3) , (1,1.,3) ,(1,2.,3), (1,3.,2) , (1,4.,4)] 16 #y[i] is the output of y = theta0 * x[0] + theta1 * x[1] +theta2 * x[2] 17 #y = [95.364,97.217205,75.195834,60.105519,49.342380] 18 19 def linearRegression(X,Y): 20 A=numpy.dot(X.T,X) #XT*X X的轉置矩陣點乘X 21 Ai=A.I #(XT*X)-1 求逆 22 B=numpy.dot(Ai,X.T) #(XT*X)-1 XT 點乘 23 C=numpy.dot(B,Y.T) #((XT.X)-1)XT點乘Y 24 return C 25 26 if __name__ == "__main__": 27 X=numpy.matrix([[1,0.,3], 28 [1,1.,3], 29 [1,2.,3], 30 [1,3.,2], 31 [1,4.,4]]); 32 print X.transpose(); 33 34 Y=numpy.matrix([95.364,97.217205,75.195834,60.105519,49.342380]); 35 print Y; 36 37 print numpy.dot(numpy.dot(numpy.dot(X.T,X).I,X.T),Y.T) 38 39 print (linearRegression(X,Y))
輸出結果
1 X: 2 [[ 1. 0. 3.] 3 [ 1. 1. 3.] 4 [ 1. 2. 3.] 5 [ 1. 3. 2.] 6 [ 1. 4. 4.]] 7 8 Y: 9 [[ 95.364 97.217205 75.195834 60.105519 49.34238 ]] 10 11 linear Regression result: 12 [[ 98.10408328] 13 [-13.02877437] 14 [ 1.13281768]]